unity3d ios平台优化图形性能

Alpha 测试
与桌面机不同,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混合来代替。
 
      
      尽量不要使用雾效果。
 
    
      学习利用遮挡剔除功能的优势,并通过它在复杂的、高度遮挡的场景中来减少可见几何物体的数量和绘制调用。根据遮挡剔除的特点来设计您的场景。
 
      
      使用天空盒来“淡化”远处的几何模型。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值