一个游戏地图系统的实现设想

由于在我的游戏项目中需要构建一个地图系统。而我对这个地图系统加了一些特殊限制——所有东西都必须由简单几何体构成,这是为了后续开发而设定的。
最初的想法是直接用3dsmax构造一些简单几何体的mesh文件,然后用OGRE最基本的entity绑sceneNode进行显示,但是进行压力测试后发现根本不可行,因为速度实在太慢。哪怕只是显示2000个正方形平面,也就是8000个顶点,速度就已经大幅下降。而这却远达不到我的要求。
尽管在OGRE的例子上看到instancing和static geometry的优化方法,但我一直没有明白为何原来的方法会如此的慢。后来在读了GPU Gems之后才恍然大悟。
直接通过绑定1000个正方形entity来进行显示,那么OGRE引擎将要调用1000次API来渲染1帧。而调用API是十分好时的,这直接导致了帧数的大幅度下降。
而GPU Gems上提供了几个方案进行优化,其中有instancing,另外有一个segment buffer,大致原理就是将场景分成多段(segment,也就是一定范围内的东西),一个段内的顶点合并到一个缓冲(buffer)里头,然后一次性绘制
OGRE的演示例子grass是利用static geometry一次性合并大量grass的模型,这样每帧只需一次API调用即可渲染所有草。而且由于是static,所需传输的数据两将大幅缩减。
然而static geometry的缺点是上面的顶点不便于移动。范例写了一个vertex shader对顶点进行偏移,实现了草摆动的效果。
基于这个做法,我们可以建立几个static geometry,每个static geometry里拥有大量形状相同的简单几何体,然后在读取地图数据后按照数据对每个几何体的顶点通过shader移动到正确位置,就可以实现一次性动态绘制大量几何体。
当然,这个做法似乎也有些问题。在地图绘制完成后,上面的几何体不移动,然后我们却需要每帧都用shader进行调整,而且不经过视锥检测的话还会浪费大量资源在那些看不见的几何体上。所以这个方法依然处于考虑。中。instancing依然处于研究中。如果instancing可以处理不同大小不同材质的结合体的话,那instancing也是值得利用的。
如果有更好的方法我将会及时补充上来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值