游戏中的帧率优化

什么是帧率?

简单来说就是1秒内屏幕渲染刷新多少次。

那影响帧率的因素有哪些呢?

既然帧率是屏幕1秒内刷新的次数,那我们就看看在游戏中每次渲染都干了什么?
首先游戏中有各种各样的gameObject(后面简称GO),每次渲染之前都会进行一些逻辑计算来更新这些GO的状态(比如位置、颜色、贴图等等),然后CPU把这些GO更新的状态信息传递给GPU,因为GO数量很多,所以游戏引擎会尝试把相同混合模式、相同贴图以及层级邻近的GO进行合批,这样可以减少CPU到GPU传递信息的次数,我们也把这个传递过程称为一次drawCall。GPU拿到数据后就开始做渲染的处理,比如深度检测,颜色混合,光栅化等等,最后将所有的物体都缓冲到一张贴图上,交给屏幕去渲染。

那么在这个过程中,主要就是
1、逻辑计算:包括一些事件、数据的处理,更改GameObject的状态等等。我们的逻辑代码如果有比较耗时的操作,就会影响到帧率。
2、DrawCall:一次渲染如果drawDall次数过多也会影响到帧率。
3、GPU渲染:如果游戏中有光线,处理光栅化或者光线追踪这些比较复杂的计算,那肯定也是会影响到帧率的,所有很多3A游戏里面光的渲染效果很好,就需要性能比较好的显卡才能带动。但是如果是没有光这些复杂计算,GPU的渲染速度是很快的,所以正常不需要关心GPU的问题。

那么这就比较明显了,平常游戏中想解决帧率问题,大部分还是关注以下两点:
1、逻辑代码优化:可以通过一些性能测试工具(比如腾讯的PrefDog、Google浏览器的Performance),找到比较耗时的方法,根据实际情况进行优化。
2、降低DrawCall:尽量让场景中的GO满足合批的条件。

如何降低DrawCall?

想降低drawCall,就要想办法让场景中的GO满足合批的条件,我们需要注意哪些呢?
1、层级相邻,因为引擎的渲染都是按层级来处理的,比如A和B本来可以合批的,只需要一次drawCall,但是中间插一个不能合批的,那就会打断合批,drawCall就会变成3次。
2、贴图相同:
图片:我们就可以将散图合并成一张大图(游戏引擎一般支持自动图集)
字体:可以使用BMfont,或者可以选择游戏引擎文本组件自带的字体缓存模式(实际上也是在运行中把字体缓存到一张贴图上)
3、混合模式相同:混合模式不同意味着GPU要执行不同的着色器程序,所以不能合批。
4、其它:比如字体描边、spine动画、遮罩这些都有可能影响到drawCall。

游戏引擎在开发过程中是可以看到实时的DrawCall次数的,具体细节的东西可以再结合实际场景调试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值