实时丝滑度|D5大场景承载力和交互体验

所见即所得的交互体验是 D5渲染器的核心价值所在。D5 GI 技术为实时渲染的性能提供了保障,但随着场景复杂程度的增加,渲染开销会逐渐增大,实时预览帧数会不可避免地降低。

在场景面数极多,有大量灯光和大量材质的情况下,D5 是否还能够保证实时预览的帧率和对操作的响应速度,是关乎用户使用体验的大课题。

一、模型加载优化

很多三维模型资产不仅面数极多,并且由无数个子对象组成,降低渲染效率,D5 渲染器会自动合并特定种类资产的模型,将多个小模型合并成大模型,减少 DrawCall*,提升运行效率。

自 D5 2.0 版以来,模型被加载为效率更高的多边形渲染方法,这一改进大大提高了实时性能,2.0 版相对于 1.9 版的实时帧率和响应速度有了明显的提升。

*DrawCall: CPU 向 GPU 发送一次渲染命令,便称为一次 DrawCall,DrawCall数量过多,会造成GPU长时间等待,降低渲染效率。

二、材质纹理优化

新版 D5 渲染器使用 Texture Streaming(纹理流送)技术,动态加载纹理贴图,确保只有在摄影机看到材质纹理的时候才会加载,其他纹理暂时保存在磁盘上。此项技术配合 mipmap 可以保证材质纹理在任意距离都看起来刚刚好,并且开销最小。

经对比试验,开启纹理流送后,无论是显存占用还是内存占用都有所降低,帧率有轻微提升。一些特定场景,显存占用节省了40%以上(由11G下降为6.2G)。

三、多灯场景优化

通常来说,场景中光源越多,实时预览就会越卡顿(帧率下降)。

如下这个夜景场景中,有几百盏光源。

老版本的缺点在于:在计算着色的时候,不能根据灯的数量动态分配显存,所以必须预先根据灯的上限数量(如:1024 盏灯)分配内存,而且,画面的分辨率越高,显存的开销就越高,这对实时预览的性能带来了挑战。

为了解决这个问题,D5 优化了对灯光采样的策略,先是把 1024 盏灯分成一个一个的小组,计算每个小组的灯光总亮度,再去进一步采样对场景贡献较大的灯组中的具体灯光,经过这样的优化,场景在灯光上限达到 1024 盏灯的时候,计算 GI 的开销由 23.84 毫秒 下降为 11.54 毫秒,显存占用减少了 150M 左右。

四、GI 算法的优化

新版 D5 GI 采样算法的优化,对于大场景同样也会有运算效率的提升,2.1 版在反射运算中有2-4倍的效率提升,GI 计算有不到4倍左右的效率提升,这就是为什么相同场景下,D5 2.1 版的帧率永远高于 2.0 版。

D5 “丝滑度”总结

丝滑度包含两个指标:

  1. 用户鼠标点击用户界面发出命令后到 D5 视口预览做出第一帧响应的时间。
  2. 视口动态变化时,实时渲染的帧率。

下图是 D5 1.9 版和 D5 2.1 版“丝滑度”的对比:

解析:左右同时点击鼠标切换场景,可以看到右侧新版 D5 响应指令的速度明显优于旧版(右侧永远比左边先动),同时,在晃动镜头时,新版帧率大约提升了接近一倍。