UE4 X HTC Vive游戏开发笔记(二)

来源:互联网 发布:ubuntu如何安装福昕 编辑:程序博客网 时间:2024/06/05 23:47

UE4 X HTC Vive游戏开发笔记(二)


我来填坑了...优化其实上个星期就做的差不多了,但是因为各种原因一直拖到现在才写完这部分...(主要怪守望先锋...)

上一篇讲了如何定位瓶颈,那么接下来就是针对瓶颈进行优化。这里主要涉及渲染方面的优化,对VR游戏来说应该是目前最重要的部分。

用GPA抓帧的结果来看Valve文档中提到的几种优化方式UE4都已经实现了,最后显示在pc上的view应该是从左眼view中裁剪出来的,没有额外开销。那么基本上是要从游戏本身入手了。

优化的基本思路就是用GPU Profiler抓帧查看各部分的渲染开销,然后从耗时最久的部分开始一个个看能不能进行优化。

优化前大约为13-14ms,这里放一张优化后的profiler结果(优化前的已经找不到了....)

其实还有优化的空间,不过因为帧数达到了要求所以就先折腾别的去了...这里说一下我研究过的部分...

1.Screen Space Reflection

关于SSR,UE4的官方文档里没有做详细介绍。大致的做法是通过一个reflection ray,在depth buffer中trace看有没有hit到其它东西。如果有则用该点的颜色作为反射颜色。这个做法的缺点是如果物体不在屏幕内或者被遮挡就无法产生反射。
具体算法参考 casual-effects.blogspot.jp
cse.chalmers.se/edu/yea
UE4里的SSR有两个参数,Quality和Roughness。Quality应该主要控制ray-tracing过程的精度(step size)。Roughness在说明里写的是fadeness,应该是控制reflection精度用的。减少这两个值都能降低开销。建议取中间值兼顾效果和效率。 这里优化了大概1.8ms...

2. Lighting

UE4里的Lighting分为三种,Static、Stationary和Movable。

官方文档里的说明:

Static lights tend to have medium quality, lowest mutability, and the lowest performance cost.

Stationary lights tend to have the highest quality, medium mutability, and medium performance cost.

Movable lights tend to have medium quality, highest mutability, and the highest performance cost.

Static Lighting开销最小,效果最差,没有高光等效果。勾选了Use Lightmap Directionality and Per Pixel Normal能带normal map效果。选项在Mobile下面,默认勾选。关掉可以节约一些开销,从shader来看是可以减少一些instruction,如果是LowQuality还可以减少一次Sample,但是不知道为什么Mobile Stats里面看不出差别...没有NormalMap的材质或者手机上建议关掉。

Stationary效果最好,开销中等。这个描述其实比较概括,根据具体的情况也有开销更高的时候。Stationary Light的Indirect Lighting部分是将光照信息和阴影都烘焙到Lightmap上。对于Direct Lighting的光照部分渲染则跟Movable效果一样,都是用光照公式来实时计算。阴影方面,对于静态物体是采用事先生成的Distance Field Shadow Map,好处是即使分辨率低也可以有很清晰的影子并且没有额外的runtime开销。但是对于动态物体,则需要动态再去生成一张Shadow Map,然后每个物体再另外渲两个影子,一个是World投影到物体上的,还有一个是物体投影到World的,并且要和静态的Distance Field Shadow做混合。所以对于Stationary Lighting来说,渲染一个带阴影的动态物体的开销大于Movable Lighting,如果动态物体多的话开销反而更大,这时候建议还是用Movable Lighting。

另外需要注意的一点是,各个Stationary light的阴影信息是存在Shadow Map的各个通道里的,因为一张图只有四个通道所以当同一区域Stationary light数量大于5的时候多出来的会采用dynamic shadowing...

光照方面看场景和角色的具体需求来进行优化...这里通过删除一些作用不大的灯光,关闭某些动态物体的影子,将光照尽量改为静态等方式优化了2-3ms...


3. Post-Processing

对PC来说Bloom这些效果的开销不算大,基本上都是0.2ms搞定。AA稍微开销大点,为0.5ms。MSAA的话因为UE4是Deffered Rendering用不了(文章最后有一个链接,Oculus在UE4上实现了一个forward renderer,可以用MSAA)。然后AO如果是静态场景的话建议用烘焙的,不必要动态去计算。根据美术的需求来看需要用哪些后处理效果。

4. HZB SetupMips

Hierarchical Z-Buffer 是硬件上的一个优化,将场景的深度用多个分辨率来表示,用多分辨率的depth map可以更加效率的进行可见性检测。理论上这里不应该产生过多开销,但是实际在游戏中 HZB SetupMips 512的开销不稳定,有时候仅为0.1ms,有时候可以达到3-4ms...观察了一下似乎和视角和shadow有关。这一部分还不了解具体原因,UE4也没有找到相关文档,估计需要去翻源码了。

(更新:看了下代码..这部分其实是做了9次downsample..开销理论上是非常固定的。怀疑是UE4的统计方式有问题)


最后这里有个大杀器!

developer.oculus.com/bl

这篇Oculus的文章里面说他们在UE4上实现了一个forward renderer,在vr设备上有更好的表现并且不需要很多额外的迁移工作。从描述来看这个Renderer可以解决Deffered Renderer在vr设备上的很多问题,比如可以使用MSAA,减少带宽消耗,提升性能等等,并且只需要一个pass就可以渲染多个光源。他们在git上提供了源代码,我觉得非常值得研究一下。

(PS:文章里怎么才能设置段落缩进啊...发出去就对齐了看着好难受OTZ...)

原创粉丝点击