鸣潮基于虚幻引擎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(数据定义语言…

2024.06.24【读书笔记】丨生物信息学与功能基因组学(第十八章 人类疾病 第二部分)【AI测试版】

第二部分:人类遗传疾病的生物信息学方法 章节标题:【读书笔记】丨生物信息学与功能基因组学(第十八章 人类疾病 第二部分) 摘要: 第二部分聚焦于如何利用生物信息学方法来研究人类遗传疾病。随着生物信息学的发展,我们能够通过计算工具和数据库来分析蛋白质、基因和基…

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

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

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

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

软件设计师笔记-系统开发和运行知识(二)

模块 构成模块(或称为组件)的四个基本要素:输入和输出、处理功能、内部数据、程序代码。 输入 (Input): 输入是模块从外部接收的数据、信号或指令。这些输入数据可以是用户通过用户界面输入的,也可以是从其他模块或系统传递过来的。输入数据的类型、格式和范围对模块的功能…

Java中的安全架构设计与实现

Java中的安全架构设计与实现 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来聊聊Java中的安全架构设计与实现。随着互联网技术的不断发展&#xff0c…

magisk获取root

使用magisk修补boot.img 一定是手机系统匹配的 boot.img 刷入手机的 /storage/emulated/0/Download/ adb push "E:\下载\boot.img" /storage/emulated/0/Download/ 使用 magisk 点击安装, 有Recovery 取消勾选 选择 修补一个文件, 选择手机下…

零基础CMake学习笔记

零基础CMake学习笔记 1. 名词解释make cmake Makefile CMakeLists.txt 2. CMake语法介绍2.1 常用指令2.1.1 project2.1.2 set2.1.3 message2.1.4 add_executable2.1.5 aux_source_directory2.1.6 include_directories2.1.7 add_definitions2.1.8 add_subdirectory2.1.9 add_lib…

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

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

JavaScript的学习之事件的简介

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

关于Pandas的数据填充

前言 在数据分析与预处理过程中,脏数据几乎不可避免,这直接影响到后续分析的准确性和可靠性。清洗数据中最常见的就是处理空值。Pandas DF的数据填充功能非常强大。本文介绍Pandas中常用的几种数据填充(也称为缺失值处理)方法&am…

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

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

Python量化交易学习——Part8:带有技术因子指标的多因子策略

技术面分析又称技术分析(Technical Analysis ),是股票投资分析的专业术语。技术分析研究以往价格和交易量数据,进而预测未来的价格走向。此类型分析侧重于图表与公式的构成,以捕获主要和次要的趋势,并通过估测市场周期长短,识别买入 / 卖出机会。根据您选择的时间跨度,…

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

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

【PythonWeb开发】Flask视图函数传递数据到前端模版的方法总结。

在Flask框架中,视图函数返回响应有四种常见方式,都得掌握。 一、返回文本内容 可以直接返回字符串,Flask会自动将其转换为一个响应对象,具有默认的text/html内容类型。 app.route(/return_text) def return_text():return "…

力扣第211题“添加与搜索单词 - 数据结构设计”

关注微信公众号 数据分析螺丝钉 免费领取价值万元的python/java/商业分析/数据结构与算法学习资料 在本篇文章中,我们将详细解读力扣第211题“添加与搜索单词 - 数据结构设计”。通过学习本篇文章,读者将掌握如何实现一个支持通配符搜索的字典数据结构&…

WebStorm 配置 PlantUML

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

java的Nio演进

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 java的Nio演进 前言简介正文总结 前言 在JDK1.4推出JavaNIO之前,基于Java的所有Socket通信都采用了同步阻塞模式 (BIO),这种一请求一应答的通信模型简化了上层的应用开发,但…

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…