[转]游戏中各种性能优化方法(不断更新)
2013-03-24 11:35
363 查看
http://www.cppblog.com/liangairan/archive/2013/03/23/198749.aspx
谈到游戏中的性能优化,说白了就是如何提高帧率和降低内存。
提高帧率的基本原则就是减少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,我相信原理也是类似这样。
陆续更新中……
谈到游戏中的性能优化,说白了就是如何提高帧率和降低内存。
提高帧率的基本原则就是减少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,我相信原理也是类似这样。
陆续更新中……
相关文章推荐
- android 性能优化(不断收集更新)
- AS3 小技巧 性能优化(不断更新中)
- 关于开发游戏时性能优化的一些方法
- 关于页面优化的方法收集(不断更新)
- javascript优化方法集锦(不断更新)
- 关于开发游戏时性能优化的一些方法
- 关于开发游戏时性能优化的一些方法
- 一些好用的方法,编写游戏的时候可能用的上!不断更新中_2009_04_23
- ASP.NET常用的26个优化性能方法开发者在线 Builder.com.cn 更新时间:2008-07-22
- 【不断更新】各种中文编码及其转义方法
- Unity之性能优化——不断更新
- MMR中用到的游戏性能优化方法
- 用ADO.Net实现Oracle大批量数据更新优化处理方法
- ASP.NET中常用的26个优化性能方法(3)
- 常用优化组件和方法- Java程序性能优化--让你的Java程序更快、更稳定
- JDBC更新10W级以上数据性能优化
- ASP.NET中常用的26个优化性能方法
- 利用POI对EXCEL进行更新操作方法(性能大于WritableWorkbook)
- 总结使用Unity 3D优化游戏运行性能的经验
- 一文看懂各种神经网络优化算法:从梯度下降到Adam方法