与桌面机不同,iOS 设备在进行alpha测试(或在像素着色器中使用丢弃和裁剪操作)时会造成很高的性能开销。所以,如果可以的话,您应该尽可能地用alpha混合替换alpha测试。如果alpha测试不能避免,那么您应该尽量将可见的 alpha测试像素总数降到最低。
顶点性能
一般来说,如果您想在iPhone 3GS或更新的设备上每帧渲染不超过40,000可见点,那么对于一些配备 MBX GPU的旧设备(比如,原始的 iPhone,如 iPhone 3g和 iPod Touch第1和第2代)来说,你应该保证每帧的渲染顶点在10000以下。
光照性能
逐像素的动态光照将对每个受影响的像素增加显著的计算开销,并可能导致物体会被渲染多次。为了避免这种情况的发生,您应该避免对于任何单个物体都使用多个像素光照,并尽可能地使用方向光。需要注意的是像素光源是一个渲染模式(Render Mode)设置为重要(Important)的光源。
逐像素的动态光照将对顶点变换增加显著的开销。所以,应该尽量避免任何给定的物体被多个光源同时照亮的情况。对于静态物体,采用烘焙光照方法则是更为有效的方法。
优化模型几何
当优化模型的几何数据时,有两个可以遵循的基本原则:
不要使用不必要的三角形面片
尽量降低的 UV映射的接缝和硬边缘(ie,增加了一倍以上顶点)的数量
请注意,显卡所处理的实际顶点数目通常不等于一个 3D应用程序所报告的数目。建模工具通常显示的是模型的几何顶点数,ie,组成模型的不同角点的数目。
但是,对于显卡来说,一些几何顶点往往需要根据渲染用途来拆分成两个或多个逻辑顶点。比如,一个顶点如果有多个法线、 UV坐标或顶点颜色,则必须对其进行拆分。因此,Unity的顶点计数总是比的 3D应用程序的顶点计数高很多。
纹理压缩
使用iOS自带的PVRT压缩格式可以有效地降低纹理的大小(这将导致更快的导入速度以及更小的内存占用),从而显著地提升渲染效率。压缩后的纹理所占用的内存带宽只相当于未压缩的 32位 RGBA 纹理的一小部分。在iOS Hardware Guide中,您可以找到的未压缩纹理与压缩纹理的性能比较。
某些图像经过PVRT 压缩后可能会在alpha通道中出现一些视觉瑕疵。在这种情况下,您需要直接在图像处理软件中调整 PVRT压缩参数。你可以安装PVR导出插件或直接使用Imagination Tech提供的PVRTexTool。生成的扩展名为.pvr的压缩图像文件,将直接被导入到Unity编辑器中,并且其指定的压缩参数将被保留。
如果PVRT压缩纹理无法给你足够好的视觉质量,或者你需要特别清晰的图片(比如用来作为GUI纹理),那么您应该考虑使用16位的纹理来代替RGBA纹理。因为这样做,你也可以减少一半的内存带宽。
写出高性能的shader
自从iPhone 3GS 以来,IOS 设备上的 Gpu就可以充分支持像素着色器和顶点着色器。但是,IOS设备上的性能还远远是没有达到PC机的程度,所以您不应期望PC上的着色器可以端口不变地移植到IOS设备上。通常情况下,着色器需要进行一些优化来减少计算量和纹理读取,从而才能达到良好的性能。
复杂的数学计算
一些超越数学函数(如pow,exp,log,cos, sin,tan等)将增大GPU计算的负担,所以一个好的法则就是在每个片段中使用不多于一次的这种操作。在适当的情况下,可以考虑使用查找纹理来作为折中方法。
不建议您自己写normalize,dot,inverse, sqrt等操作函数,如果您使用内建函数,底层驱动将会为你生成更好质量的代码。
切记,丢弃(discard)操作将会让你的片段运行缓慢。
浮点数操作
编写自定义着色器时,您应该始终指定浮点变量的精度。为了获得最佳性能选择最小可浮动点格式至关重要。
如果着色器是用GLSL ES来写的,那么浮点精度的指定如下所示:
highp–全32位浮点格式,适合顶点变换,但效率最低。
mediump –缩减的16位浮点格式,适合于纹理UV坐标,效率大致是highp的两倍。
lowp – 10位固定点格式,适合于颜色,光照计算和其他高性能操作,效率大致是highp的四倍。
如果着色器是用CG写的,或者它是一个表面着色器,那么它的精度指定如下所示:
float –与GLSL ES中的highp相似,效率最慢。
half -与GLSL ES中的mediump相似,效率大致是float的两倍。
fixed -与GLSL ES中的lowp相似,效率大致是float的四倍。
硬件文档
花费一些时间去学习Apple的硬件相关文档和best practices for writing shaders,但我们更加建议关注浮点型的精度问题。
烘焙光照信息到光照贴图(Lightmap)
通过Unity内建的Lightmapper,可以将您的场景的光照信息烘焙到纹理上。生成一个光照贴图要比仅仅在Unity的场景中放置一个光源来花费更长的时间,但是:
它将运行更加快速(如果像素光源是2的话,光照贴图的运行速度将是动态光照的2-3倍)
看上去效果更好,因为你可以烘焙全局光照明效果,同时光照贴图器还可以柔化(smooth)光照效果。
共享材质
如果当前帧中的许多物体都使用相同的材质,那么Unity iOS将会启动大量的内部优化,比如:
避免设置各种不同的render state到OpenGL ES上。
避免设置顶点和像素处理所需的不同参数的计算
批处理小型运动物体,来减少绘制调用
批处理开启静态属性的物体来减小绘制调用
所有这些优化将节省您宝贵的CPU周期。因此,进行纹理拼合使物体共用相同材质,这样的额外工作是会让您如愿以偿的。去做吧!
简单的清单,让您的游戏运行更快
保证顶点个数如下:
·
对于iPhone 3GS以及更新的设备(SGX GPU),每帧至多渲染4万个顶点
·
对于较老的设备(MBX GPU),每帧至多渲染1万个顶点
如果您使用的内置的着色器,请从移动类别中选择它们。请记住,Mobile/VertexLit是目前最快的着色器。
保证每个场景所用的材质种类达到最低,尽可能地在让多种物体分享相同的材质。
对于非运动的物体请打上Static标记,这样这些物体可以进行内部优化。
尽可能地选择PVRTC格式的纹理,如果不能地话,也请选择16位纹理而不是32位的。
使用合并或像素着色器来混合每个片段的纹理,来代替多通道渲染方法。
如果写自定义的着色器,请尽可能地使用最小的浮点类型:
·
fixed /lowp –适用于颜色,光照信息和法线,
·
half /mediump –适用于纹理UV坐标,
·
float /highp –避免在像素着色器中进行使用,最好用于顶点着色器中的顶点位置计算。
尽量在像素着色器中少使用复杂的数学运算操作,比如pow,sin,cos等。
尽量不要使用多个像素光源,选择单一的像素光源(最好是方向光)来照亮您的模型。
尽量不要使用动态光照,选择烘焙光照来代替。
每个片段选择较少的纹理。
避免alpha测试,选择alpha混合来代替。
尽量不要使用雾效果。
学习利用遮挡剔除功能的优势,并通过它在复杂的、高度遮挡的场景中来减少可见几何物体的数量和绘制调用。根据遮挡剔除的特点来设计您的场景。
使用天空盒来“淡化”远处的几何模型。