unity 游戏开发过程中需要注意和后期优化的重点方向和难点分析(大白话理论篇)

来源:互联网 发布:ug8.0编程实例教程pdf 编辑:程序博客网 时间:2024/05/16 16:04

开发游戏也有近3年时间了,自己是做app移动开发出身,可能入手unity开发手机游戏,算是有点小优势,毕竟起码开始就有点unity它是怎么一步步转化为一个用户用的app。在用unity做游戏的时候,自己也尝试过使用cocos2d-x,感觉下来unity更加傻瓜式一点,更容易使新手上手,可以立马让一个初学者实现自己生产出一个东西的冲动,而且不需要配置复杂的环境等等。当时在职的公司也觉得使用unity来做一个商业3d展示外包同时还尝试开发一些小的单机游戏。好了闲话不多扯。。。



 随着游戏行业的竞争的越来越激烈,用户对游戏的体验,画面,玩法等等也越来越另类。这就自然而然的对我们开发者技术来说就要要求越来越严格。也就是说,你做的东西有可能就是一堆垃圾微笑。这个概率而且还是很大。。。。


  产品的事我们就不管了,下面进入正题。


如果你用unity做一些小游戏完全没必要去看这个了。这里主要是说一些优化还有一些前期开发需要主要的。


1.UI

开发中考虑:要慎重选择模式一个依赖注入的框架还不错strangeioc是mvcs模式的,解耦形式的。如果不用框架也是可以的但是代码有一点分层一定要做好,就是数据层和表现层,不然后面换UI的时候找代码,搞死你,到最后你会发现我想删了重做的想法都有了。到底用不用lua来做,这个其实意义不大,如果游戏考虑后期频繁更新可以考虑lua,如果影响不大可以自由选择,听说腾讯出了一个xlua类似注入式的不知道有木有大坑,可以玩下,比较靠谱的还是ulua和slua。就是代码细节问题距离说明下,序列化(说白了就是面板上面的拖拽。。。)一定要做好,Find,GetComponents,AddComponent等类似的方法,尽量少用,到最后自己都害怕产生的DC。还有单例模式表现层上面尽量少用,到后期想释放资源你发现怎么老是有个static的东西引用着找都找不到,大半是这个东西搞得鬼。在开发中。

中后期考虑:UI算是比较头疼的,NGUI来说,panel分层,采取动静分离和布局分离 不然lateupdate消耗很高,图集尽量按功能模块划分,图集要压缩ETC(android)Pvrtc4(IOS ),透明拆离自己可以考虑下。那些UI做预加载,不然有些超级大的UI在点击的时候初始化都要耗上1-2s甚至更高基本可以说用户都想GG了,这个就需要分好层级了不要一股脑所有的东西全部放在一个prefab里面,然后能异步加载的尽量做到异步加载。DC的问题很老套了一大把各种优化 我就不说了现在手机CPU配置都比较高 1 2百的DC基本无压力 。UI内存问题向来都是个比较大的问题,UI占得内存而且比重还是比较大的,图集是最大的,建议在做Assetbundle的时候图片和prefab做分离,这样在做动态释放的时候直接调用Resources.UnloadAsset(obj)就可以了释放掉图集而且还不卡等等。

基本上UI做到以上的几点没啥大问题了。

2.音频

开发中考虑:没啥好说的,直接单例控制一个manager就可以了,做不做缓存池可以考虑下。

中后期考虑:音频压缩模式bgm使用streaming,短音频decompress on load,要不要做预加载防止在角色放技能的时候卡顿,在考虑assetbundle的时候没有绝对的方案,但是有一点尽量使冗余做到最小。


3.动态的prefab和资源(技能,特效,怪物等)

开发中考虑: 首先就要考虑缓存池,如果频繁常见和destroy一个,这样不仅造成CPU的额外消耗还会产生大量的内存碎片和也是mono托管推不断地增大。Assetbundle和Assets的异步加载,在mmo游戏中一般不会去做一些预加载怪物,Npc,其他玩家等等只能依靠异步的加载,这就继续缓存池的重要性。

中后期考虑:缓存池太大了,就要考虑选择合适的时机去释放,让内存得到合适的释放,减少整体游戏的内存压力。异步加载瓶颈,unity的异步加载其实也是从主线程中去榨取CPU和GPU,如果一帧里面塞的东西很多也会造成线程等待和lock,所以后期就要进行分帧加载如在一帧开始加载直到完成,在开始下一个加载,如果分帧也会造成线程lock,那就要考虑大资源(贴图,音频,animationclip)是不是拆解分帧加载,这样做的目的就是为了防止游戏卡壳,保证游戏的流畅度。

4.Shader

unity 现在支持游戏书写自己的shader,但是如果很复杂的shader。shader在解析和GL绘制的也是非常消耗CPU的。怎么办那,我们可以给shader预热,可以看下warmup方法,建议不要用全局预热的那个方法会很卡,可以自己自己收集进来所有的shader然后进行逐个预热。

5.Assetbundle

资源管理没有绝对的方案,只需把握住一点。冗余尽量的少。这样额外消耗内存的压力就会下来。说下我们的,所有的shader是一个bundle,所有的UITexture不要序列化近如Prefab,所有UI图集独立,UItexture分类别,音频跟随其他的采取的是依赖打包,首先收集依赖标记依赖计数,>1的资源作为share资源共享出来。这样其实还是会有冗余,那就是音频可能还有一些材质也会冗余。不过还好后期还是需要优化的。













0 0