Unity3D开发不可忽视的细节问题
2015年08月07日 14:53
0 点赞
0 评论
更新于 2025-11-21 15:49
作者:大帅纷纭
原文:http://www.taidous.com/forum.php?mod=viewthread&tid=27856
开发中常见问题
- NGUI图集管理问题:有些很大的图和很小的图放在一起,会出现空白区域不可用的情况。
- U3D中美术资源大小问题:例如带Alpha通道的图文件大小会更大。
- 显示面板层次深度控制问题:当多个面板同时需要显示时,如何控制操作的面板处于最顶端。
- U3D自带消息机制对于MVC的优缺点。
- 资源复用问题:涉及依赖打包与否,以及游戏内存针对场景和角色的管理问题。
- NGUI减少Calling问题。
综合解决方案
NGUI相关优化
- UIPanel使用原则:每个UI应以1个UIPanel为标准。过多的UIPanel不仅会导致DrawCall增多,还会使UI逻辑变得混乱。
- UITexture使用建议:不要过多使用UITexture,因为每个UITexture都会增加1个DrawCall。通常,UITexture可作为背景图出现在UI上,无论是小背景还是大背景均可。
- 图集管理策略:NGUI的图集不宜过大,不要将多个UI元素放在一个图集里,否则在UI显示时加载资源的IO速度会非常慢。可以采用多种方式管理图集,例如每个UI一个图集;宽度大于300*100的图不做图集;一个系统模块使用2个图集等。甚至可以尝试以整个游戏为单位划分公共图集、按钮图集、头像图集、问题图集等,但这种方式可能因图集过大导致IO过慢而不适用。图集的管理方式应根据项目需求进行调整,关键在于理解程序读取资源时的IO操作时间。
- 减少UI更改:尽量减少不必要的UI更改,因为NGUI一旦有UI进行更改,就需要重新绘制MESH和贴图,重绘操作比较耗费CPU资源。
- 动态操作处理:NGUI对于动态的移动、旋转等UI操作支持性较差,操作过多会导致屏幕卡顿。解决办法是自己用程序生成面片,使面片的渲染不再受NGUI控制。
项目测试与UI自适应
- 测试分辨率选择:在开发过程中,尽量使用Free分辨率来测试项目UI的屏幕自适应效果,避免上线后才发现自适应问题。
- UI屏幕自适应代码:
float defaultWHRate = 800f / 480f; float ScreenWHRate = (float)Screen.width / (float)Screen.height; bool isUseHResize = defaultWHRate >= ScreenWHRate ? false : true; UIRoot root = GameObject.Find("ROOT").GetComponent<UIRoot>(); if (!isUseHResize) { float curScreenH = (float)Screen.width / defaultWHRate; float Hrate = curScreenH / Screen.height; root.manualHeight = (int)(480f / Hrate); } else { root.manualHeight = 480; }
UI界面管理
- 界面拆分与锚点固定:将UI界面进行拆分,并固定各个锚点,如:上、左上、右上、中、左中、右中、下、左下、右下。
- UI内存管理:要充分管理游戏中的UI,过多的UI会导致内存加速增长,而频繁销毁不用的UI会使IO过于频繁,降低运行速度。可以找到两者的中间态,为隐藏的UI设置一个缓冲池,当某个UI隐藏时,判断是否有需要销毁的UI;也可以实时监控隐藏的UI,销毁内存驻留时间过长的UI。
- 图标处理:对于头像、物品等数量较多的图标,可以打成几个图集,并按一定规则排列,以减小文件大小,减少一次性读取的IO时间。
其他优化建议
- 避免使用动态字体:游戏中应尽可能不使用动态字体,因为动态字体每次都会进行IO操作读取相应的图片,这是NGUI的一个问题,会耗费CPU和内存资源。
- 设置脚本执行次序:在U3D的Project setting -> Script Execution Order中设置脚本执行次序。由于NGUI以UIPanel为主要渲染入口,所有关于游戏渲染处理的程序最好放在渲染之后,即UIPanel之后。UIPanel以LateUpdate为接口入口,因此关于渲染方面的程序还需斟酌是否放在LateUpdate里。
美术资源大小优化
- 图片尺寸选择:2的N次方大小的图片会得到引擎更大的支持,包括更高的压缩比率、更低的内存消耗和更小的打包压缩大小。
- 减小图片占用大小和内存的方式:可以通过改变图片大小(Maxsize)、色彩位数(16位、32位)以及使用压缩算法(PVRC)等方式来实现。