【问题标题】:Unity 3D FPS mobile game performance. [Low fps]Unity 3D FPS手游性能。 [低帧率]
【发布时间】:2020-07-02 19:23:46
【问题描述】:

我在 Unity 3D 中为 Android 设备制作了一个游戏,我是 3D 的初学者。

即使我使用最快的质量,我在移动设备上也存在性能问题(fps 非常低)。那么,你会建议我做些什么来提高 fps 呢?

【问题讨论】:

  • 从您提供的屏幕截图中,我可以看出您正在以 >60fps 的速度运行,并且大部分时间都花在等待(WaitForTargetFPS)上,所以我在这里看不到任何性能问题。您能告诉我们这些问题是什么时候出现的吗?
  • 游戏开始时,如果我看地面,fps 是 50-60,但当我看建筑物时,fps 是 10-20。
  • 所以在 fps 低的时候截屏,这样我们就可以看到需要这么多时间了。我怀疑要么是你的建筑物有太多的多边形,要么是你有太多的纹理。

标签: unity3d


【解决方案1】:

这些是您可以在 Unity 中考虑的事项列表,以提高您的游戏性能。

1- 静态批处理

您的场景中可能有大量静态几何体,例如墙壁、椅子、灯光和永不移动的网格。在编辑器中将它们标记为静态。请务必将它们标记为静态光照贴图,以便获得烘焙光照贴图纹理。标记为静态的对象可以批处理到一个组合网格中,而不是对每个单独的对象进行绘制调用。静态批处理有一个关键要求:所有对象必须使用相同的材​​料。如果您有木质材质的静态墙和钢材质的静态椅子,则墙壁将被分批成一个带有一个组合网格的绘制调用,而椅子则在一个单独的绘制调用中使用它们自己的单独网格。

2- 纹理贴图

如前所述,每种材质都会引发一次绘制调用。您可能会认为木门和钢椅可能需要不同的材料,因为它们使用不同的纹理。但是,如果它们可以使用相同的着色器,则可以使用纹理图集创建两个对象都可以使用的一种材质。纹理图集只是一个包含所有较小纹理的较大纹理。您可以让一种材质仅加载一种纹理,而不是使用数十种材质加载数十种纹理。每个对象都可以映射为使用地图集上不同坐标上的纹理。您可以在您的艺术管道中手动执行此操作,但我发现 Juan Sebastian 的 Pro Draw Call Optimizer 非常有用。它会自动生成纹理图集并交换新对象,而不会弄乱您的资产。

3- 动态批处理

移动非静态对象可以动态批处理到单个绘图调用中。我注意到这是 CPU 密集型的,并且是在每一帧上计算的,但这是一个很好的优化。这仅适用于使用相同材质的顶点少于 900 个的对象。使用纹理贴图为您的动态对象创建单一材质,您可以获得便宜的动态批处理!

4- LOD

LOD 组是一种提高性能的廉价方法。使用具有多个 LOD 的资产并为远离相机的对象渲染较低细节的几何体。当相机靠近时,Unity 可以在每个 LOD 之间自动淡入淡出。

5- 填充率、透支和剔除

这涉及到一个我不太熟悉但值得关注的话题:减少过度绘制,其中最远的对象首先被绘制到一个像素,然后重新绘制像素,每个更近的对象都在顶部。这对于普通的 1080p PC 显示器来说不是什么大问题,但对于具有超高分辨率显示器的 VR 和移动设备来说却是一个重大问题。大量的透支加上大量的像素会扼杀你的填充率。纹理过滤是 GPU 中的关键限制指标之一。一些解决方案提供了开箱即用的遮挡剔除和截头剔除。截锥体剔除不会渲染相机截锥体之外的对象。没有点渲染你看不到的物体!遮挡剔除会剔除被其前面的其他对象遮挡的对象。例如,门后的房间可以完全排除在外。默认情况下,遮挡剔除适用于您的整个场景,但适当的关卡设计将允许您剔除游戏的整个关卡。

LOD 组还可以剔除离场景太远的对象,进一步帮助最小化填充率。

六层设计

如果您的游戏涉及一个玩家从一个房间到另一个房间,那么简单的解决方案就是将整个游戏放在一个关卡中。然而,缺点是内存消耗。每个房间中的每个对象和材料都会加载到内存中,即使它们不可见。将每个房间放到一个单独的关卡中,并在代码中智能地异步加载它们。

7- 异步加载

在玩家接近下一个房间的门之前,加载下一个关卡。不要使用 Application.LoadLevel() 同步加载它,因为这会导致你的游戏在加载时挂起。当头部跟踪暂时停止时,这会导致恶心,对玩家来说是一种可怕的体验。

改为使用 Application.LoadLevelAsync()。您可以在 Oculus Mobile SDK BlockSplosion 示例中找到这方面的示例,位于 StartupSample.cs

8-烘焙光照关闭实时阴影!

接收动态阴影的对象将不会被批处理,您将受到严重的绘制调用惩罚。

在 PC 上,您可以使用单个实时定向光来获得漂亮的动态阴影。大多数现代 PC 可以提供华丽的每像素阴影。但是在移动设备上,您希望坚持使用烘焙照明并且没有实时阴影。以极高的分辨率使用硬阴影和软阴影烘焙您的照明。

9- 阴影

特别是对于高性能的移动体验,跳回 3D 对象上的阴影的旧技巧。可以在对象下方使用具有模糊阴影纹理的简单 2D 四边形来模拟半真实阴影。

10- 光探头

当您使用烘焙照明时,您的动态对象看起来不合适,而静态对象看起来很棒。您可以使用光照探针廉价地模拟动态对象上的动态光照。

光照探测器是烘焙的立方体贴图,用于存储有关场景中不同点的直接、间接甚至发射光的信息。当动态对象移动时,它会插入附近光探测器的样本以近似该特定位置的照明。这是一种在动态对象上模拟真实光照的廉价方法,无需使用昂贵的实时光照。

11- 避免透明和多材质对象

使用透明着色器的玻璃透视窗等对象非常昂贵。通过使用具有灰尘或铁锈纹理的透明材料以及单独的基础漫反射材料来增加墙壁的真实感是一种常见的做法。这种多材料 alpha 混合很昂贵;每种材质都会添加一个绘图调用!但是请注意,多个纹理不是问题;使用多种单独的材料是昂贵的。使用一种材质和一个着色器,可以通过 Alpha 混合来混合多个纹理,而不是使用多个单独的材质。

12- 蒙皮网格渲染器

蒙皮网格渲染器通常用于具有动画绑定的角色,使用物理(布娃娃身体)或自定义动画(步行、跳跃等)实现逼真的网格变形。

不幸的消息:蒙皮网格渲染器不会被批处理。场景中的每个角色可以为每只眼睛创建多个绘制调用。我还不确定如何解决这个问题。

来源:https://blog.bigscreenvr.com/12-performance-tricks-for-optimizing-vr-apps-in-unity-5-9849bb6aefa7

【讨论】:

  • “静态批处理有一个关键要求:所有对象必须使用相同的材​​料”。那是什么意思?如果你的墙壁有墙壁材料,地板有地板材料(两者的材料不同),它会工作吗?
  • @MuhammadFaizanKhan 他们将属于不同的批次。每种材料一个
【解决方案2】:

如果您的目标是移动设备,您需要使用具有 Unwrapped 的低多边形 3D 模型,使用较少的材料,低质量的纹理。

【讨论】:

    【解决方案3】:

    您可以使用 decimate 修饰符在搅拌机中减少 3d 模型的多边形数量。 如果您的场景中有一些对象不需要投射阴影,您可以从对象的网格渲染器组件中停用投射阴影选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      相关资源
      最近更新 更多