鸣潮基于虚幻引擎4的多平台效果和性能优化实践

《鸣潮》基于虚幻引擎4的多平台效果和性能优化实践 | 王宏波 库洛游戏

文章目录

  • 《鸣潮》基于虚幻引擎4的多平台效果和性能优化实践 | 王宏波 库洛游戏
    • Why Deferred Shading
    • 移动端高质量的TAAU
      • 渲染流程
      • Ghost和Flicker优化,一些图像空间算法的融入
      • 动静态像素的差异处理
      • TAAU之Upscale简介
    • 从One Pass Deferred Pipeline到One Pass Uber Pipeline
      • 渲染管线简介
      • OPDS在MALI上的指令异常(第一个坑)
      • From OPDS Pipeline to One Pass Uber Shading Pipeline
      • OPDS在Adreno GPU GLES 下的写带宽异常(第二个坑)
    • 树的双端方案
      • 整体方案
      • Billboard Tree
      • Imposter Tree
      • Dynamic Texture Array & Streaming
      • 其他优化

更多参考文章: UE TAAU详细解析 - 知乎 (zhihu.com)

Why Deferred Shading

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选了Deferred Shading之后AA只能选后处理AA了

AA之前:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

移动端高质量的TAAU

渲染流程

增加了Velocity Pass,把TAA Pass变为了 TAAU Pass

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Ghost和Flicker优化,一些图像空间算法的融入

Ghost问题优化:

同时实现这三种模式。低配置上会选RGB颜色空间来做,而高配置会选YCocg来做

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一部分是关于速度,速度编码到了24位的一个RGB里去了。第二部分是记录遮罩是不是角色的,这样更不容易产生鬼影和染色问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为没有把勾边Pass渲染Velocity Buffer,这样会导致角色上有很多黑边,在做TAA的时候Character Mask判断它不是角色的一个像素。对卡渲来说,渲染一个角色要五六遍。蒙皮更严重,每一次渲染都需要蒙皮两次,因为需要上一帧的位置和当前帧的位置才能得到它的速度。所以去掉了Velocity Buffer勾边渲染。去掉之后会导致角色边缘闪烁的比较厉害。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Flicker问题优化:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

动静态像素的差异处理

尝试一:使用运动速度插值动态静态两套权重

最终权重是根据Velocity的值的大小进行插值的。像素运动越快,当前帧的权重就越大。像素运动越慢,当前帧的权重就越小。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尝试二:图像的锐化算法

主要是为了处理动态像素。例如Unsharp Masking Kernel。它也是十字星的采样,所有可以重用之前的采样数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

TAAU之Upscale简介

一般图像在做上采样的时候,考虑的是目标像素到原像素的距离来做一个权重的插值。但是FSR等除了考虑这个距离,还会考虑原像素本身的一些情况。Lanczos2用的是多项式的一个逼近。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总结及其他的一些优化和结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

混合方案:实现了经典TAA算法,同时又融入了一些图像处理的方式与方法

从One Pass Deferred Pipeline到One Pass Uber Pipeline

渲染管线简介

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GBuffer的结构:

第一版:三张GBuffer+一张SceneColor+一个DepthBuffer (Depth Fetch获取深度信息)

三种材质Scene Color存的都是自发光;GBufferA存的是法线、LightFunction(做云层投影用)和一个通道的卡渲信息;GBufferC存的是BaseColor和AO的信息;GBufferB每种都不太一样,存的是一些特化的信息

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

OPDS在MALI上的指令异常(第一个坑)

上面方案在arm的mali gpu的测试结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

发现三个灯光pass的指令数都非常高,FPK失效。进一步分析发现是Depth Fetch的问题会导致FPK失效(从1.2兆变为0.01兆)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

From OPDS Pipeline to One Pass Uber Shading Pipeline

上述问题的解决方案 - 混合方案:OPDS+Forward前向卡通渲染+Gbuffer重新编码(把原来的depth编码到GbufferB里面去)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最终放在了Lighting Passes之后

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

OPDS在Adreno GPU GLES 下的写带宽异常(第二个坑)

发现是引擎RHI实现有个小的Bug导致的(UE4才有的问题,UE5没有)

只对SceneColor和Depth生效,会把GBuffer三张都给Resolve出来

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

修改后:所有的RT和Depth都是可以Discard掉的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

测试带宽结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

树的双端方案

多平台适配框架简介:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

整体方案

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Billboard Tree

把原来插片树的面向相机的每一丛树叶都变成一个billboard来替代

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

测试结果:Billboard树只要30%~40%的面片占用就可以达到插片树效果的还原,但是阴影会跟着相机转动。渲染的时候让阴影面向光源而不是面向相机就可以解决。

Imposter Tree

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Imposter树原理:围绕模型放一圈相机去拍这个树,记录树的一些基本渲染信息,渲染的时候通过相机的方向去采一些最接近当前相机方向的离线渲染出来的信息去做信息合成,最终生成当前相机下应该出现的样子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Dynamic Texture Array & Streaming

扩展了UE默认的Texture Array做成了动态Texture Array,可以按需增加Slice进来

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Depth还原:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

光影效果对比:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

蓝色效果为Imposter树,其他为模型树

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

优化结果测试:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其他优化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/34524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三代全智能AI无人直播系统:销售变现的革新利器

随着科技的飞速发展,人工智能(AI)已经(keJ0277)逐渐渗透到我们生活的方方面面。特别是在直播销售领域,第三代全智能AI无人直播系统的出现,正成为销售变现的革新利器,引领着行业的新一轮变革。一、全智能AI无…

mysql数据库的管理

MySQL数据库管理 mysql数据文件 存放在初始化时定义的datadir 该目录下放置三种后缀文件 .frm 与表相关的元数据(meta),表结构的定义信息等。 .MYD mylSAM存储引擎专用 .MYI mylSAM存储引擎专用 MySQL语言类型 DDL(数据定义语言…

App推广新突破!Xinstall无注册码方案,一键解决您的获客难题

在互联网的浪潮中,App推广与运营面临着前所未有的挑战。随着流量红利的衰退,如何高效、精准地触达用户,提升用户留存和转化率,成为每个企业都必须面对的问题。在这个关键时刻,Xinstall以其无注册码的解决方案&#xff…

使用vant4+vue3制作电商购物网站

一、前言 1.本项目基于vant4vue3构建,默认友友们已具备相关知识,如不具备,请友友们先去了解相关该概念 2.项目数据来源于开源框架 新峰商城 在此指出 3.此项目目的在于帮助友友们了解基本的用法,没有涉及太多的逻辑操作。 二、…

针对AIGC检测的鲁棒性测试——常见攻击手段汇总

前言:这篇文章来总结一下针对AIGC检测的常见攻击手段,选取的研究工作均出自近5年AIGC检测相关文章。(论文被拒了需要补实验,先来看看别人怎么做的……) 2019 WIFS Detecting and Simulating Artifacts in GAN Fake Ima…

JavaScript的学习之事件的简介

目录 一、事件是什么 二、如何处理事件 一、事件是什么 定义:事件就是浏览器和用户之间的交互行为。 例如:点击按钮、鼠标移动、关闭窗口等。 二、如何处理事件 我们可以在对应的事件属性中设置一些JS行为,当事件触发的时候会将这些代码执行…

35岁,是终点?还是拐点?

35岁,是终点还是拐点,取决于我们对生活和事业的态度、目标以及行动。这个年龄可以看作是一个重要的转折点,具有多重意义和可能性。 很多人在35岁时,已经在自己的职业生涯中建立了一定的基础,可能达到了管理层或专家级别…

Charles抓包工具系列文章(二)-- Repeat 回放http请求

一、什么是http请求回放 当我们对客户端进行抓包,经常会想要重试http请求,或者改写原有部分进行重新请求,都需要用到回放http请求。 还有一种场景是压力测试,对一个请求进行重复请求多少次,并加上适当的并发度。 这里…

WebStorm 配置 PlantUML

1. 安装 PlantUML 插件 在 WebStorm 插件市场搜索 PlantUML Integration 并安装,重启 WebStorm 使插件生效。 2. 安装 Graphviz PlantUML 需要 Graphviz 来生成图形。使用 Homebrew 安装 Graphviz: 打开终端(Terminal)。确保你…

C语言小例程28/100

题目&#xff1a;利用递归方法求5!。 程序分析&#xff1a;递归公式&#xff1a;fnfn_1*4! #include <stdio.h>int main() {int i;int fact(int);for(i0;i<6;i){printf("%d!%d\n",i,fact(i));} } int fact(int j) {int sum;if(j0){sum1;} else {sumj*fac…

闪迪sd卡视频格式化数据恢复方法,你了解吗

咨询&#xff1a;“我不小心将闪迪SD卡格式化了&#xff0c;里面的重要视频文件全都不见了。我感到非常焦虑&#xff0c;因为这些视频对我来说意义非凡。现在急需找到方法来恢复&#xff01;&#xff01;” 在数字时代&#xff0c;SD卡已成为我们日常生活中不可或缺的数据存储设…

python中数据的作用域

一、命名空间 在 Python 中&#xff0c;命名空间是一个系统&#xff0c;它用于确保名字的唯一性&#xff0c;并防止命名冲突。命名空间是一个存储变量名称&#xff08;或者更广泛地说&#xff0c;标识符&#xff09;与对象之间映射的抽象概念。每个变量名你在程序中创建&#x…

msvcp120.dll丢失怎么办,找不到msvcp120.dll的多种解决方法

最近&#xff0c;我在运行一个程序时遇到了一个错误&#xff0c;系统提示找不到msvcp120.dll文件&#xff0c;无法继续执行代码。这让我感到非常困扰&#xff0c;因为这个问题导致我无法正常运行这个程序。经过一番搜索和尝试&#xff0c;我找到了几种修复这个问题的方法&#…

如何开发、使用 Starter

开发 第一步&#xff1a;创建starter工程hello-spring-boot-starter并配置pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchem…

SpringBoot优点达项目实战:项目初始化(一)

SpringBoot优点达项目实战&#xff1a;项目初始化&#xff08;一&#xff09; 文章目录 SpringBoot优点达项目实战&#xff1a;项目初始化&#xff08;一&#xff09;1、项目介绍2、项目搭建3、依赖导入4、数据准备 1、项目介绍 技术框架 SpringbootmybatisPlusvueknife 2、项目…

创建App

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Django项目中&#xff0c;推荐使用App来完成不同模块的任务&#xff0c;通过执行如下命令可以启用一个应用程序。 python manage.py startapp app…

RT-Thread的Finsh实现学习

学习原因 工作中&#xff0c;使用同事开发的调试软件&#xff0c;输入参数打印的函数名就可以打印参数&#xff0c;但看不到代码实现&#xff0c;只能用自己微薄的知识积累去猜一下&#xff0c;之前尝试过&#xff0c;专门写一个函数&#xff0c;去解析编译生成的map文件&#…

名侦探李先生第一话:谁是真正的凶手(只出现一次的数字相关题解(力扣)+位操作符回忆)

引子&#xff1a;我们在之前的案子中破解过基础的单身狗问题&#xff0c;那面对更有挑战的案子&#xff0c;且看李先生如何破局&#xff0c;那下凶手&#xff01; 复习&#xff1a; 1&#xff0c;位操作符&#xff1a; 正整数原&#xff0c;反&#xff0c;补码都相同 首位是…

RocketMQ如何添加JVM监控

这里是小奏,觉得文章不错可以关注公众号小奏技术 JVM监控选型 本次JVM监控我们采用prometheus官方提供的jmx_exporter来实现 RocketMQJVM开发 整体目录 1. 新增agent目录 我们在distribution目录新增一个agent模块&#xff0c;然后添加两个文件 jmx_prometheus_javaagent-…

NtripShare2024年第二季度主要技术进展

NtripShare Cloud GNSS解算云平台方面 1、解算引擎增加根据卫星多路径效应自动剔除卫星的算法。 2、解算引擎增加解算时间段限制&#xff08;发现贵州某地在晚12点周期性效果变差&#xff09;。 3、增加2000坐标至地方坐标系转换的支持(七参数、四参数、TGO高程拟合&#x…