有幸参加了Unite 2016 Shanghai unity开发者大会,这里做一些简单总结
一.日本Marza 分享 《The Gift》
Marza用unity做渲染,加上一些自己的扩展技术实现了效果非常棒的动画效果,《The Gift》就是Marza团队在unite向开发者展示的作品,当然他们也简介了他们怎么减少DrawCall,做presudo-instancing技术……不过都是思路,很难get到具体做法,公司网址。整体介绍虽然跟我们并没什么关系,但是也告诉我们一个信息:unity做渲染的品质还是可以的,哈哈。最干货的是Marza在github上开源了他们做录屏的库,还是可以看看的(可惜的是资料都是日文)
二.Unity5.4 渲染改善
a.实时渲染
Unite开场相关嘉宾就开始鼓吹unity5.4以后的实时渲染有多么牛X,播放了一段电影般画质的CG,一开始由于还陷入误区,以为实时渲染是unity新技术呢,结果查了各种资料也没有相关介绍,最后才发现原来仅仅是为了鼓吹unity对渲染的优化可以达到很高的品质,并不是某种新技术,汗……
不过播放的那段CG动画的确很吊,unity对渲染的处理也还是可以的,哈哈
附上两个关于渲染的文章链接:
b.一些新技术
1.Mulithreaded Reandering多线程渲染在unity5.x以后就开始慢慢使用了,但是unity5.4有使用了一个DW(double wide rendering 具体是什么还得5.4出来后看看)据介绍可以使得整体渲染效率提升30%左右吧
2.Cinematic Image Effects: 对影视常用效果提供了一些脚本和资源,大都作用已Camera上,并且是开源的
3.progressive LightMapper : 具体是什么网上资料很少,据描述应该就是一个渲染优化的技术
4.Memory Profiler : unity开发的一款开源内存监视器,用起来还是蛮方便的
5.另外发现了unity的开源仓库原来在,里面有不少unity开源项目,如:AssetBundle、IAP、Networking……值得学习一下
三.unity 提出的一些常见优化
a.Asset Auditing
在资源导入时进行检测,避免资源出错,规范资源命名等,具体做法可以参考AssetPostprocessor类,直接在文档里检索就可以了
b.Common Rules : Texture
1.Make sure Read/Write is disable
2.Disable mipmap if possible
3.Make sure textures are Compressed
4.Ensure sizes aren’t too large
2048*2048 / 1024*1024 for UI atlas
512*512 or smaller for model textures
c.Common Rules : Model
1.Make sure Read/Write is disable
2.Disable rig on non-character models
3.Enable mesh compression
d.Common Rules : Audio
1.MP3 compression on IOS
2.Vorbis compression on Android
3.”Force Mono”for mobile games
d.set bitrate as low as possible
e.内存优化建议
1.unity mono堆内存的分配是只增不减的,也就是说尽量降低在堆上内存分配的峰值
2.减少在临时内存的分配,不然会提高GC频率,对帧率有很大影响
3.合理使用匿名方法和闭包,避免不必要的内存分配
4.避免装箱拆箱的操作
5.避免使用反射的机制去序列化或反序列化json,可以使用unity自己提供的JsonUtility(5.3以后支持)
四.VR 介绍
1.unity 对VR做了一些渲染层的优化,具体就是一定层度上提高VR Game 的渲染效率,当然只有默认支持的VR设备才可以使用到这些优化。目前已经支持的只有Oculus,unity5.4以后就会支持htc Vive 和PlayStation设备,当然也介绍了一些简单用法,在文档里直接可以查到
2. htc VR 产品经理分享:
a.VR目前还无法被玩家接受,主要受限于硬件设备
b.VR 的体验并不完全在于帧率保持在90帧,更重要的是不能出现帧率的频繁波动,也就是说稳定的帧率>=75fps可以有降低眩晕感
c.VR 的性能问题给开发者预留的发挥空间并不多,所以只有必须对资源和代码做的精益求精才能做出靠谱的产品
d.VR 的UI,VR中尽量少用UI
e.htc vive 推荐了一款NewtonVR(免费的vive 输入套件)
五.暴风产品经理分享
1.资源管理:把unity所有资源标识一个单独的key,做一张key与其存放路径的映射表,资源的房问就可以通过解析映射表完成,隔离了项目中对路径的依赖,不过要维护这种索引表还需要做一些支持工具,也有一定得代价
2.资源再次压缩。很多项目也采用了多AssetBundle的再次压缩操作,不过值得一提的是:暴风的团队他们根据自己的需求改了一些压缩算法,使得压缩率更高了
3.标准化资源存放路径,几乎所有项目都是遵守这种规则的,不过值得一提的是,我们可以对使用前面的AssetPostprocessor完成对资源的自动化处理
4.资源更新:在对资源更新有比较大的需求时,他们觉得使用untiy的www去更新资源效率太低,于是他们使用C# 的httpRequest加上多线程去下载资源,断点续传,更好的保证了资源下载的效率。
5.针对Json的数据压缩:他们主要提出了这么一个优化想法,当有一个序列itemList[{name : XXX1 ,price : 12},{name : XXX2 ,price : 13} ,{name : XXX3 ,price : 14} ……. ],这时我们发现数据中大量包含了“name”,“price”等关键key,造成数据冗余,这时可以选择以这种方式去做压缩itemList[{name : XXX1 ,price : 12},{ XXX2 ,13} ,{ XXX3 ,14} ……. ],减少了重复key的冗余
6.对代码的加密。这里也是很常规的做法,重新编译mono,从而加密dll,实现代码加密
7.兼容和适配:他们为了兼容各种低高端机型,做了各种对应的配置文件,当玩家首次进入游戏会高数服务器当前的机型,然后下载一份对应配置表,这样很大层度上可以解决机型适配问题。但是显而易见,这样做的工作量还是蛮大的
六.Instancing 技术分享
instancing技术网上信息很多,不做过多介绍,有兴趣的自己百度
1.instancing 可以减少drawCall 减低CPU的消耗,无法减少GPU负载。根据展示的demo,有一个一万多小石头的场景,draw call已经达到一万多了,但是使用instancing技术后draw call可以降到63
2.只有大量使用相对材质和相同网格的物体使用instancing技术才有价值,典型的植被系统
3,下图是一些使用注意事项
七.总结
unite大会大多数都是广告时间,但是也可以感受到新技术的气息,尤其高内暴风的干货分享值得点赞,遗憾的是,unite展示的各种游戏中没发现一款国内团队的作品,国内两大巨头网易和腾讯的分享也是广告+无聊的吹嘘。总体上说两天的收获勉强对得起1.2k的门票吧,哈哈