Загрузка вершин из .dae делает мою программу медленной, почему?

Я написал несколько функций для загрузки документа collada (.dae), но проблема в том, что окно opengl glut (console) медленно реагирует на отклики клавиатуры, я использовал только string.h, stdlib.h и fstream. h, и конечно же gl / glut.h. Основные функции моей программы:

Void LoadModel()
{
COLLADA ca;
double digits[3];
ca.OpenFile(char fname);
ca.EnterLibGeo();// get the position of <library_geometries>
ca.GetFloats();// search for the <float_array> from start to end, and saves thier position in the file
ca.GetAtrributes("count", char Attrib); //same as collada dom's function but its mine
Int run=atoi(Attrib); // to convert the attributes of count which is string in the file to integer
glBegin(GL_TRIANGLES);
for (int i=0;i<=run;i++)
{
MakeFloats(digits); // will convert string digits to floating point values, this function uses the starting position and ending position which GetFloats() stored in variables
glVertex3f(digits[0], digits[1], digitd[2]);
}
glEnd();
glFlush();
}

это приложение ищет теги без загрузки всего содержимого файла в память, функция LoadModel () будет вызываться void display (), поэтому всякий раз, когда я пытаюсь использовать функцию клавиатуры glut, она перезагружает данные вершин из файла, это хорошо для небольших файлов .dae, но большие файлы .dae заставляют мою программу работать медленно, потому что моя программа рисует вершину, загружая file () каждую секунду, это правильный способ загрузки моделей?

-1

Решение

Вы читаете в файле каждый конец каждый раз, когда визуализируете сетку; не делай этого.

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

VBO метод загрузки сетки на основе вашего примера:

COLLADA ca;
double digits[3];
ca.OpenFile(char fname);
ca.EnterLibGeo();// get the position of <library_geometries>
ca.GetFloats();// search for the <float_array> from start to end, and saves thier position in the file
ca.GetAtrributes("count", char Attrib); //same as collada dom's function but its mine
Int run=atoi(Attrib); // to convert the attributes of count which is string in the file to integer

int vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, run*3*sizeof(float), 0, GL_STATIC_DRAW);
do{
void* ptr = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
for (int i=0;i<=run;i++)
{
MakeFloats(digits); // will convert string digits to floating point values, this function uses the starting position and ending position which GetFloats() stored in variables
memcpy(ptr+i*3*sizeof(float), digits, 3*sizeof(float));
}
}while(!glUnmapBuffer(GL_ARRAY_BUFFER));//if buffer got corrupted then remap and do again

Затем вы можете связать относительный буфер и нарисовать с glDrawArrays

2

Другие решения

Дисковый ввод-вывод относительно медленный и, скорее всего, медлительность, которую вы видите. Вы должны попытаться удалить любую ненужную работу из вашей функции рисования. Загружайте файл только один раз при запуске, затем сохраняйте данные в памяти. Если вы загружаете разные файлы в зависимости от нажатия клавиш, загружайте их все сразу или один раз по требованию.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector