forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты C++ (http://forum.boolean.name/forumdisplay.php?f=56)
-   -   C3D Engine (http://forum.boolean.name/showthread.php?t=16433)

pozitiffcat 09.06.2012 15:01

Ответ: DG3D Engine
 
Цитата:

Сообщение от MoKa (Сообщение 229894)
Не забывай о том что пишешь то ты открытый движок, для разработчика.

Движок закрыт в DLL. Просто функции движка позволяют на основе него набросать побыстрому свой каркас, я бы даже сказал не позволяют, а на этом движке необходимо затачивать свой удобный каркас (в PDF есть пример с освещением)... это лишь набор функций, что бы не ковыряться с гапи, а быстро начать делать что-либо... причем будут дополнения в виде bullet, physx, squall , etc.

HolyDel 09.06.2012 15:52

Ответ: C3D Engine
 
новая версия работает медленнее. в два раза. когда все кубы видны. причем как то странно работает - если просто отъехать от стартовой точки назад - то фпс 70 если смотреть на кубы сверху то фпс 30. wtf?
нет, не так. если ему дать просраться на 5к фпс, то потом при взгляде на все кубики фпс падает до 30-ти. возможно проблема в моих драйверах. да - это стопудово в драйверах дело. аксель себя ведет также - если не дать просраться демке, то на 4к кубах она дает 900фпс вместо 750... странно, надо думать как это дело лечить.
обертка над гапи не должна проигрывать в производительности конструктору типа unity.

pozitiffcat 09.06.2012 16:42

Ответ: C3D Engine
 
O_o у меня наоборот быстрее (NVIDIA GT240, Intel E3300) 50 - 60 fps давало, вместо прошлой 20-25, я вообще не понимаю как у меня такая маленькая производительность.. я вообще все убирал, и все равно мало FPS.. как ты компилишь? MSVS ? Может какие-то особенные флаги компилятора?

HolyDel 09.06.2012 17:04

Ответ: C3D Engine
 
я ж написал что ето в моем железе проблемы.
работать стало быстрее. с 60 фпс до 70.
если не давать демке работать на 1000+ фпсах.

я у себя походу sleep-ом буду ограничивать фпс тысячей. а то какая-то фигня творится после того, как видюха или винда поработает на высокой частоте обновления.

pozitiffcat 09.06.2012 17:06

Ответ: C3D Engine
 
Понятно... конечно странная фигня... у меня Win7 x86, Nvidia - такого глюка нет, специально сейчас проверил...

pozitiffcat 10.06.2012 01:31

Ответ: C3D Engine
 
ППЦ я не понимаю почему такая задержка
HolyDel:
В ядре:
сначала вызывается scene->draw();
в сцене лежит std::vector<CNode*> _nodes; //это список объектов для отрисовки
кратко, что делает CScene::draw()
Код:

...............
        glm::mat4 m_view = camera()->matrix_view();//один раз за фрейм получаем матрицу вида
        _frustum->CalculateFrustum(m_view);//считаем фрутсум
        for(int i=-1;++i<_nodes.size();)//проходим по всем нодам (ентитям) (этот метод цикла быстрей итераторного)
        {
                CNode* curnode = _nodes[i];//берем 1 раз за итерацию объект массива (так быстрей)
                if(curnode->vbo()!=NULL){//если есть геометрия
                        glm::vec4 cur_pos = curnode->position(true);//определяем позицию (4 столбец из матрицы)
                        if(_frustum->CubeInFrustum(cur_pos.x,cur_pos.y,cur_pos.z,curnode->vbo()->box()))//эта строка вообще никак не влияет на скорость как ни странно
                                curnode->drawVBO(m_view); //рисуем геометрию
                }
        }
.........................
}

вот код CNode::drawVBO
Код:

void CNode::drawVBO(glm::mat4 &m_view)
{
        if(!_effect || !_visible) return;
        _effect->setWorldMatrixSemantic(matrix(true));//тут ничего страшного тупо передача в шейдер не должно тормозить
        _effect->setViewMatrixSemantic(m_view);
        _effect->setProjMatrixSemantic(APP->render()->projection());
        _effect->setTexture0Semantic(_texture);
        _shader_queue->bind();//тут пусто, это передача кастомных параметров в шейдер
        while(_effect->pass())//тут проходим по всем проходам, тоже ни чего мудреного проход один в шейдере
        {
                _vbo->drawBuffers();//рисуем буфферы на гапи
        }
        //_shader_queue->unbind();
}

код отрисовки буферов на гапи

Код:

if(_vbuffer && _ibuffer)
        {
                glBindBufferARB( GL_ARRAY_BUFFER_ARB, _vbuffer );
                glVertexPointer( 3, GL_FLOAT, 0, 0 );
                if(_nbuffer)
                {       
                        glBindBufferARB( GL_ARRAY_BUFFER_ARB, _nbuffer );
                        glNormalPointer(GL_FLOAT,0,0);
                }
                if(_tbuffer)
                {       
                        glBindBufferARB( GL_ARRAY_BUFFER_ARB, _tbuffer );
                        glTexCoordPointer( 2, GL_FLOAT, 0, 0 );
                }

                {
                        APP->render()->dips_up();
                        glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, _ibuffer);
                        glDrawElements(GL_TRIANGLES,_cnt_indices,GL_UNSIGNED_SHORT,0);
                        //glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
                }
        }

мля!! что тут может тормозить я не понимаю!! я даже бинды убирал, эффект от этого не поменялся.. у мня 4к кубов 40 фпс, axel 255!!! юнити 50, все остальное 80

HolyDel 10.06.2012 02:30

Ответ: C3D Engine
 
ты передаешь три матрицы. а я одну. и в шейдере их множишь получается (для каждой вершины) а я один раз, правда на цпу, так быстрее.

ты проверку на фрустум делаешь по боксу, а я по сфере, так быстрее.

ну и насчет сеток - у тебя один vbo/ibo на сцену, или 4096? у меня один, и у блица с хорсом тоже, за остальные не скажу. хотя это не так сильно влияет.

pozitiffcat 10.06.2012 02:43

Ответ: C3D Engine
 
спасибо что посмотрел код

ты передаешь три матрицы. а я одну. и в шейдере их множишь получается (для каждой вершины) а я один раз, правда на цпу, так быстрее.
я пробовал - дольше!
ты проверку на фрустум делаешь по боксу, а я по сфере, так быстрее.
имхо - меньше точность
неужели одного буффера хватит на кучу сложных объектов? O_o

один буфер на всё, дал прирост 5 фпс... ниочем

HolyDel 10.06.2012 02:47

Ответ: C3D Engine
 
нет. тут дело в том что объекты то одинаковые.

Цитата:

я пробовал - дольше!
странно. должно быть быстрее :) и это еще на кубах. а если будет на каких-нибудь хайполи модельках, да на каком нибудь интегрированном интеловском говнеце, то твой метод отрисовки сразу начнет очень сильно проигрывать.
ну и множить, надо понятное дело один раз.
т.е. viewproj считаем один раз и model на нее множим столько раз, сколько нод.

pozitiffcat 10.06.2012 02:53

Ответ: C3D Engine
 
т.е. viewproj считаем один раз и model на нее множим столько раз, сколько нод.
хм - не подумал... спасибо

upd: не дало результата... фпс остались такие же

HolyDel 10.06.2012 03:22

Ответ: C3D Engine
 
ну тогда хз ))
надо значит профайлером пройтись.

pozitiffcat 12.06.2012 02:30

Ответ: C3D Engine
 
УРААААААААА 233 FPS ксорс дает 95 на моем железе... Там с CG заморочки были и еще, тут кое какие сортировки сделал, чтоб один и тот же шейдер не биндить 4096 раз
400 человечков, с анимацией
4096 кубов

HolyDel 12.06.2012 12:17

Ответ: C3D Engine
 
во, респект! теперь давай выкладывай бинарники чтобы на разном железе потестить ))
анимаци костаня или морфная?

pozitiffcat 12.06.2012 15:29

Ответ: C3D Engine
 
анимация морфная, бинарники вечером выложу, там кое че подправить надо для интелектуальной сортировки по нескольким критериям, плагин для макса 2010 в комплекте, если от плагина сорцы надо, пиши. У меня плагин для макса любую анимацию в морф делает. Все преобразования на CPU идут через SSE2, так что быстро )))

pozitiffcat 12.06.2012 17:12

Ответ: C3D Engine
 
Скачать 134 билд.
Экспортер (забыл в zip положить)
400 анимированых человечков с 4096 кубами


Часовой пояс GMT +4, время: 00:56.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot