Вполне можно слегка (раза в два) увеличить скорость работы.
Для этого нужно создать свой класс для ноды, вполне подойдет уже готовый, достаточно его только слегка доработать.
создается экземпляр этой ноды. дочерние ноды добавляются как обычно.
только в нашей ноде в функции 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.
Но зато подходит для нод, которыми надо манипулировать (выделять. менять цвета, двигать)
ну если оптимизировать еще
for (u32 i=0, max_i=m->getMeshBufferCount( ); i<max_i; ++i) //getMeshBufferCount() кажись будет вызываться на каждом шаге, а это не надо { scene::IMeshBuffer* mb = m->getMeshBuffer( i); //if (mb) - если буфера нет, то мы сюда и не попадем {
как показали опыты, основные тормоза дают операции с матрицами.
типа этой
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
Тема в архиве.