跳转到主要内容

VR开发之性能优化小技巧

demi 提交于

<a href="https://mp.weixin.qq.com/s/_-1LFCweEVwLLioL6LcggQ"><font color="#9a9a9a">来源:映维网</font></a>

虚拟现实是目前游戏行业最令人兴奋的领域之一。得益于Unity的开发平台,开发者和爱好者都能轻松将创意转化为可以吸引成千上万玩家的成熟游戏。YouTube频道“VR with Andrew”的主持人安德鲁·康奈尔(Andrew Connell)早前曾分享了一个<a href="https://www.youtube.com/channel/UCG8bDPqp3jykCGbx-CiL7VQ"><font color="#5196c1"><u>关于VR开发优化技巧的短视频</u></font></a>。另外,你可以对照视频参阅映维网整理的文字介绍:

在实现所述优化时,安德鲁建议参考Oculus的<a href="https://developer.oculus.com/documentation/unity/unity-perf/"><font color="#5196c1"><u>性能指南</u></font></a>,从而确保在开发应用程序时处于推荐的度量范围之内。

<style type="text/css">
.vide{position: relative;padding-bottom: 56.25%;height: 0;overflow: hidden;}
.vide iframe{position: absolute;top: 0;left: 0;width: 100%;height: 100%;}
</style>
<table width="100%" align="center"><tr><td class="vide"><iframe src='https://player.youku.com/embed/XNTE1MzU2MTE1Ng==&#039; frameborder=0 'allowfullscreen'></iframe></td></tr></table>
<br>

<font style="line-height: 40px;" color="#c200ff"><strong>1. LoD模型</strong></font>

LoD代表细节级别,指的是游戏中3D模型的复杂性。LoD可以随着模型远离玩家或根据其他度量(如对象重要性、视点相对速度或位置)而降低。

我们可以根据玩家与对象的距离在模型之间切换。然后我们对模型进行排序,使对象的细节随着与对象的距离增加而减小。在创建LoD时,它们的轮廓和外观应该相似,但在几何结构方面应该有足够的差异,以提高性能。额外的LoD模型不必手动创建,有大量的软件解决方案用于自动化创建过程。

<font style="line-height: 40px;" color="#c200ff"><strong>2. 几何锯齿</strong></font>

抗锯齿是指去除频率高于记录或采样设备能够正确分辨的信号分量。为了抑制这种情况,我们可以使用多重采样抗锯齿(MSAA)。首先选择渲染管道,然后导航到“质量”,再导航到“抗锯齿”并选择“4x”。这是成本和性能的最佳选择。

你可能会遇到镜面锯齿。高镜面反射级别或高光容易产生这种情况。对于这一点,没有直接的解决方法,但存在各种技术可以尽可能地将其最小化。这包括避免使用锐利边缘,选择光滑的圆形形状,并使用哑光材料。为了有效地使用这些技巧,最好尽早与你的美术交流。

<font style="line-height: 40px;" color="#c200ff"><strong>3. 纹理压缩</strong></font>

对于纹理压缩,最好使用ASTC,因为它提供了最佳质量的大小比。最好是以每个asset作为基础进行应用,这可以避免不必要的纹理数据,并提供更好的质量。

你同时可以参考下面这个图表:

<center><img width="600" src="http://imgtec.eetrend.com/files/2022-05/%E5%8D%9A%E5%AE%A2/100560005-25…; alt="VR开发之性能优化小技巧"></center><br>

<font style="line-height: 40px;" color="#c200ff"><strong>4. Mipmmapping</strong></font>

另一种技术叫做Mipmapping。这将基于初始导入的纹理创建一组较小的纹理,从而最小化纹理锯齿并提高性能,因为我们不使用额外的纹理数据。

你可以转到asset窗口中的纹理,然后转到高级设置以启用Mipmapping。Mipmapping对于纹理滤波非常重要。

<font style="line-height: 40px;" color="#c200ff"><strong>5. 纹理滤波</strong></font>

纹理滤波有三个选项:点、双线性和三线性。点意味着没有滤波。双线性将对最近的Mipmap进行采样。三线性则对最近的两个Mipmap进行采样,并将它们混合在一起以提供最平滑的过渡。启用纹理滤波的选项与mipmaps相同的设置窗口中。

对于VR,我们建议使用三线性。对于其他各向异性过滤,我们建议使用一个相当低的值,因为它在性能方面相当昂贵,而你应该将其保留给环境asset。

<font style="line-height: 40px;" color="#c200ff"><strong>6. 凹凸贴图</strong></font>

对于更粗糙、更复杂的纹理,你可以使用几种贴图方法。凹凸贴图最常见的形式是法线贴图,它适用于大多数用例。但对于VR来说,由于玩家视角的不断变化,普通贴图并没有那么有用。另外,在虚拟现实中,我们必须为每只眼睛渲染两个不同的图像(这个过程称为立体视觉)。在虚拟现实中,法线贴图的假象不像我们使用一个纹理渲染两个不同视点那样可靠。有一种更合适的贴图类型,其明为视差遮挡贴图,而我们可以使用高度贴图来实现它。这种类型的贴图考虑了玩家与曲面的角度。然而,这是一个相当昂贵的性能过程,应该谨慎使用,比如玩家近距离交互的对象。

<font style="line-height: 40px;" color="#c200ff"><strong>7. Light maps</strong></font>

阴影对于为场景添加深度至关重要。然而,它们同样是一次计算密集的过程,特别是对于移动设备而言。照明是一个同样复杂的主题,所以我们将重点关注照明静态对象。需要记住的一点是,与多个较小的纹理相比,处理较少和较大的纹理更为有效。

Arm已在Unity Asset Store发布了一个<a href="https://assetstore.unity.com/packages/vfx/shaders/dynamic-soft-shadows-… color="#9a9a9a">相关资源</font></a>,其可用于使用本地立方体贴图来创建动态软阴影。这是一个非常低成本的解决方案,所以如果你需要一个简单的解决方案,它肯定值得考虑。

<font style="line-height: 40px;" color="#c200ff"><strong>8. Banding alpha compositing</strong></font>

当我们不能在每个像素的位数内正确显示所需的颜色时,banding就会发生。这会导致颜色变化,而不是平滑渐变。克服这个问题的方法是启用色调映射或dithering。dithering会给图像添加噪点。

色调映射尝试将像素值从高动态范围(HDR)重新映射到低动态范围。这非常适合不支持HDR的屏幕。

<font style="line-height: 40px;" color="#c200ff"><strong>9. Alpha compositing</strong></font>

alpha compositing是一种将图像与背景结合起来以生成单个图像的技术。它主要用于foliage以减少锯齿。这是一个特别方便的方法,因为以前的抗锯齿工具在这种情况下可能无法工作。

<font style="line-height: 40px;" color="#c200ff"><strong>10. 颜色</strong></font>

最后,确保使用线性颜色空间,因为它非常与基物渲染(PBR;基于物理的渲染)配合使用。

<hr>
<font color="#9a9a9a">原文链接:</font><a href="https://community.arm.com/arm-community-blogs/b/graphics-gaming-and-vr-… color="#9a9a9a">https://community.arm.com/arm-community-blogs/b/graphics-gaming-and-vr-…;