Unity2D绘图效率研究原创.docx
《Unity2D绘图效率研究原创.docx》由会员分享,可在线阅读,更多相关《Unity2D绘图效率研究原创.docx(12页珍藏版)》请在冰点文库上搜索。
Unity2D绘图效率研究原创
[脚本]Unity2D绘图效率研究(原创)[复制链接]
上一主题下一主题
hog
学徒
∙加关注
∙发消息
只看楼主倒序阅读楼主发表于:
08-21
—本帖被hawk执行加亮操作(2012-08-21)—
一直以来对Unity的方便的框架和可视化的开发环境赞赏有加,但同时也存在疑问,如果用如此庞大3D游戏引擎框架开发纯2D的游戏,会不会存在效率上的瓶颈,所以有必要自己动手测试一下。
测试
测试手段:
2D纹理随机绘制
测试纹理:
512*512带alpha通道透明贴图
测试分辨率:
1366*638的工作区域
共采用了4种不同的方法测试纹理绘制,每种方法都采用相同的Shader进行绘制,用复杂度一致的C#语句进行控制,以保证结果的可比性。
测试效果:
方法一.Unity内置的GUITexture:
注:
GUITexture是不需要指定shader的,查阅网络资料,Unity在绘制GUI纹理时默认会调用一个叫Internal-GUITexture的shader,这个文件网上可以下载到。
自己改名复制一份,作为shader用于后3种方法,以保证shader层面的一致性。
GUITexture的xy坐标范围是0-1,00对应屏幕范围,比如0.5,0.5就是屏幕中央。
测试结果:
CPU:
每帧cpu时间在1ms上下
GPU:
在5ms-10ms范围内
方法二.Unity内置的Graphics.DrawTexture方法
注:
调用这个方法应该在OnGUI而不是Update,调用语句大致如下:
voidOnGUI(){
if(Event.current.type.Equals(EventType.Repaint))
{
Graphics.DrawTexture(newRect(Random.Range(0,ScreenWidth),Random.Range(0,ScreenHeight),512,512),tex,mat);
}
}
其中tex就是要绘制的纹理,mat是指定的材质,此处为copy系统内置的Internal-GUITextureshader.
测试结果:
CPU:
本以为这种方法应该是最接近底层效率最高的,没想到这种方式下产生了大量GUI事件和调用,cpu效率很低
GPU:
因为使用了同样的shader,GPU没有明显变化
方法三.建立一个Plane面片,将测试贴图赋予该面片
注:
这个方法就是Unity常规绘制物体的方法了,把一个物体赋予透明贴图和材质模拟纯2D贴图,改变面片的位置就可以改变贴图位置。
当然摄像机要设置为正交方式。
测试结果:
CPU:
基本上没有产生太多额外cpu负荷,居然和GUITexture方式效率差不多
GPU:
与上面两种方式负荷大致相当,因为多了一个实际的物体,所以gpu曲线中出现绿色(Opaque实体绘制)的包络线,略大于上面两种方式
方法四.NGUI界面工具的SimpleTextureWidget
注:
这是我最愿意用的方式,可以方便的使用NGUI的很多内建功能,实现高级控制,当然效率是个疑问。
NGUI的物体都经过了一系列变换、缩放,以保持系统的统一性,所以在控制SimpleTexture位置时要用LocalPosition
测试结果:
CPU:
这个结果在预料中,由于NGUI自身的体系框架代码要产生额外的cpu负载,结果比1和3方法要高,但是略低于方法2.
GPU:
负载和方法3相当,也多了实体绘制的绿色包络线。
其实NGUI用了大量的plane来实现各种界面载体,可以理解。
总结:
CPU效率:
1>3>4>2
GPU效率:
1=2>3=4
易用性:
4>3>1>2显然用NGUI方式最好控制也能很好的与界面结合自己用面片渲染2D图像效率高于NGUI,但是控制代码很多都要自己写,而GUITexture使用起来显然更麻烦些,至于Graphic.DrawTexture那是类似纯绘图指令了,任何控制都要自己考虑。
方法2看来可以完全无视。
在性能不那么敏感的情况下,NGUI显然是最好的选择,自己写的控制代码效率未必更高,况且NGUI还有很多内建的功能如精灵动画可以支持2D游戏开发。
在极端优化的情况下,抛开NGUI庞大框架自己用Plane或者GUITexture构建2D显示控制也是不错的办法,比如游戏背景卷轴、地图等,不需要太多控制的部分。
Unity框架虽然庞大,但是在此框架下浪费的CPU资源还算可以接受,而获得的方便自然不言而喻。
不过从4个cpu图可以看出,系统物理引擎在完全空载的情况下也消耗了很可观的CPU资源,如果这部分能有个开关屏蔽,效率可以进一步提高。
大部分2D游戏并不需要物理引擎。
目前好像没有发现能主动屏蔽物理引擎的方法。
优化
其实2D透明材质的shader也还是有优化空间的,大部分情况下,2d游戏我们只需要将图像在屏幕原样显示就行了,不需要什么光照模型、颜色混合等等,基于此思想,可以自己把shader最简化,以达到效率最大化。
下面是2种shader的gpu效率图比较:
上面是系统内建的透明shader,因为考虑了颜色混合、高光等,效率较低,下面是优化过的纯2d透明贴图shader,提升还是比较明显的。