Unity 2d,多层背景透支
Unity 2d, multilayer background overdraw
问题的定义很简单,但我找不到简单或直接的解决方案。
我有一个背景,由几个不透明层组成:
- 渐变天空(1pic,静态);
- 光明大山(1张,有点动);
- 更暗[更近]的山脉(一些图片,随机生成,移动速度更快);
- 更暗[更近]的山脉有一些细节(一些图片,随机生成,移动得更快)。
我有透支的感觉:每张图都在互相叠加。每一层都是动态的,所以我不能只切割一半的天空或切割一半的山。然而,50%的图片只是纯色+全透明。
问题1:防止背景透支的最佳实践是什么?考虑最简单的示例:背景天空(100% 屏幕)+ 移动的山脉(80% 屏幕)。
问题2:一些山是简单的图片——一个不透明的颜色,弯曲的形状,其余的是完全透明的。我应该继续将它们用作精灵中的纹理,还是我必须参与一些实践才能以不同的方式使用它?
背景外观:
关于你的第一个问题,如果我理解正确的话,最简单的解决办法就是改变图片的z位置。
当使用带 alpha 的精灵和纹理时,为每一层、每一帧绘制相同的像素,这是过度绘制的根本原因。尝试避免将纹理压缩为 RGB 而不是 RGBA
答案:
- 除非从头开始写一些东西,否则没有防止透支的解决方案。它很可能会涉及网格和智能运行时自适应,具体取决于图层位置。
- Unity 现在支持 SVG。我对此进行了测试,它比拥有单独的纹理更好(取决于顶点的数量)。正确导入的 SVG 图像中没有纹理,这会阻止 SetPassCalls 和整体纹理的增加 loading/unloading。
Overdraw 是低端设备的问题,最佳做法是尽量减少层数。但是,可以做一些额外的事情。
- 首先,空景渲染的成本越低越好。这意味着没有 post 处理,没有未优化的脚本等。低端设备的简单 FPS 计数器和温度测量将在此处有所帮助。
- 那么,着色器的选择是最重要的。最简单的着色器形式是 Unlit/*。然而,它们不像默认着色器(也可以被认为是轻量级的)那么灵活。
- SetPassCalls 可能是一个重要的主题,但它不是我的设备崩溃。从本质上讲,所有背景最好包含在一个图集中,共享相同的着色器,并且两者之间不要有任何其他东西。通过这种方式,您可以拥有任意多的层,并且所有内容都将在一次绘制过程调用中绘制。
- 最后,避免全屏动态照明。光源应该照亮尽可能少的层,尽可能小的区域。照明质量也可以切换。我仍在与灯光作斗争并尝试将烘焙应用到我的任务中,但到目前为止摆脱背景全屏灯是一个巨大的 FPS 提升。
问题的定义很简单,但我找不到简单或直接的解决方案。
我有一个背景,由几个不透明层组成:
- 渐变天空(1pic,静态);
- 光明大山(1张,有点动);
- 更暗[更近]的山脉(一些图片,随机生成,移动速度更快);
- 更暗[更近]的山脉有一些细节(一些图片,随机生成,移动得更快)。
我有透支的感觉:每张图都在互相叠加。每一层都是动态的,所以我不能只切割一半的天空或切割一半的山。然而,50%的图片只是纯色+全透明。
问题1:防止背景透支的最佳实践是什么?考虑最简单的示例:背景天空(100% 屏幕)+ 移动的山脉(80% 屏幕)。
问题2:一些山是简单的图片——一个不透明的颜色,弯曲的形状,其余的是完全透明的。我应该继续将它们用作精灵中的纹理,还是我必须参与一些实践才能以不同的方式使用它?
背景外观:
关于你的第一个问题,如果我理解正确的话,最简单的解决办法就是改变图片的z位置。
当使用带 alpha 的精灵和纹理时,为每一层、每一帧绘制相同的像素,这是过度绘制的根本原因。尝试避免将纹理压缩为 RGB 而不是 RGBA
答案:
- 除非从头开始写一些东西,否则没有防止透支的解决方案。它很可能会涉及网格和智能运行时自适应,具体取决于图层位置。
- Unity 现在支持 SVG。我对此进行了测试,它比拥有单独的纹理更好(取决于顶点的数量)。正确导入的 SVG 图像中没有纹理,这会阻止 SetPassCalls 和整体纹理的增加 loading/unloading。
Overdraw 是低端设备的问题,最佳做法是尽量减少层数。但是,可以做一些额外的事情。
- 首先,空景渲染的成本越低越好。这意味着没有 post 处理,没有未优化的脚本等。低端设备的简单 FPS 计数器和温度测量将在此处有所帮助。
- 那么,着色器的选择是最重要的。最简单的着色器形式是 Unlit/*。然而,它们不像默认着色器(也可以被认为是轻量级的)那么灵活。
- SetPassCalls 可能是一个重要的主题,但它不是我的设备崩溃。从本质上讲,所有背景最好包含在一个图集中,共享相同的着色器,并且两者之间不要有任何其他东西。通过这种方式,您可以拥有任意多的层,并且所有内容都将在一次绘制过程调用中绘制。
- 最后,避免全屏动态照明。光源应该照亮尽可能少的层,尽可能小的区域。照明质量也可以切换。我仍在与灯光作斗争并尝试将烘焙应用到我的任务中,但到目前为止摆脱背景全屏灯是一个巨大的 FPS 提升。