Husman

人は夢見る ゆえに生きるもの
posts - 14, comments - 37, trackbacks - 0, articles - 0
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

OGRE引擎优化的几点建议

Posted on 2012-08-30 03:47 Husman 阅读(2003) 评论(0)  编辑 收藏 引用

1)渲染队列的优化。ogre渲染队列设计的效率太低,渲染队列用了很多map,每次往队列里加一个renderable用了4次map查找,每帧成千上万的renderable往队列里添加,可见性能损失有多大。建议简化渲染队列,预先定义一个队列数组,每个队列是渲染物体的集合,这样每次add渲染物的时候逻辑就是,通过groupID作为数组下标,得到那个队列,然后再往队列里加渲染物,为了效率的提升可以把队列做成池的形式。每个池里的元素保存的是renderable的指针等信息。
2)RenderState,Texture,TextureStageState,SamplerState,VertexBuffer,IndexBuffer,RenderTarget的设置都做成缓存的形式。这样可以避免DX debug mode下的warning.需要注意的是reset的时候强制设置一下。
3)shader寄存器常量设置的时候加缓存,Commit的时候只管被改变过的寄存器。
4)instance的优化,staticmesh,grass,可以做成instance的形式,不得不说,ogre1.6的instance的做法是Shader Instancing,他的做法就是合并VB,然后在shader里面传一个vb的索引,这个做法有个很致命的缺点就是增大了显存的开销。VB的大小是原来的N+1倍,不值得推荐,建议用SetStreamSourceFreq。
其实带骨骼的mesh也可以做成instance,只是每次draw的时候instance的个数有限制,要看每个submesh带的骨骼数据。如果是类dota型的游戏,骨骼动画就没必要做instance了。
5)后期处理尽量复用rendertarget,backbuffer大小的rendertarget显存的开销还是比较大的。
6)建议把骨骼的计算放到另外一个线程上去。
7)多线程的资源加载也可以做些优化。ogre锁的粒度有点大了。

 


 

只有注册用户登录后才能发表评论。