Unity开发优化总结

  • 对所有需要的组件进行缓存。因为调用例如 transform, renderer之类的组件。内部会调用getComponent。效率非常低。缓存外部GameObject。道理相同。find很慢。gameObject 则不用。哪里访问都一样。
  • 用缓存池,而不是永远都初始化新的。因为内存越大,GC要扫描(从而发现无引用的对象)的越多。
  • 共用material。因为batching机制会把材质相同的对象合并为一个drawCall。像2D用atlas。
  • 尽量不用灯光,而用烘焙贴图。
  • 减少面、减少UV mapping接缝和硬边(hard edge)。建模软件通常显示几何顶点数,而在U3D中,如果某些点拥有多个法线(on a ”hard edge"),或者多个UV坐标、顶点颜色。则要被分成多个顶点。所以U3D中的顶点数会与建模软件中的不同。

游戏效率分为GPU,CPU两部分。

  • GPU通常受限于显卡填充率和内存带宽。
  • CPU通常受限于需要渲染的对象的数目,也就是draw call。如果在PC上达到好几千或者移动平台上达到好几百。就需要优化了。
  • 点数太多。PC上不要超过百万,移动上不要超十万。

Draw Call优化

每次Draw Call的耗费很大。CPU要找到和对象作用的灯光,准备shader和其输入参数,向GPU发出绘制请求,准备请求所需数据。

  • 把邻近的物体合并,手动也可以。用U3D自带的draw call batching也可以。(只有共享材质的才可合并draw call
  • 减少materail的使用。比如把多个纹理放进一个Atlas中。
  • 避免让对象被渲染多次,如阴影,反射。(如果对象被N个灯光照。则要多渲染N次)
  • 虽然大部分图形是和GPU相关的,但例如mesh skinning,也和CPU相关。

纹理优化:

  • 使用Compressed Textures,16bit位图也优于32bit、勾选Generate Mip Maps(允许CPU使用低分辨率纹理,除非纹理像素严格与屏幕分辨率1:1,或者是用来做UI和2D游戏)
  • 使用Level-Of-Detail系统、手动为相机设置每个layer的裁剪距离。像石头这种在远距离就不用显示了
    public class ExampleClass : MonoBehaviour {
        void Start() {
            float[] distances = new float[32];
            distances[10] = 15;
            camera.layerCullDistances = distances;
        }
    }

角色模型优化

  • 少用骨骼,并且尽量模型共用材质,除非材质类型不同。
  • 移动游戏,骨骼尽量在30以下。越少越好
  • 移动游戏,面数在300-1500为好,PC,面数在1500-4000

猜你喜欢

转载自berry-gong.iteye.com/blog/2168379