Notifications
Article
[干货]移动游戏优化答疑总结
Updated 9 months ago
1.5 K
2
Unity官方技术团队的答疑集合贴
9月27日晚8点到9点,Unity技术支持工程师张陈渊、Unity技术支持工程师金晓宇、Unity平台部技术总监杨栋、Unity技术经理成亮坐镇Unity Connect,为开发者们答疑移动游戏优化相关的问题。
关于Unity中国官方技术支持团队: Unity中国官方技术支持团队旨在为国内企业用户提供高质量技术支持服务,在过去的几年里,我们为国内的Unity用户提供了丰富的服务内容,包括线上问题解答平台,现场技术支持,技术培训,游戏解决方案等。在2017年,我们在提供Unity Global Support Service的基础上,增加了定期的现场支持服务,以及定期的现场深度性能优化服务,使得国内企业用户可以享受更全面以及更深度的技术支持服务,让Unity的用户可以最大程度上挖掘Unity的潜力,使他们在产品质量和开发效率上都得到进一步的提升。 自Unity中国官方技术支持团队成立以来,已经为国内众多游戏团队提供了持续的优质服务,客户包括游戏大厂和中小型游戏公司。Unity中国官方技术支持团队致力于为中国游戏团队提供快速、全面、优质的服务,与国内游戏团队成为最紧密的合作伙伴,助力您的成功! 获取Unity全球企业支持服务以及相关咨询,请联系:chinasales@unity3d.com。
下面,就跟着小编来看看活动当天Unity技术工程师们回答的移动优化开发的相关问题吧!
Q:我有个灯光烘焙的问题:在2017上设置灯光烘焙,速度很慢,而且调不出来想要的灯光效果,我希望能得到提示,怎么去调节灯光,或者使视觉效果更佳?
A:2017你可以使用我们新的Progressive Lightmapper,这个工具可以让你快速预览场景效果,而且2017版本里有一个Light Explorer,可以在同一个窗口里面看到所有当前场景里面的灯光。
Q:对于制作2D游戏。经常会生成多个物件,如子弹,或者方格地图格子等。采用dynamic batch似乎不能很好的合并。这个要用什么方法优化dc吗?
A:可以用pool manager,这是资源商店的一个资源:https://www.assetstore.unity3d.com/en/#!/content/1010
Q:如何真正的销毁asset,是否是使其引用数为0时调用Resources.UnloadUnusedAssets();?
A:Resources.UnloadUnusedAssets()会真正释放内存及显存,但此接口尽量不要频繁调用,因为会有较大的性能开销。
Q:UGUI优化上有什么好的方法。
A:UGUI的优化请将重点放在drawcall合批和顶点重建上,比较常用的方法有:动静分离,有很多ui不需要输入事件时,可以关闭事件检测。
Q:UGUI 安卓可以设置etc1+alpha通道分离,ios下好像没有对应的功能?或者有没有替代的方案?
A:Unity在android上默认机制是当所用的平台支持ETC2时,会使用ETC2,当仅支持ETC1时会拆分alpha通道。而ios下通常不需要拆分alpha的,如果是考虑到贴图的大小非要拆分的话,是需要自己来实现的。简单的实现思路:写个插件来读取原贴图,分别获取颜色值和alpha,存储在两张贴图中。shader也需稍作修改,采样两张纹理,根据alpha纹理来混合颜色。
Q:移动开发的优化工具除了unity profiler和xcode上的instruments, 还有什么其他工具吗?有没有代码级别的优化工具?现在很多团队都使用支持lua的框架,这块的优化有什么好方法?
A: 除了常规的Unity profiler 和 instrument, 还有以下一些工具推荐:
  • Memory profiler, 查看内存
  • NSight, 查看GPU
  • Unity Engine Analyzer, 代码静态分析工具
Q:请问,有好的手机 push 插件吗? 用户不开启app,也能接收到吗?
A:你说的应该是push notification吧,iOS和Android都要服务端支持的,要么自己的服务端支持要么用第三方的服务。
Q:在移动端,调用OnRenderImage()方法,方法里面没有任何内容,在真机上测试,明显会导致性能下降。请问这是为什么呢?
A:只要实现了OnRenderImage方法,Unity会创建一张临时的renderTarget,这是导致性能下降的原因。
Q:现在手机的屏幕分辨率这么高,渲染像素的数量比PC端高出这么多。是不是要注意像素填充率成为性能瓶颈呢?如果真的存在像素填充率的性能瓶颈,在Profile中怎么看得到?
A:是的,移动平台是需要特别注意填充率的问题。如果想profiling的话,建议可以使用xcode的GPU Frame Capture来优化,它可以来capture某一帧,我们可以获取到所有shader的运行效率,以及图形API的调用情况,这可以方便的分析究竟是哪些物体造成了过高的消耗(包括填充率)。
Q:发热问题。我们团队主要是做2d休闲类游戏,每款游戏的逻辑运算和素材都比较简单,也没有什么大的特效,但运行一段时间(10多分钟)都会存在机子发热问题(fps60)。这应该怎么优化?
A:我猜你们是用Android机器吧?把帧数降到30帧应该会好很多,一般是CPU和GPU占用都太高。60帧一般用不到,但是也要看你的游戏类型,比如动作类的游戏60帧会效果好很多。
Q:Android平台防止反编译。有什么好的解决方案?
A:资源商量里面有这种解决方案的:https://www.assetstore.unity3d.com/en/#!/content/87431
Q:如果项目采用lua,lua占用内存 在mono内存吗?
A:lua底层是c++实现的话,所占的内存是堆内存,不属于mono内存,你可以使用unity profiler查看mono内存是否增长。
Q:请教一个移动端的性能问题,在手机端帧数能达到60帧,但是游戏过程中偶尔还是会发生卡顿一下的情况,这一般是什么原因造成的呢?可以确定场景已经加载完毕,而且游戏过程中也不会有其他加载资源的操作。此外就是,手机发热比较严重。
A:还有一种可能性是发生了垃圾回收,可以用UnityPofiler诊断是否有内存一直分配的情况。如果有,最好采用对象池等机制避免内存一直分配导致垃圾回收。另外手机发热问题的原因很多,主要就是把CPU和GPU的使用率降下来。比如CPU查看一下热点函数,进行相应优化。GPU方面可以,可以检查Draw call,填充率,顶点数是否过多等。
Q:是否可以手动设置渲染分辨率以提高性能,有些手机屏幕分辨率太高了,想通过降低渲染分辨率的方式来减低性能消耗是否可行?如果可行应该如何操作?
A:降分辨率是可行的,可以通过创建一张低分辨率的renderTexture做为渲染目标来提高性能。
Q:在移动端的性能调试过程中,怎么确定是cpu负载过高还是gpu负载过高?在Profile中是看不到gpu的耗时的。
A:xcode可以查看cpu的gpu的占用,gpu还可以看出vs和ps占用比,请使用xcode调试。
Q:请问关于C#脚本优化这块,有哪些API效率较低或者容易引发GC Alloc或者有其它代替的API吗?比如Camera.main据说是个坑...还有没有其它类似的呢?
A:在我们平常编码的时候,由于工作忙碌的原因可能不太注意mono脚本的编写。这里简单列举几条:
  1. addComponent会造成gc alloc
  2. physics.raycast会造成gc alloc,建议使用无gc alloc的版本
  3. setParent尽量少调用,对于有mesh collider的物体,更是不建议调用
  4. 使用数组的数组,而不是多维数组
  5. 对于transform的修改尽量减少
  6. 对于有大批量物体的游戏,注意从native层调用mono脚本的开销,比如update的开销
Q:作为项目经理,怎么通过profiler面板区分程序性能消耗和美术性能消耗。知道主要是程序锅还是美术的锅?
A:谁来背锅这个很难说。Profiler并不能告诉你这是谁的锅。但是美术是需要在一开始制作素材的时候就要制定开发标准,这个标准需要程序和美术一起来制定。
Q:unity做2D游戏的时候,物理碰撞是不是必须的,感觉用了物理碰撞和粒子特效后,打包后会感觉有些卡卡的,物理碰撞和粒子特效消耗的也不少,如果不使用物理碰撞该怎么做好些呢?
A:粒子特效如果太多,可以适当减少。至于物理系统,一般的2d碰撞检测不会有太大性能问题。可以检查下Layer Collision Matrix的设置, 把不同的的碰撞体分类, 避免多余的碰撞检测。如果要自己实现Box , Circle等形状的碰撞检测,也是可以的。
Q:Unity 的depth Test发生在fragment program之前,这个是不是early-z呢?如果运用了early-z技术,那场景渲染之前会先用一个简单的shader渲染整个场景以生成depth信息。那问题来了,为什么我们要用depth map的时候,还会再渲染多一次呢?而不是直接从depth Buffer中取出来直接用就好了?
A:因为大部分平台不支持抓取depth buffer,unity为了统一,没有实现此功能。如果想拿到depth map,必须要渲一遍,因为可以使用低模或简单shader,所以这一步还是可以优化的。
最后恭喜 @杨栋栋 @k-jerry @Cai Hua @IcepOwer @David这五位开发者,你们的5个问题最先被技术选中回答,我们会为你们送上一份小礼品哦!

Tags:
Unity China
276
Contributors
ChengLiang
Product EvangeList - Educator
Cloud Jin 金晓宇
Field Engineer - Programmer
Richard Yang 杨栋
Platform Project Manager / Evangelist Lead - Programmer
Comments
Cai Hua
a year ago
Software Engineer - Programmer
很感谢几位老师的讲解,希望这个活动可以长期进行。
2
Zixi
Staff
a year ago
Unity China - Marketer
获奖的同学联系我!
0