School项目优化方案实施

美术规格:

  1. 主角骨骼数确认身体31+头发12根,大头游戏,俯视角,分成5部分10个drawcall,普通怪物27根左右,boss适量增多,因为不会同时出现;主角面数7K面,小怪2K面,boss怪适量增加,1~2个drawcall
  2. 场景同屏50个drawcall,3~4w面左右
  3. 贴图尺寸的缩小:按游戏内的实际贴图展示大小酌情降尺寸缩一半,包和内存占用都会降3/4
  4. 环境光贴图的效果对Cubemap的精度要求不高,大幅度降低贴图尺寸
  5. 遮罩贴图RGB通道都可以作为mask,R用于高光,G用于环境光的遮罩,B用于自发光的遮罩,3个遮罩合成一张。遮罩贴图对精度要求不高,大幅度降低贴图尺寸,比如缩到1/4 *
  6. mipmap虽然需要额外的内存,对gpu负担较少,渲染效率会提高,看游戏效果酌情设置
  7. 骨骼Optimize Game Object on Rig优化,编辑部分骨骼对上层开放
  8. Occlusion遮挡剔除优化,用于复杂的室内场景优化效果比较明显
  9. 场景、角色Lod group优化
  10. 发包的QualitySettings选择Simple,检查反锯齿、垂直同步关闭
  11. 场景的Lightmap模式选择Single Lightmaps,节省约100M包空间

Shader:

  1. Shader forge生成的shader文件比较大,由于shader是在第一次用到的时候去编译优化的,会导致卡顿,文件越大,卡顿越明显,对shader做预加载和调用WarmupAllShaders,可以减少这种卡顿现象,新手指引大场景加载时间小米4减少10秒左右,怪物等第一次出现的卡顿感减轻。*
  2. alpha test和alpha blend它们使渲染管线的early-z优化失效,必须执行fragment shader,造成overdraw,少用,离屏幕中心远一点,归根结底让fragment开销少一些
  3. Shader forge生成的shader自带forwardadd pass 灯光数量影响较大,效果出现过爆,效率也低,可以考虑加入noforwardadd 变量使得shader只受一个方向光影响
  4. Quick decal 插件的性能确认,模型上的decal跟地形的多重纹理实现不一样,用alpha blend实现,多用会影响效率,少用
  5. 去掉场景实时灯光,灯光位置和颜色运算放到shader里运算,不走光照流程,在shader里做额外的光照运算,特别是武器开火这种光照不要求太精确的光,不产生阴影只是为了更亮一些,走光照流程性价比不高,而且不精确的光可以走Vertex shader *(图1图2图3)
  6. Lightprob本身作为环境光参与光照运算,取值并不需要精确,ShadeSH9可在Vertex shader里计算
  7. 利用Shader的multi_complie条件编译,在特定场景的打开/关闭Shader编译宏,不用生成多个大同小异的shader,这样可以减少Shader文件的冗余,也能控制在特定场景下不执行某些shader代码(比如效率比较低的clip())
  8. 在Shader里设置Queue调整场景绘制顺序,场景——>大boss——>主角——>普通怪物,使得主角的遮挡透视能否正确显示,可以被场景和大boss遮挡透视,不会被普通怪物遮挡透视(图14图15图16)

程序:

  1. MVC框架的引入,需要mvc的lua版实现,对目前代码结构改动比较大,在现在的代码上多用消息机制解耦,把Update/fixedUpdate里的逻辑用消息来处理
  2. 无bundle环境的真机环境,方便排除bundle引起的bug,定位bug。真机开发模式查看内存和效率
  3. 利用adreno profiler等类似工具对设备上的GPU使用进行性能监控、抓取,分析性能瓶颈
  4. 设置较低的屏幕分辨率来解决GPU负载较大的瓶颈问题,对大分辨率屏幕,差硬件的设android设备帧率提升明显,小米4的战斗场景分辨率设成1280*720,提升5~10帧,处理Andorid机器上分辨率改变后的闪烁问题(静态改的话在java层去解决,动态改的话加黑屏渐变处理) *
  5. 接管Unity默认的Animator Update(disable掉Animator,在自定义的Update里去调用Animator的Update),可以动态调整Animator的Update频率,比如对AlwaysAnimate的屏幕外的物体降帧处理,屏幕中怪物超过一定数量,动画计算降帧处理,动画事件的Update做时间补偿不降帧,保证逻辑的正确性,另一个问题是Update逻辑动画状态检查需要对隔帧加额外处理*
  6. Animator的CullingMode不同性能差异,50个带骨骼动画普通怪物,都在屏幕外,CullingMode为AlwaysAnimate比BaseOnRenderer峰值差了30帧,平均差15帧
  7. SkinnedMeshRender的BackMesh,较少Animator.update的开销,MeshSkinning.Update开销
  8. 去掉offscreen物体的Update运算开销,比如animation和fastshadow的update开销
  9. 避免在Update里去调用GetComponent和GetComponentInChildren,在Awake或Start里去cache它们;避免Update里字符串构造比较,AnimatorStateInfo的Key用的nameHash;
  10. 避免Update里的foreach,用for代替,减少垃圾的产生,较少GC的调用频率
  11. 大量动态掉落物品的batching,利用Unity自带的dynamic batching,对shader简化,适当去掉Trail renderer(会破坏bathcing),待实现一个高效率的Traii renderer,目标是占用多个trail renderer占用1个drawcall
  12. 去掉OnGUI的调用,在小米4上有10%左右的帧率开销,而且经常gc,导致帧率不稳定,取消掉用UGUI的text实现
  13. 去掉打印日志开销,排除干扰,方便定位
  14. FastShadow改良。fastShadow用投影纹理的方式实现,效果要优于角色底部加一个透明的黑片(后者会与非水平的地形产生穿插),效率上对所有物体产生的动态阴影统一到一个批次里绘制,不过效果上可以扩展一下脚底的黑圈,实现高效率真实投影
  15. 进一步优化fastshadow和导航,减少碰撞检测,在碰撞面上构造投影三角形
  16. 默认自带的Projector整个投影接受体会参与绘制,优化方向是在投影体上找到合适的片来接受阴影,角色脚下的导航器(角色导航、指路导航、怪物导航)用projector实现,路面参与重绘,峰值占用40个drawcall,6k多面,优化结果3个drawcall和16个面(图4图5图6图7)

效果:

  1. 屏幕压黑加亮闪屏效果配合特效实现天气效果,下雨打雷、风雪、落叶等;下雨特效制作的特效用了粒子碰撞检测,需求酌情降低碰撞计算
  2. 角色勾边效果实现和调试,适应不同摄像机,用stencil buffer的效果只能勾轮廓,少了模型内部的细节,用offset+cull front(图17图18)
  3. 角色和咖啡馆模糊勾边效果(图10图11图12图13)
  4. RenderTexture代替掉GrabPass实现高效率透视折射扭曲效果,用于场景的传送门
  5. UI图片的勾边效果,图片的勾边1种方法是通过alpha变化判断边界,处理容易产生锯齿问题,2种方法是多次绘制(图8图9)。
  6. 新手引导的highlight按钮效果,用stencil buffer实现,替换掉把需要高亮的sprite复制一份放到蒙版前的做法
  7. 高效率海岸浪花泡沫处理水与地形的边界问题

附图:

School项目优化方案实施_第1张图片
图1
School项目优化方案实施_第2张图片
图2
School项目优化方案实施_第3张图片
图3
School项目优化方案实施_第4张图片
图4

图5
School项目优化方案实施_第5张图片
图6
School项目优化方案实施_第6张图片
图7
School项目优化方案实施_第7张图片
图8
School项目优化方案实施_第8张图片
图9
School项目优化方案实施_第9张图片
图10
School项目优化方案实施_第10张图片
图11
School项目优化方案实施_第11张图片
图12
School项目优化方案实施_第12张图片
图13
School项目优化方案实施_第13张图片
图14
School项目优化方案实施_第14张图片
图15
School项目优化方案实施_第15张图片
图16
School项目优化方案实施_第16张图片
图17
School项目优化方案实施_第17张图片
图18

你可能感兴趣的:(School项目优化方案实施)