Войти
IrrlichtФорум

Как увеличить FPS не манипулируя с мешами

#0
17:50, 17 июня 2010

Вполне можно слегка (раза в два) увеличить скорость работы.
Для этого нужно создать свой класс для ноды, вполне подойдет уже готовый, достаточно его только слегка доработать.

создается экземпляр этой ноды. дочерние ноды добавляются как обычно.

только в нашей ноде в функции OnRegisterSceneNode()
не вызывается ISceneNode::OnRegisterSceneNode(), чтобы поставить в конвеер дочение ноды, для стандартного рендерера будут невдимы.

Дальше в функции render() нашей ноды пишем:

//перебераем дочерние  ноды
ISceneNodeList::Iterator it = Children.begin();
            for (; it != Children.end(); ++it)
            {
                n =(IMeshSceneNode*)(*it);
                //проверка на видимость ноды камерой
                if(!SceneManager->isCulled(n))
                {
                    m=n->getMesh();
                    for (u32 i=0; i<m->getMeshBufferCount(); ++i)
                    {
                        scene::IMeshBuffer* mb = m->getMeshBuffer(i);
                        if (mb)
                        {
                            const video::SMaterial& material = ReadOnlyMaterials ? mb->getMaterial() : Materials;
                            driver->setMaterial(material);
                            driver->drawMeshBuffer(mb);
                        }
                    }
                }
            }

за основу была взята тестовая программа отсюда и добавлен новый вид ноды
http://www.elmigo.ru/content/331

пример прилагается.
Пример нового вида ноды

По сравнению с обычным методом создания и рендеринга нод (вариант 1) мой пример (вариант 3) в 2 раза быстрее, но, конечно сильно остает от варианта 2.

Но зато подходит для нод, которыми  надо манипулировать (выделять. менять цвета, двигать)

#1
22:10, 17 июня 2010

ну если оптимизировать еще

    for (u32 i=0, max_i=m->getMeshBufferCount(); i<max_i; ++i) //getMeshBufferCount() кажись будет вызываться на каждом шаге, а это не надо
    {
        scene::IMeshBuffer* mb = m->getMeshBuffer(i);
        //if (mb) - если буфера нет, то мы сюда и не попадем
        { 
#2
11:50, 18 июня 2010

как показали опыты, основные тормоза дают операции с матрицами.
типа этой
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);

IrrlichtФорум

Тема в архиве.