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

news2024/11/16 19:38:59

《鸣潮》基于虚幻引擎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.coloradmin.cn/o/1857638.html

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

相关文章

复习2-20240624

vscode 使用 Javabean (封装性) public class Demo01 {/*1.原则 : 字母 数字 $ _ 中文 除了 这五个 其它都不可以2. 细则 : 数字 不能 开头%hbviunh &hfiureh )nhjrn 7487j -ni hbiu tgf hi…

数据结构-顺序表的插入排序

顺序表的排序可以看作数组排序的拓展。基本逻辑和数组排序的逻辑大同小异。 由于顺序表中可以存放不同种的数据类型,进而和结构体排序又有相似之处。其中要注意的是(->)和(.)的区别。 -> 符号是针对指针进行的操…

Dubbo本地调试解决方案

有三种方式:原文链接 本文尝试使用了原作者推荐的第二种方式,在启动本地的服务时加入全局版本号的参数 -Ddubbo.service.versiontest同时需要修改消费者侧API的版本号。 DubboReference(version "test")private IContentPortraitService contentPortra…

MySQL字典数据库设计与实现 ---项目实战

软件准备✍:Mysql与Navicat可视化命令大全 ----项目实战 文章前言部分 目录 一.摘要 二.设计内容 三.项目实现 一.摘要 本项目关注于字典数据库表结构的设计和数据管理。通过现有的sql文件,实现system_dict_type和system_dict_data两个数据表。随后…

iptables(8)iptables自定义链

简介 我们在前文所介绍的所谓规则都是在默认链中定义的,当默认链中的规则非常多时,比如INPUT链中存放了300条规则,这300条规则有httpd服务、sshd服务的、服务的、私网IP的、公网IP的等等,那么如果我要修改某个服务的规则,例如修改sshd服务的规则,那么在这么多条规则中找到…

如何用IDEA(2024版)从github上拉取一个项目

前置要求: 确保你已经安装了 IntelliJ IDEA。确保你已经安装了 Git 工具并配置好了环境变量。确保你有一个 GitHub 账户,并且你想要克隆的仓库可以被你访问。 具体步骤: 1. 打开 IntelliJ IDEA 启动 IntelliJ IDEA。如果这是你第一次启动…

python tqdm显示程序运行的进度

import time from tqdm import * for i in tqdm(range(100)):if i%2 0:print("未曾清贫难为人,不经挫折永天真。")time.sleep(.1) #进度条每0.1s前进一次,总时间为1000*0.1100selse:print("回首向来萧瑟处,归去&#xff0…

RabbitMQ使用手册

SpringCloud微服务 什么是微服务 维基百科:微服务是一种软件架构风格,它是以专注于单一职责的很多小型项目为基础,组合出复杂的大型应用。 微服务拆分 拆分目标 高内聚:每个微服务的职责要尽量单一,包含的业务相互…

详解 | DigiCert EV代码签名证书

简介 DigiCert EV 代码签名证书是一种高级别的代码签名证书,它不仅提供了标准代码签名证书的所有安全特性,还增加了额外的身份验证流程,以确保软件开发者或发布者的身份得到最严格验证。这对于提升软件的信任度、防止恶意篡改和确保下载安全…

深入剖析Tomcat(十、十一) 详解StandardWrapper

《深入剖析Tomcat》第十章介绍了Tomcat的安全机制,主要就是对servlet的访问做安全验证,如果Tomcat中设置了某些servlet需要指定角色的用户才能访问,则需要客户端进行登录验证,如果用户名密码正确并且该用户拥有该角色的话&#xf…

Charles 显示内存不足解决方法

弹窗出现:Charles is running low on memory. Recording has been stopped. Please clear the session to free memory and continue recording. 官网解决方法: Charles runs out of memory After recording for a while Charles will run low on ava…

智能视频监控平台智能边缘分析一体机安防监控平台吸烟检测算法应用场景

智能边缘分析一体机吸烟检测算法是一种集成了先进图像处理、模式识别和深度学习技术的算法,专门用于实时监测和识别公共场所中的吸烟行为。以下是关于该算法的详细介绍: 工作原理 1、视频采集: 通过安装在公共场所的摄像头,实时…

js实现拖拽排序

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>拖拽排序</title><style>* {margin: 0;p…

成为一个NB程序员,必看的5大定律!

请把这篇文章读进脑子里去&#xff0c;且在现实中用起来 除了超有意思也真的能“镀金”~~ 顺便吆喝一声&#xff0c;如果你计算机、软件工程、电子等相关专业本科及以上学历&#xff0c;欢迎来共事。前后端/测试​均可投&#xff0c;技术大厂。 定律一&#xff1a;晕轮效应 又…

头歌——机器、深度学习——手写体识别

第1关&#xff1a;神经网络基本概念 任务描述 本关任务&#xff1a;根据本节课所学知识完成本关所设置的选择题。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.神经网络基本概念。 神经网络基本概念 神经网络由输入层、隐藏层、输出层组成&#xff1b;…

IS022000与HACCP:提升食品安全管理的完美结合

国际标准化组织&#xff08;ISO&#xff09;于2005年9月发布了IS022000:2005标准&#xff0c;这是一项针对食品安全管理体系的国际标准。我国以等同采用的方式制定了国家标准GB/T 22000-2006《食品安全管理体系食品链中各类组织的要求》&#xff08;以下简称“GB/T22000”&…

# Kafka_深入探秘者(4):kafka 主题 topic

Kafka_深入探秘者&#xff08;4&#xff09;&#xff1a;kafka 主题 topic 一、kafka 主题管理 1、kafka 创建主题 topic 命令 1&#xff09;命令&#xff1a; # 切换到 kafka 安装目录 cd /usr/local/kafka/kafka_2.12-2.8.0/# 创建一个名为 heima 的 主题 bin/kafka-topic…

Java项目:基于SSM框架实现的电子竞技管理平台【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的电子竞技管理平台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能…

最新AI智能聊天对话问答系统源码(图文搭建部署教程)+AI绘画,文生图,TTS语音识别输入,文档分析

一、人工智能语言模型和AI绘画在多个领域广泛应用 人工智能语言模型和AI绘画在多个领域都有广泛的应用。以下是一些它们的主要用处&#xff1a; 人工智能语言模型 内容生成 写作辅助&#xff1a;帮助撰写文章、博客、报告、剧本等。 代码生成&#xff1a;自动生成或补全代码&…

python项目加密和增加时间许可证

1.bat&#xff0c;执行如下的命令&#xff0c;第一句是更新或增加许可证 第二句是加密draw_face.py python offer.py pyarmor obfuscate -O dist draw_face.py绘制自制人脸.py&#xff0c;调用加密的代码draw_face代码 import sys import os import cv2# 添加加密模块所在的路…