【问题标题】:Unity 2d, multilayer background overdrawunity 2d,多层背景透支
【发布时间】:2019-05-31 23:26:46
【问题描述】:

问题的定义很简单,但我找不到简单或直接的解决方案。

我有一个背景,由几个不透明的层组成:

  1. 渐变天空(1pic,静态);
  2. 明亮的大山(1pic,移动一点);
  3. 更暗 [更近] 的山脉(几张照片,随机生成,移动更快);
  4. 更暗 [更近] 的山脉带有一些细节(几张图片,随机生成,移动速度更快)。

我经历过过度绘制:每张图片都在相互叠加。每一层都是动态的,所以我不能只剪掉一半的天空或剪掉一半的山。但是,50% 的图片只是一种纯色 + 全透明。

问题1:防止后台透支的最佳做法是什么?考虑最简单的例子:背景天空(100% 屏幕)+ 移动山脉(80% 屏幕)。

问题2:有些山是简单的图片-一种不透明的颜色,弯曲的形状,其余的是完全透明的。我应该继续将它们用作精灵中的纹理还是我必须涉及一些实践才能以不同的方式使用它?

背景外观:

【问题讨论】:

    标签: performance unity3d 2d gpu-overdraw


    【解决方案1】:

    关于你的第一个问题,如果我理解正确,最简单的解决方案是改变图片的 z 位置。

    【讨论】:

    • 我不确定你是否这样做了。我已经设置了 z 层,但据我测试它并不能防止过度绘制。
    • 您能告诉我们您得到的结果和期望的结果吗?
    【解决方案2】:

    当使用带有 alpha 的精灵和纹理时,为每一层、每一帧绘制相同的像素,这是过度绘制的根本原因。尝试避免并将纹理压缩为 RGB 而不是 RGBA

    【讨论】:

    • 如果这有帮助,aIso 转到主摄像机并从 Skybox 更改为 Don't Clear 并将渲染路径更改为向前。
    • 我看不到,RGB 图片将如何解决制作多层背景的最终目标。回避不适用。我想知道能力、实践和解决方案。避免只会消除所需的背景。 “不清除”实际上是有道理的,因为无论如何我都在画我的天空。它将稍微提高性能,谢谢。
    • 我不认为完全透明的图像算作过度绘制,是吗?
    【解决方案3】:

    答案:

    1. 除非从头开始编写某些内容,否则没有防止过度绘制的解决方案。很可能会涉及网格和智能运行时适应,具体取决于层位置。
    2. Unity 现在支持 SVG。我对此进行了测试,它比拥有单独的纹理更好(取决于顶点的数量)。正确导入的 SVG 图像中没有纹理,这会阻止 SetPassCall 增加和整体纹理加载/卸载。

    过度绘制是低端设备的问题,最佳做法是尽量减少层数。但是,可以做一些额外的事情。

    • 首先,空场景渲染成本应该尽可能低。这意味着没有后处理、没有未优化的脚本等。低端设备的简单 FPS 计数器和温度测量将在这里有所帮助。
    • 那么,着色器的选择最为重要。最简单的着色器形式是 Unlit/*。但是,它们不如默认着色器灵活(也可以认为是轻量级的)。
    • SetPassCalls 可能是一个重要的主题,但它对我来说并不是一个崩溃的设备。从本质上讲,最好将所有背景都包含在一个图集中,共享相同的着色器,并且在两者之间不要有任何其他东西。这样一来,您可以拥有任意数量的图层,并且所有内容都将在一次绘制通道调用中绘制出来。
    • 最后,避免全屏动态照明。光源应该照亮尽可能少的层,尽可能小的区域。照明质量也可以切换。我仍在与灯光作斗争并尝试将烘焙应用于我的任务,但到目前为止,摆脱背景全屏灯光是一个巨大的 FPS 提升。

    【讨论】:

      猜你喜欢
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      • 1970-01-01
      • 2015-04-19
      • 2015-04-25
      • 1970-01-01
      • 2017-03-12
      相关资源
      最近更新 更多