提交需求
赛事与广告咨询合作,请填写需求表单,我们会在第一时间与您联系!
关注CGJOY在线课堂▲每周get新干货
本文内容来自于CGJOY会员,kylda,感谢他的热血提供。也欢迎各位访问我们CGJOY论坛:http://www.cgjoy.com。
在论坛里看了很多帅气的特效,确实感觉不错.但是在移动平台的游戏项目,由于硬件限制,特效尤其是3D特效,效果经常大打折扣。
这是篇讲解移动平台上美术优化尤其是特效优化的文章,主要目的是从游戏美术人员的角度分析移动平台的美术优化技术,尽量少牵扯复杂的程序知识,而是关注于美术同学实际遇到的问题和解决方案.当然也会讲解些底层知识,进一步提高美术人员尤其是特效人员的装逼能力。
高能预警
需要注意的是,我这里使用的是unity引擎做示范,但实际的技术是各个引擎通用的,只是优化侧重点和工具不同。
美术测试环境和Fillrate
1.测试环境的搭建
制作移动平台的游戏项目,一个优秀的美术人员应该学会怎么去评估自己资源的消耗.也就是,把所有相关代码去掉,纯美术环境下游戏的运行效率.一个简单的做法就是,把你们的场景文件打开,同时在这样个场景上运行的角色模型动作和特效放上去(比如你想在这个场景中同时出现10个角色放技能,那就模拟游戏环境随机丢10个带动作的角色10个技能特效以及附带受击效果),打包到手机上运行,然后用profiler这类工具来检测下运行运行效率.关于profiler这类工具的使用,百度有详细的教程.比如,要想检查某些美术资源(比如一些特效)的消耗,我会在自家的场景里(下面测试我使用里一个简单的场景和一个特效切换脚本,附带的脚本我后面会提供下载)把想要检查的特效放到Element0~element4中,分别测试运行效率。
一.填充率(fill rate)和overdraw. 之所以一开始想说的是Fill rate,而不是draw call或者内存或者shader运算这类,是因为Fill rate造成的瓶颈在移动平台特别明显,并且有一定的隐蔽性不容易被美术人员量化和察觉.下面一个举一个特效上的例子来说明问题.
下面是一个常见的爆炸波贴图,用的是普通的alphablend材质(为了让贴图使用ETC1压缩,在shader中把alpha贴图单独拆开了,这个以后说内存优化时再说).然后做一个简单的粒子发射器,然后用这个粒子发射那个贴图的面片模型,面片模型在生成过程中做缩放和旋转动画.这也是特效人员常用的一种扩散波样式.为了问题明显些,我吧生成模型的rate打到比较大的数值200.
接下来问题来了.要发射的是什么样子的面片?我下面有个2个面片模型,一个是中间镂空的圆环,一个是最常用的4边形,可以看到面数差距很大,我想基本上特效人员都会用4边形而不是面数高的圆环吧?那在这种情况下实际运行效率如何。
我们在把刚才的粒子发射器成2个,分别在水平面上发射高面和低面的模型.下面是2个粒子发射器运行时的截图,可以看到,高面粒子场景生成了1万4的的3角面,而低面的场景只有1.4k,10倍的差距.其实眼尖的同学已经注意到了FPS,高面的渲染时间是0.8ms,而低面的是2ms.低面的场景比高面少了1w多边形,渲染时间反而多了一倍!
把场景打包到手机上运行,用proflier去检查再次验证了这个结果:
在测试手机上高面场景是81ms,而低面是140ms
为什么我们明明”优化”了多边形数量,渲染效率反而降低了那么多?
从中作怪的就是现在要说的Fill rate和overdraw.
unity的overdraw视图选项是可以描述游戏画面的Fill rate消耗,重叠渲染的层次约多,overdraw显示越亮,fill rate越大.我们开启unity 视图的overdraw选项,可以看到,但是高面的粒子由于模型中间挖了洞,边缘也被切成了圆,导致overdraw比低面亮白部分少了很多.
百度搜索像素填充率可以看到详细的解释,作为美术人员不用纠结于那么多专业术语.记住一个事情就行:fillrate和游戏分辨率,渲染混合复杂度,游戏帧率成正比.特效人员常用的Add,alphablend这类半透明overdraw都会增加混合复杂度.而叠加的层次越多,overdraw越多,需要的填充率越大.而手机屏幕的分辨率经常动不动就1080p,2k屏的,所以最后计算的消耗是很大的,导致填充率容易成为美术上的性能瓶颈.
这也从另一方面解释了为啥我们经常发现1000块钱的安卓手机比2000块钱的手机跑同一个游戏快,因为低端机一般是720p,而2000的手机一般都到1080p了,填充率要求上 1920X1080比1280X720大太多了嘛.
知道了这一点,美术人员,尤其是特效人员就能在保证效果的情况下,减少fill rate对渲染效率的影响,也就是减少overdraw.这样方案就很多了,比如粒子生成rate是50,透明度是10%的话,你改成rate是25,透明度是20%,很可能效果基本不变,而运行效率却提高了一倍.又比如如果面片要大范围覆盖场景,那么就尽量减少覆盖的面积和层数,甚至可以用镂空这类做法来强制减少overdraw的范围.
更多内容请访问CGJOY论坛:http://www.cgjoy.com。
GJOY是全国最大的游戏动画,特效基地,拥有全国最多的游戏动画,特效,模型,UI,软件插件脚本,各类教程等资源。
报名咨询QQ:2880950227 、2880950223 【CGJOY在线课堂】游戏特效、游戏动画、游戏模型、游戏UI、游戏原画网络班(全年招生)和实体班(全年招生),业内知名大神带班。
大牛,别默默的看了,快登录帮我点评一下吧!:)
登录 立即注册