Unity UI相关总结
UIGrid
加载面板时,如果面板中含有大容量的 UIGrid,可能会很卡。我们可以只加载 UIGrid 的前 n 个单元格对象,在显示面板之后,利用协程加载剩余的所有单元格,每帧加载 m 个。
同样的,含有大容量 UIGrid 的面板,在关闭时,调用 Destroy 函数也会导致卡顿。可以在关闭面板时,将UI面板的摄像机关掉,然后将该面板对象全部收集到LIST中,然后利用协程依次从下到上删除对象,每帧删除 x 个。
如果是不需要排序删除等操作的 UIGrid,感觉可以使用对象池技术,在滑动过程中,只保留显示区域和前后区域的元素,其它销毁。
如果需要排序大容量 UIGrid ,销毁再重新加载 item 肯定是不可取的,而按排序好的列表数据重新给 item 赋值也是比较慢的,可以利用 UIGrid 默认的排序方式(按 item 对象名称进行排序),修改 item 对象名称,然后刷新 UIGrid 即可。通常习惯将 item 对应数据项的主键作为 item 名称,是为了方便查找数据。如果用这种方式,就只能把 item 数据项主键信息存储到子节点中了,比如第一个子节点名,然后通过 item.transform.GetChild(0).gameObject.name 函数获取。
当滑动时,所有的 item 都会重新渲染,会很卡,这时可以在 move 事件里,不断的设置 item 的可见性,只让屏幕中的 item 处于 active = true 状态,这样滑动起来就会很流畅。
不同UI的相机的深度,在渲染顺序中优先级是最高的,depth 值越大,渲染的图像越靠前,与空间无关。
当前 Panel 的实际显示顺序由父级 Panel 深度和自身的深度共同决定。
http://blog.csdn.net/langresser_king/article/details/52818519
1、我们一般把资源和代码作为两个工程。资源工程导出assetbundle供代码工程使用。这么做主要是防止资源过多导致代码工程启动速度慢,影响开发效率。
2、尽量避免使用Resources文件夹。这个文件夹就相当于一个系统默认的AssetBundle。只不过不能增量更新。它会严重影响打包速度。我们把资源从Resources移出来后,打包时间从半个多小时,减少到2~5分钟。
2、Shader都要加入到Proejct Settings--Graphics--Always Included Shaders中。否则代码工程中没有使用到的Shader可能会被裁剪,导致的问题是Shader丢失。
3、Shader要打包到一个AssetBundle中,即Shader需要指定一个AssetBundle包名。如果Shader没有指定的话,那么每个AB包都会包含这个Shader。一方面造成资源浪费。另一方面当Shader被修改的时候,所有的模型都需要重新导出。另外由于我们代码工程里面肯定也维护了一份Shader,模型实际使用的Shader是它自己包内的,不是代码工程的Shader。
这里要注意,2和3必须都要做。之前我认为加入到Always Included Shaders中,Unity打包ab的时候就不会打包Shader。然而并不是这样。这个列表只负责预先加载Shader。防止资源被裁剪,以及临时加载造成的卡顿。
4、Unity打包后的Shader是平台相关的,Editor下是无法直接使用的。所以Editor下加载AB包中的模型或特效会出现Shader错误。这个时候需要重新指定一下Shader,即遍历所有的Render把Material的Shader重新附下值。
打包AssetBundle时,不注意的话,某些Shader是无法打包到AssetBundle中的。这两天一直被这个问题困扰,抽空就研究了一下。