谈到游戏中的性能优化,说白了就是如何提高帧率和降低内存。
提高帧率的基本原则就是减少DP次数,还有是找出时间消耗高的程序代码加以修改。
但引擎涉及的东西非常多,有时优化要从多方面入手,下面一个一个来说明。
首先是水体渲染的优化:
现在很多游戏的习惯做法就是把水放在地某个高度的位置,然后地形在上面,从裁剪的角度来看,只要看得到地形,水是必然会渲染的,但如果我们看到的地形都是在水的上面,那这样渲染就太浪费了。其实有个很简单的做法,就是把地形的block,当然,我们可以把block再细分成一逻辑上的block,每个block要记录是否有地形的顶点在水的下面,有的话,如果这些block要渲染,那水也就渲染,否则水就不渲染。
地形优化:
四叉树地形LOD是最基本的优化方法了,不过这里要注意一点,每个地块对应不同LOD加上不同裂缝组合的indexbuffer,如果一开始把所有这些可能存在的indexbuffer都创建出来,那内存会非常大。我的做法是:当用到某个IndexBuffer的时候才实时创建,这样大大减少了内存。因为有很多种情况下的IndexBuffer在实际情况下是不会用到的。
粒子系统的优化:
传统的粒子系统的做法是在CPU上计算好粒子的四个顶点位置然后再填入纹理,现在有种优化方案是:定义粒子的顶点格式只有中心点和width,height,在CPU上只计算实时的中心点位置与width和height的大小,然后在GPU上再根据这些数据计算回粒子的四个顶点。
这种优化方案可以减少粒子在CPU上的运算量,但虽然利用到shader。
还有是粒子系统要共享VB和IB哦。
骨骼动画优化:
利用GPU计算顶点是骨骼动画优化的最有效手段,现在很多人的做法是只把骨骼动画的矩阵转到GPU,然后在GPU计算每个顶点的位置。这种做法受到了shader寄存器数量的限制。其实还有一种做法是把矩阵写入一个1行的浮点纹理,试想一下,如果是1X1024的浮点纹理,那可以存1024 / 4 = 256个矩阵(1个像素是R32G32B32A32F四个浮点的纹理),这种方式要求显卡支持并占一定的带宽。
模型渲染优化:
可以利用hardware instancing,LOD等方法。带骨骼动画的模型,在DX10以上可以实现骨骼动画instancing。
场景优化:
现在流行occullsion优化,就是把被遮挡的物体不渲染出来,我简单地说一下这种实现的原理:
开一个RTT,把在视锥范围内的渲染物取AABB,然后把这个AABB赋一个颜色(每个物体的AABB颜色都不一样),然后渲染的时候把这个颜色作为输出颜色渲染出来。因为开了深度,如果在后面被完全遮挡的物体,那最终这张RTT纹理是不存在这个物体的颜色,根据一些方法可以知道这个纹理是否有这颜色,然后通过这个颜色索引回该物体,然后把它剔除掉。DX9的occullsion query就是这样弄。还有Occlusion Culling,我相信原理也是类似这样。
陆续更新中……