作者:大帅纷纭

原文:http://www.taidous.com/forum.php?mod=viewthread&tid=27856

 

1.NGUI如果管理图集(有些很大的图,和很小的图在一起,会空白区域不可用)。
2.如果在u3d里面减小美术资源的大小,例如说带Alpha通道的图会大一些。
3.如何控制显示面板层次深度,例如多个面板都需要现在时候,如果控制你操作的面板在最顶端。
4.U3D自带消息机制优缺点,对于MVC来说。
5.资源复用问题,依赖打包与否,游戏内存针对场景和角色管理问题。
6.对NGUI来说如何减少Calling。

综合答案:
1.每个UI以1个UIPanel为标准,过多的UIPanel首先会导致DrawCall的增多,其次会导致UI逻辑的混乱。
2.不要过多的使用UITexture,因为每个UITexture都会增加1个DrawCall,所以一般UITexture会作为背景图出现在UI上,至于是小背景还是大背景都可以。
3.NGUI的图集不要太大,不要把很多个UI元素都放在一个图集里,在UI显示时加载资源IO速度会非常慢。我几种方式来管理图集,例如每个UI一个图集,大于300*100宽度的图不做图集,抑或一个系统模块2个图集,甚至我还测试过以整个游戏为单位来划分公共图集,按钮图集,头像图集,问题图集等,但这种方式最终以图集过大IO过慢而放弃,这些图集的管理方式都是应项目而适应的,并没有固定的方式,最主要是你怎么理解程序读取资源时的IO操作时间。
4.在开发中,尽量用Free分辨率来测试项目UI的屏幕自适应效果,不要到上线才发现自适应有问题。


UI屏幕自适应的代码:

[c#] 纯文本查看 复制代码
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;
}

 

5.将UI界面拆分以及固定各个锚点,上,左上,右上,中,左中,右中,下,左下,右下
6.要充分的管理游戏中的UI,不然过多的UI会导致内存加速增长,而每次都销毁不用的UI则会让IO过于频繁降低运行速度。我的方法是找到两者间的中间态,给予隐藏的UI一个缓冲池,当每次某个UI进行隐藏时判断是否有需要销毁的UI。或者也可以这么做,每时每刻去监控隐藏的UI,哪些UI内存时间驻留过长就销毁。
7.另外关于图标,像头像,物品,数量过多的,可以用打成几个图集,按一定规则进行排列,减小文件大小减少一次性读取的IO时间。
8.尽量减少不必要的UI更改,NGUI一旦有UI进行更改,它就得重新绘制MESH和贴图,因为重绘会比较耗CPU。
9.游戏中尽可能的不要使用动态字体,因为动态字体每次都会做IO操作读取相应的图片,这个是NGUI一个问题,费cpu,费内存。
10.设置脚本执行次序,在U3D的Project setting->Script Execution Order 中。由于NGUI以UIPanel为主要渲染入口,所以,所有关于游戏渲染处理的程序最好放在渲染之后,也就是UIPanel之后。UIPanel以LateUpdate为接口入口,所以关于渲染方面的程序还得斟酌是否方在LateUpdate里。
11.NGUI对于动态的移动旋转等的UI操作支持性很差,当有这种操作过多的时候,会使得屏幕很卡。解决办法就是,自己用程序生成面片,面片的渲染不再受到NGUI的控制。


对于美术资源大小问题:
一、2的N次方大小的图片会得到引擎更大的支持,包括压缩比率,内存消耗,打包压缩大小,而且支持的力度非常大。
二、减小图片的占用大小和内存方式有:图片大小变化(Maxsize),色彩位数变化(16位,32位),压缩(PVRC)。