什么是帧率?
简单来说就是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次数的,具体细节的东西可以再结合实际场景调试。
439

被折叠的 条评论
为什么被折叠?



