效率问题---节点删除等

猜测一 :大量节点会导致帧率下降

 

懒得去验证 至少如果可以没有这么多的节点也能好使 就应该去掉 。若无必要勿增实体

蓝特尼斯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的效率 哪个高些 

posted on 2010-12-13 20:03  minggoddess  阅读(333)  评论(0编辑  收藏  举报