Unity开发-你必须知道的优化建议
2016-04-15 18:36
603 查看
最近研究U3D开发,个人认为,精通一种新的技术,最快最好的方法就是看它的document,而且个人习惯不喜欢看中文的资料,原汁原味的东西是最正确的,一翻译过来很多东西就都不那么准确了。于是通读了unity的官方manuel,最后面几章都是精华,里面给了非常非常多的官方的优化建议,尤其是做移动平台的开发,这些建议就是非常重要的。我将官方manueladvanced后面的那几个章节的东西提炼了一下出来,总结了这样一些优化tips:
动态的pixel光照计算(如法线)
实时的阴影
probes(光照探头)
2.不使用法线贴图(或者只在主角身上使用),静态物体尽量将法线渲染到贴图
3.不适用稠密的粒子,尽量使用UV动画
4.不使用fog,使用渐变的面片(参考shadow
gun)
5.不要使用alpha–test(如那些cutout
shader),使用alpha-blend代替
6.使用尽量少的material,使用尽量少的pass和render次数,如反射、阴影这些操作
7.如有必要,使用Per-LayerCullDistances,Camera.layerCullDistances
8.只使用mobile组里面的那些预置shader
9.使用occlusionculling
11.远处的物体绘制在skybox上
12.使用drawcallbatching:
对于相邻动态物体:如果使用相同的shader,将texture合并
对于静态物体,batching要求很高,详见Unity
Manual>Advanced>Optimizing
GraphicsPerformance>Draw
CallBatching
规格上限
1.每个模型只使用一个skinned
meshrenderer
2.每个mesh不要超过3个material
3.骨骼数量不要超过30
4.面数在1500以内将得到好的效率
2.对于投射物不要使用真实物理的碰撞和刚体,用自己的代码处理
3.不要使用meshcollider
4.在edit->projectsetting->time中调大FixedTimestep(真实物理的帧率)来减少cpu损耗
object,使用objectpool
2.尽量不要再update函数中做复杂计算,如有需要,可以隔N帧计算一次
3.不要动态的产生字符串,如Debug.Log("boo"+"hoo"),尽量预先创建好这些字符串资源
4.cache一些东西,在update里面尽量避免search,如GameObject.FindWithTag("")、GetComponent这样的调用,可以在start中预先存起来
5.尽量减少函数调用栈,用x=(x>0?
x:-x);代替x=Mathf.Abs(x)
6.下面的代码是几个gc“噩梦”
String的相加操作,会频繁申请内存并释放,导致gc频繁,使用System.Text.StringBuilder代替
varline=intArray[0].ToString();
for(i=1;i<intArray.Length;i++){
line+=","+intArray[i].ToString();
}
returnline;
}
在函数中动态newarray,最好将一个array、传进函数里修改
2.4
1.数据类型
fixed/lowp-forcolors,lightinginformationandnormals,
half/mediump-fortextureUVcoordinates,
float/highp-avoidinpixelshaders,finetouseinvertexshaderforpositioncalculations.
2.少使用的函数:pow,sin,cos等
1不是每个主流手机都支持的技术(就是如果可以不用就不用或有备选方案)
屏幕特效动态的pixel光照计算(如法线)
实时的阴影
2优化建议
2.1渲染
1.不使用或少使用动态光照,使用lightmapping和lightprobes(光照探头)
2.不使用法线贴图(或者只在主角身上使用),静态物体尽量将法线渲染到贴图
3.不适用稠密的粒子,尽量使用UV动画
4.不使用fog,使用渐变的面片(参考shadow
gun)
5.不要使用alpha–test(如那些cutout
shader),使用alpha-blend代替
6.使用尽量少的material,使用尽量少的pass和render次数,如反射、阴影这些操作
7.如有必要,使用Per-LayerCullDistances,
8.只使用mobile组里面的那些预置shader
9.使用occlusionculling
11.远处的物体绘制在skybox上
12.使用drawcallbatching:
对于相邻动态物体:如果使用相同的shader,将texture合并
对于静态物体,batching要求很高,详见Unity
Manual
GraphicsPerformance
CallBatching
规格上限
1.每个模型只使用一个skinned
meshrenderer
2.每个mesh不要超过3个material
3.骨骼数量不要超过30
4.面数在1500以内将得到好的效率
2.2物理
1.真实的物理(刚体)很消耗,不要轻易使用,尽量使用自己的代码模仿假的物理2.对于投射物不要使用真实物理的碰撞和刚体,用自己的代码处理
3.不要使用meshcollider
4.在edit->projectsetting->time中调大FixedTimestep(真实物理的帧率)来减少cpu损耗
2.3脚本编写
1.尽量不要动态的instantiate和destroyobject,使用objectpool
2.尽量不要再update函数中做复杂计算,如有需要,可以隔N帧计算一次
3.不要动态的产生字符串,如Debug.Log("boo"+"hoo"),尽量预先创建好这些字符串资源
4.cache一些东西,在update里面尽量避免search,如GameObject.FindWithTag("")、GetComponent这样的调用,可以在start中预先存起来
5.尽量减少函数调用栈,用x=(x>0?
x:-x);代替x=Mathf.Abs(x)
6.下面的代码是几个gc“噩梦”
String的相加操作,会频繁申请内存并释放,导致gc频繁,使用
functionConcatExample(intArray:int[]){
varline=intArray[0].ToString();
for(i=1;i<intArray.Length;i++){
line+=","+intArray[i].ToString();
}
returnline;
}
在函数中动态newarray,最好将一个array、传进函数里修改
functionRandomList(numElements:int){
varresult=newfloat[numElements];
for(i=0;i<numElements;i++){
result[i]=Random.value;
}
returnresult;
}
2.4
shader编写
1.数据类型fixed/lowp-forcolors,lightinginformationandnormals,
half/mediump-fortextureUVcoordinates,
float/highp-avoidinpixelshaders,finetouseinvertexshaderforpositioncalculations.
2.少使用的函数:pow,sin,cos等
2.4GUI
1.不要使用内置的onGUii函数处理gui,使用其他方案,如NGUI3.格式
1.贴图压缩格式:ios上尽量使用PVRTC,android上使用ETC相关文章推荐
- Unity3D 重力下打飞碟
- Unity AssetBundle 爬坑!!!!!!!
- Unity2016 Unity3D开发VR游戏的经验
- unity3d热更新插件uLua学习整理
- unity3d中的物体,在Scene窗口中可以看到,而在Game窗口中看不到的原因
- unity5之代码创建状态机,玩的666
- unite2016上海Unity大会--Unity3D性能优化篇
- unity3d事件函数整理,事件,回调函数,消息处理
- Unity IK(反向运动学)初探
- Unity3D中文学习视频
- Unity 3d 如何实现点击屏幕,npc自动移动到点击位置
- unity中FPS计算
- 关于Unity的几种优化方法
- unity3d中旋转
- unity3d 三分钟实现简单的赛车漂移
- Community Value再理解
- unity3d热更新插件uLua学习整理
- Unity中使用ulua的个人经验总结
- 小译UnityAPI-Awake,Start,Reset
- unity使用WorldMachine修整地形