猜测一 :大量节点会导致帧率下降
懒得去验证 至少如果可以没有这么多的节点也能好使 就应该去掉 。若无必要勿增实体
蓝特尼斯1。不到必要的时候不要加载资源,2。一旦确定后面有一长段时间不需要的资源,必须立刻卸载
这里的资源包括任何进入内存的对象,比如文件句柄、内存分配,对象分配等等
所以这里是必须优化的
猜测二:每个cube都画了6个面,实际上紧挨的两个cube中间遮盖住的面是不用画的
要解决这个问题一个可能的方法是 用manulobj只画 外层的面至于效率如何。。
如果能开ogre mesh 的遮挡面剔除HBR 此问题可解
有关节点删除问题 看到一篇好帖子
How to efficiently add and remove 3D-objects from the scene during run-time (like rockets being fired)
他说动态加载mesh的时候 会非常慢尽管在小项目里看不出差别,,,解决方案是 在createscene的时候加载一堆mensh放到stack里面 用的时候pop 不用了就push
上代码吧 代码总是容易说明问题
stack rocketEntities; for (unsigned int t = 0; t < 100; t++) { char tmp[20]; sprintf(tmp, "rocket_%d", t); Entity* newRocketEntity = mSceneMgr->createEntity(tmp, "Rocket.mesh"); newRocketEntity->setVisible(false); rocketEntities.push(newRocketEntity); } class Rocket { protected: SceneNode* rocketNode; string rocketEntityName; public: Rocket(const Vector3& position, const Quaternion& direction) { rocketNode = static_cast<SceneNode*>(sceneMgr->getRootSceneNode()->createChild()); Entity* rocketEntity = rocketEntities.top(); rocketEntities.pop(); rocketEntity->setVisible(true); rocketEntityName = rocketEntity->getName(); rocketNode->attachObject(rocketEntity); rocketNode->setOrientation(direction); rocketNode->setPosition(position); } ~Rocket() { Entity* rocketEntity = static_cast<Entity*>(rocketNode->detachObject(rocketEntityName)); rocketEntity->setVisible(false); rocketEntities.push(rocketEntity); sceneMgr->getRootSceneNode()->removeAndDestroyChild(rocketNode->getName()); } };
引用http://www.ogre3d.org/tikiwiki/OogstsHowTo
应该可以用到方块上的这个原理 每次的那四个小块 就不要再clone了,总体结构似乎要重新做啊。也不知道clone和stack的效率 哪个高些