《鸣潮》基于虚幻引擎4的多平台效果和性能优化实践
《鸣潮》基于虚幻引擎4的多平台效果和性能优化实践前言今年的UOD分享录播在陆续放出,考虑到学习以及归档的必要,开一个简单的小专栏来记录下自己的学习吧。
[UFSH2023]《鸣潮》基于虚幻引擎4的多平台效果和性能优化实践 | 王宏波 库洛游戏_哔哩哔哩_bilibili
首先是鸣潮今年的分享吧,主讲人是王宏波老师,之前我也看过他在Unreal Circle里面对于PureTS的优化分享,讲的也非常的好。
为什么使用Defer Shading
性能考虑 (应该是从Shader变体,光照计算等角度分析之后的结论)
方便做一些后处理效果 (例如GTAO, SSR)
统一多平台,毕竟桌面端肯定是延迟管线
AA做法首先王宏波老师说了下根据去年UOD的统计数据,NPR游戏对屏幕空间的边缘像素占比会到4%-5%,而传统PBR游戏一般会在1%~2%,所以AA这方面会成为卡渲质量的一个重要技术点。
下图是他们所分享的自研TAA流程。
这里是额外加了一个Velocity的Pass并且从TAA变到的TAAU,即多了一个UpSample的过程,这里同时还说了一个我比较感兴趣的点,作者讲到TAA Pass的 ...
Rendering God of War Ragnarok
Rendering God of War Ragnarok前言演讲的主持人是在2020年作为渲染的主程序加入Santa Monica的,在这之前是FarCry的项目组工作。刚来的时候渲染组里有6个人,之后随着项目的增长加到了10个人。
同时他也强调了自己其实是在开放世界项目的经验较为丰富,对这种线性叙事的游戏开发并不是很熟悉。
Jira首先上来讲了个项目管理工具,我表示直接跳过,对我这种大头兵暂时没有什么帮助。感兴趣的可以点下面的链接。
Jira | Issue & Project Tracking Software | Atlassian
需要解决的问题总的来看需要解决的问题分为4个部分
Narrative Features
Visual Improvement and Art workflow
PlayStation 5 Enhancement
Helping Ourselves
Narrative Features (我该怎么翻译这个东西)
Snow and Ice
在前作里面虽然有雪,但是雪的深度并不够深,无法体现芬布尔之冬,不过他这里没有解释这套新的雪 ...
Vulkan MultiThread Tips
Vulkan MultiThread TipsVulkan RenderPass 整体的执行流程
Vulkan多线程压力分析When one of the render passes in the application contains a lot of draw calls, such as the gbuffer pass, for CPU submission efficiency it’s important to split the draw calls into multiple groups and record them on multiple threads. There are two ways to do this:
Record primary command buffers that render chunks of draw calls into the same framebuffer, using vkCmdBeginRenderPass and vkCmdEndRenderPass; execute the resulting command bu ...
大世界渲染基础
地形,大气,以及云的渲染系统地形渲染方案地形管理
根据视距来进行地形的Tessellation,远处的三角形网格密度低而近处高。
而至于具体的Subdivision方法,可以分为如下
Triangle Based Subdivision
QuadTree-Based Subdivision
这里关键的一点是要明白T-Junction是什么,该怎么解决。
材质采样
这里要注意TextureArray和3D Texture的区别,不过TextureArray的cache miss率较高,有点费。
Virtual Texture
当前一统天下的方案,大部分现代地形的管理都是通过Virtual Texture来进行。
私货
天空以及大气渲染在做这方面的渲染时,一定要注意到天空和云要分开来考虑。
光与介质的交互方式
Volume Rendering Equation
Scattering Type
Rayleigh Scattering : 当参与散射的粒子直径远小于光的波长的时候,波长越短的光自然反射的越厉害,即反射的大部分是蓝光以及紫光。
$\lambda: 波长,h:海 ...
后处理调研
后处理调研相关论文和博客
Post-processing Effects on Mobile: Optimization and Alternatives
https://community.arm.com/arm-community-blogs/b/graphics-gaming-and-vr-blog/posts/post-processing-effects-on-mobile-optimization-and-alternatives
Bandwidth Efficient Rendering ARM — 这篇不错,讲述了移动端下的渲染优化应该怎么做
HDR 管线研究Volumetric Fog And God RayUE4:三种圣光 God Rays 的做法
[技巧分享] 体积雾圣光 | God Rays Using Volumetric Fog(官方汉化)_哔哩哔哩_bilibili
(1) Geometry Material : 利用模型和材质在需要进行GodRay的地方进行放置,较为简单,但是看起来会比较廉价。
(2) LightShafts : 调整光源属性中L ...
Unreal中游戏线程和渲染线程的同步
游戏线程与渲染线程的同步众所周知的是Unreal分为游戏线程和渲染线程,
Memory consistent and coherent
缓存的写回策略高速缓存(Cache)是一种将数据副本临时存储在可快速访问的存储内存中的技术。缓存将最近使用的数据存储在小内存中,以提高访问数据的速度。它充当 RAM 和 CPU 之间的缓冲区,从而提高处理器可用数据的速度。
每当处理器想要写入一个字时,它都会检查它想要写入数据的地址是否存在于缓存中。如果地址存在于缓存中,即写入命中(Write Hit)。
我们可以更新缓存中的值并避免昂贵的主内存访问。但这会导致数据不一致(Inconsistent Data)问题。由于高速缓存和主存都有不同的数据,如在多处理器系统中,这将导致两个或多个共享主存的设备出现问题。
而写回策略一般来讲分为两种
写回(Write Back) : 当CPU对cache写命中时,只修改cache的内容不立即写入主存,只当此行被换出时才写回主存。这种策略使cache在CPU-主存之间,不仅在读方向而且在写方向上都起到高速缓存作用。对一cache行的多次写命中都在cache中快速完成修改, 只是需被替换时才写回速度较慢的主存,减少了访问主存的次数从而提高了效率。为支持这种策略,每个cache行必须配置一个修改位,以反 ...
编译Unreal时遇到的一个小问题记录
Toolchain Error Generating Project Files for VS 2022Unreal的构建系统是由C#来进行支持的,当我们拉取完Unreal的源码后,我们只要按照官方的指示走,在99%的情况下都不会出大问题。不过这次我却稍微碰到了一个从来没有看过的情况。
Unable to find valid latest C++ toolchain for VisualStudio2022 x64
报错提示为无法找到Visual Studio的C++工具链,当然实际上我清楚我的工具链是没有问题的,因为我已经用这套工具链用了很长时间,从来没有出现过类似的问题,故问题一定是在Unreal的build tool上,在互联网冲浪了一番后,我在官方论坛里面找到了答案。
https://forums.unrealengine.com/t/toolchain-error-generating-project-files-for-vs-2022-ue-5-1/750069
简单来说,当Unreal进行工具链检索时,它默认只会搜索Latest版本的工具链来进行构建,如果你的Vis ...
一次奇妙的Vulkan Debug经历
畏惧Vulkan吧最近在跟着官方的Tutorial学Vulkan,不得不说深感其琐碎与复杂,画一个完整设置的三角形就需要大概1000行代码,这在传统的图形API上是难以想象的。但另一方面在画完三角形后,我又感觉自己打通了任督二脉,觉得自己好像抓住了这套渲染流程的精髓。于是在我加入Depth Buffer进入到3D世界时,就发现了一个奇妙的问题。
你可能会问,你这是传了个什么图上来,怎么是全黑的。是的,我也想问,为什么是全黑的,为什么我加了个深度测试后就变成全黑了,起初我是以为我的pipeline的配置写的有问题。
12345678910vk::PipelineDepthStencilStateCreateInfo depthStencilStateCreateInfo;depthStencilStateCreateInfo.setDepthTestEnable(true) .setDepthWriteEnable(true) .setDepthBoundsTest ...
CP中的一些小技巧
从Codeforces里面学到的一些小Trick本文主要是来自Codeforeces里面的一篇博客。
PSA: don’t use these functions unless you really, really need to
计算$\frac{a}{b}$向上取整, 直接用 (a + b - 1) / b, 不要用ceil((double) a / (double) b)
计算正整数根号,不要直接使用sqrt,转而使用二分(其实这条我并不是很理解,按理说现代的sqrt的性能是没问题的,会直接翻译到硬件指令)
12345678910// works for at least up to (2**31 — 1)**2long long int_sqrt (long long x) { long long ans = 0; for (ll k = 1LL << 30; k != 0; k /= 2) { if ((ans + k) * (ans + k) <= x) { ans += k; ...