Unity 2D,多层背景透支

时间:2019-05-31 23:26:46

标签: performance unity3d 2d gpu-overdraw

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

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

  1. 渐变天空(1pic,静态);
  2. 明亮的大山(1pic,稍微移动);
  3. 更黑更近的山脉(几张照片,随机生成,移动速度更快);
  4. 即使是较暗的[近]山也有一些细节(随机生成的几张照片,甚至移动得更快)。

我经历了透支:每张图片都在彼此叠加。每一层都是动态的,所以我不能只砍掉一半的天空或砍掉一半的山。但是,有50%的图片只是一种纯色+全透明。

问题1 :防止背景透支的最佳实践是什么?考虑最简单的示例:背景天空(100%屏幕)+移动山峰(80%屏幕)。

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

背景外观:Background's look

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

使用带有Alpha的精灵和纹理时,每一层都绘制相同的像素,每一帧都是绘制过量的基本原因。尝试避免将纹理压缩为RGB而不是RGBA

答案 2 :(得分:0)

答案:

  1. 除非从头开始写一些东西,否则没有防止透支的解决方案。很有可能会根据层的位置进行网格划分和智能运行时自适应。
  2. Unity现在具有SVG支持。我对此进行了测试,它(取决于顶点的数量)比具有单独的纹理更好。正确导入的SVG图像中没有纹理,这会阻止SetPassCalls的增加以及整个纹理的加载/卸载。

透支是低端设备的问题,最佳实践是最大程度地减少层数。但是,还可以执行其他操作。

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