Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
1

Увеличение скорости загрузки из файла obj мешей в Directx

23.09.2014, 11:27. Показов 1854. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пробую написать свой класс для загрузки .obj мешей в Directx.
Идея в 2 функциях:
Первая(Convert_Obj) конвертирует стандартный формат .obj в .тхт с готовыми данными которые не нужно больше форматировать, их нужно просто загрузить в вектора. (офлайн обработка )

Вторая(Load_Obj) собсно и загружает из этого .txt уже в программу. (онлайн обработка)

Вопрос по второй функции: Как ее сделать быстрее? Как еще можно оптимизировать код? Или возможно есть другие варианты чтения фалов более быстрые.
Вобщем интересно как в реальных проектах быстро загружаеют меши из файла в программу.

класс
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#ifndef _MODELOBJ_H_
#define _MODELOBJ_H_
 
#include "include.h"
#include <iostream>
#include <fstream>
using namespace std;
class Obj
{
public:
    Obj();
    ~Obj();
 
 
    bool Convert_Obj(std::wstring filename);
    bool Load_Obj();
 
 
vector<XMFLOAT3> pos;
vector<XMFLOAT3> nor;
vector<XMFLOAT2> uv;
vector<Vertex> vert;
vector<DWORD>  indx;
};

Определения
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
Obj::Obj(){};
Obj::~Obj(){};
 
bool Obj::Convert_Obj(std::wstring filename)
{
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
ifstream inf(filename.c_str());
char checkChar;
bool bnor=false;
bool buv=false;
bool init=false;
int num = 0;
int cou = 0;
Vertex vertex;
 
if(inf)
{
while(!inf.eof())
    {
        checkChar = inf.get();
        bnor=false;
        buv=false;
        
        switch(checkChar)
        {
        case '#':
            while((checkChar = inf.get())!='\n'){inf.get();}
            break;
        case 'v':
            checkChar=inf.get();
            if(checkChar==' ')
            {float x,y,z;
             inf>>x>>y>>z;
             pos.push_back(XMFLOAT3(x,y,z*-1));}
            else if(checkChar=='t')
            {float x,y;
             inf>>x>>y;
             uv.push_back(XMFLOAT2(x,1-y));}
            else if(checkChar=='n')
            {float x,y,z;
             inf>>x>>y>>z;
             nor.push_back(XMFLOAT3(x,y,z*-1));}
            break;
        case 'f':
            float p,n,t;
            checkChar=inf.get();
            if(checkChar==' ')
            {
            while(checkChar!='\n')
            {
                if(checkChar==' ')
                {
                inf>>p;
                vertex.pos=pos[p-1];
                buv=true;
                checkChar=inf.get();
                }
                else if(checkChar=='/'&&buv==true)
                {
                inf>>t;
                vertex.texCoord=uv[t-1];
                bnor=true;
                buv=false;
                checkChar=inf.get();
                }
                else if(checkChar=='/'&&bnor==true)
                {
                inf>>n;
                vertex.normal=nor[n-1];
                bnor=false;
                buv=true;
                checkChar=inf.get();
                vertex.color=XMFLOAT4(1,0,1,0);
                
                for(int i=0; i<num; i++)
                {
                    if(vert.size()>0){
                    if(vertex.pos.x==vert[i].pos.x)
                        if(vertex.pos.y==vert[i].pos.y)
                            if(vertex.pos.z==vert[i].pos.z)
                                if(vertex.normal.x==vert[i].normal.x)
                                    if(vertex.normal.y==vert[i].normal.y)
                                        if(vertex.normal.z==vert[i].normal.z)
                                            if(vertex.texCoord.x==vert[i].texCoord.x)
                                                if(vertex.texCoord.y==vert[i].texCoord.y)
                                                {init=true;cou=i;}}}
                    if(init==true)
                    {indx.push_back(cou);init=false;}
                    else
                    {   vert.push_back(vertex);
                        num++;
                        indx.push_back(num-1);}
                }
            }
            }
            
            break;
 
        default:
            break;
        } //swich
 
    }// while
 
}
 
 
ofstream ofs("yolo.txt");
 
ofs<<vert.size()<<' '<< indx.size()<<'\n';
 
for(int i=0;i<num;i++)
{
    ofs<<vert[i].pos.x<<' '<<vert[i].pos.y<<' '<<vert[i].pos.z<<' '<<vert[i].normal.x<<' '<<vert[i].normal.y<<' '<<vert[i].normal.z<<' '<<vert[i].texCoord.x<<' '<<vert[i].texCoord.y<<'\n';
}
 
for(int i =0;i<indx.size();i++)
{
    ofs<<indx[i]<<'\n';
}
cout<<vert.size()<<endl;
cout<<indx.size();
return true;

C++
1
2
3
4
5
}
 
 
bool Obj::Load_Obj()
{
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
    HRESULT hr = S_OK;
 
    ifstream inf("yolo.txt");
    if(!inf){cout<<"Ха-ха";}
    int i =0,j=0;
    float numI=0;
    float numV=0;
    inf>>numV>>numI;
    cout <<"Кол.Вертексов: "<<numV<<endl
         <<"Кол.Индексов: "<<numI<<endl
         <<endl<<"Загрузка..."<<endl<<endl;
    Vertex vertex;
    float x,y,z;
    vert.reserve(numV);
    indx.reserve(numI);
 
    while(1)
    {
 
    for(i;i<numV;++i)
        {
            inf>>x>>y>>z;
            vertex.pos=(XMFLOAT3(x,y,z));
            inf>>x>>y>>z;
            vertex.normal=(XMFLOAT3(x,y,z));
            inf>>x>>y;
            vertex.texCoord=(XMFLOAT2(x,y));
            vert.push_back(vertex);
        }
 
    for(j;j<numI;++j)
        {
        
            inf>>x;
            indx.push_back(x);
        }
 
        break;
    } // while
 
    cout<<"Loaded";
    return hr;

C++
1
2
}
#endif
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.09.2014, 11:27
Ответы с готовыми решениями:

Подскажите библиотеку для загрузки мешей
Помогите найти нормальную библиотеку для загрузки моделей (.3ds, .obj, etc) на DirectX11. :( ...

Ограничение скорости загрузки файла
Здравствуйте, подскажите пожалуйста, как можно огр. скорость загрузки файла (php) ? Вот пример:...

Ограничение скорости загрузки файла
Приветствую! Есть код, ограничивающий загрузку файла &lt;?php $filename =...

Отображение скорости загрузки файла на сервера
Недавно создал файлобменик хочу к нему прикрутить показатель скорости загрузки и оставшееся время,...

9
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,505
Записей в блоге: 6
23.09.2014, 11:32 2
Ну во-первых, obj не нужно конвертировать в txt. Он и так текстовой. Во-вторых, если хотите ускорить загрузку пишите свой бинарный формат либо же используйте какой-либо стандартный исли он вам подойдет.
0
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
23.09.2014, 11:45  [ТС] 4
ну я его не просто в тхт. В тхт записую уже предварительно отформатированую информацию. Так как там нужно еще составить готовые вершины и индексы и еще кучю разных дел.
выглядит он так:
13857 78336 // кол вершин и кол индексов
0 -1.57081 1.77153 0 -0.998782 -0.049332 0.077756 0.87576 // позиция нормаль UV Готовая вершина.
...
0 // индексы
1
2
...
Стандартных я не знаю и както неособо интересно.
Авот про бинарный формат это значит запись в фаил нужно делать бинарно и потом чтение из него? Это увеличит скорость?
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,505
Записей в блоге: 6
23.09.2014, 11:57 5
Бинарный в любом случае будет шустрее текстового. Пилите свой формат и всего делов. Либо как я уже писал ищите подходящий(предпочтительный вариант).
1
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
23.09.2014, 12:16  [ТС] 6
Да но у меня вопрос о том как саму загрузку сделать быстрой а не как формат свой создать)
Если я правильно понимаю то нужно просто добавить ,ios::binary в обьекты чтения и записи?

C++
1
2
ofstream ofs("yolo.txt",ios::binary);
ifstream  inf("yolo.txt",ios::binary);
Поменял - работает но в принцие в самом файле просто стало все в меньше строк и коегде без пробелов)

Добавлено через 9 минут
может использование какихнибуть регистров инлайтов там итд
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,505
Записей в блоге: 6
23.09.2014, 12:36 7
Цитата Сообщение от TierX Посмотреть сообщение
Да но у меня вопрос о том как саму загрузку сделать быстрой а не как формат свой создать)
Начнем стого какая постановка вопроса. Если вы грузите меши одновременно с рендерингом, то это плохое решение. А если у вас идет подзагрузка в память то почему вы так привязались к скорости загрузки? В любом случае меши будут составлять в самом ужасно случае несколько мегабайт. К слову объем текстур будет в десятки раз больше. Так что я совсем не понимаю для чего вы так привязались к скорости загрузки
1
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
23.09.2014, 12:53  [ТС] 8
Меши грузятся отедльно от редеринга конечно же.
На счет текстур то там есть функция которая как я верю делает загрузку довольно оптимизировано по скорости.
Но вот дело втом что в 11dх нет похожего загрузчика мешей. Поэтому я тут и пытаюсь сварганить нечто рабочее и притом быстрое. Почему быстрое? Хм...
Скорость важно потому что мой меш из 13857 вертексов и 78336 индексов иницииализируется в данный момент примерно за 2 секунды. С использованием не форматированого ранее файла уходит от 10 до 80 секунд зависимо от реализации функции конвертирования.obj.
Умножем количество мешей на сцене и получим уже не 2 секунды а очень много. Думаю это очевидный аргумент чтобы бороться даже за сотые секунды.
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,505
Записей в блоге: 6
23.09.2014, 13:01 9
Так вы постоянно подгружаете меши? Зачем?
0
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
24.09.2014, 10:33  [ТС] 10
А как по другому я незнаю. У меня есть програма я ее запускаю.
Происходит инициализация програмы:
Окна,DirectX,Шейдеров кучи другого дела в том числе вершинных и индексных буферов которые инициализируются информацией из фалов мешей которые я конечно должен сначало загрузить в вектора. После чего вектором инциализировать вершинный буфер меша.
Я не подгружаю их постоянно я их гружу 1 раз на 1 запуск программы в стадии инициализации программы.


После чего идет цикл редеринга.Где я уже ничего не гружу )

Я толькочто проверил время загрузки этого меша оно ровно от 1,5 до 2,6 секи в зависимости от релиз/дебаг.

Добавлено через 16 минут
Тут даже дело не конкретно в этой функции или ее назначении. Хотелось бы просто знать способы оптимизации скорости выполнения функций в с++ с использованием чего либо. Просто тут тема с конкретным примером.

Например я вот недавно разберал XNA функции. Наткнулся на много всего аля вызов какихто регистров по именам. Я знаю что есть такие процесорные регистры, в которых довольно простые операции работают намного быстрее чем не в них). Думаю там какраз это и использовали.

Добавлено через 20 часов 45 минут
_______________________

оказываетсо оператор << не пишет бинарно.
Пришлось повозитсо но переписал функции.

Запись
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
           cout<<"Бинарная запись"<<endl;
    fstream file;
    file.open("file.txt",fstream::out | fstream::trunc | fstream::binary);
    int numV=vert.size(),numI=indx.size(); 
    file.write((const char*) &(numV),sizeof(int)).write((const char*) &(numI),sizeof(int));
 
    float x,y,z;
    for(int i =0 ;i<numV; ++i)
    {
     x=vert[i].pos.x;y=vert[i].pos.y;z=vert[i].pos.z;
     file.write((const char*) &(x),sizeof(float)).write((const char*) &(y),sizeof(float)).write((const char*) &(z),sizeof(float));
     x=vert[i].normal.x;y=vert[i].normal.y;z=vert[i].normal.z;
     file.write((const char*) &(x),sizeof(float)).write((const char*) &(y),sizeof(float)).write((const char*) &(z),sizeof(float));
     x=vert[i].texCoord.x;y=vert[i].texCoord.y;
     file.write((const char*) &(x),sizeof(float)).write((const char*) &(y),sizeof(float));
    }
 
    for(int i =0 ;i<numI; ++i)
    {
        float x=indx[i];
        file.write((const char*) &(x),sizeof(float));
    }
 
    file.close();


Загрузка
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
cout<<"Бинарная загрузка"<<endl;
    fstream file;
    file.open("file.txt",fstream::in | fstream::binary);
 
    int numV,numI;
    file.read((char*) &(numV),sizeof(int)).read((char*) &(numI),sizeof(int));
 
    Vertex vertex;
    float  index;
    int i=0;
    int j=0;
    vert.reserve(numV);
    indx.reserve(numI);
 
    for(i;i<numV;++i)
        {
        file.read((char*) &(vertex.pos.x),sizeof(float)).read((char*) &(vertex.pos.y),sizeof(float)).read((char*) &(vertex.pos.z),sizeof(float));
        file.read((char*) &(vertex.normal.x),sizeof(float)).read((char*) &(vertex.normal.y),sizeof(float)).read((char*) &(vertex.normal.z),sizeof(float));
        file.read((char*) &(vertex.texCoord.x),sizeof(float)).read((char*) &(vertex.texCoord.y),sizeof(float));
        vert.push_back(vertex);
        }
 
    for(j;j<numI;++j)
        {
        file.read((char*) &(index),sizeof(float));
        indx.push_back(index);
        }
 
    file.close();


Результаты:

Debug

Бинарная запись
Бинарная загрузка
Время записи: 63.9558
Время загрузки: 0.101652

Не Бинарная запись
Не бинарная загрузка
Время записи: 65.1136
Время загрузки: 2.64262

Release

Бинарная запись
Бинарная загрузка
Время записи: 5.03613
Время загрузки: 0.0184863

Не Бинарная запись
Не бинарная загрузка
Время записи: 5.23497
Время загрузки: 1.45526

Разница почти в 10 раз. Спасибо за этот совет, это реально помогло как видите.

Возможно-ли еще улучшить результат?
0
24.09.2014, 10:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2014, 10:33
Помогаю со студенческими работами здесь

Ограничение скорости загрузки файла по ftp
как мне реализовать ограничение скорости? вот мой код: private void DownLoadFromServer(String...

Освещение мешей их Х файла
У меня возникла проблема с освещением сцены и обьектов, а именно - его просто нет. Я смотрел...

Скачивание файла WebClient с отображением процентов загрузки файла, progressBar, скоростью загрузки файла
Приветствую! Нужна Ваша помощь... Имеется такой кодик, слепленный из готовых примеров ...

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

Увеличение скорости работы бд
Хотелось бы узнать, какие есть методы по увеличению скорости работы бд? или хотя бы просто &quot;как&quot;...

Увеличение скорости объекта
Суть программы: есть несколько препятствий и объект,при нажатие на старт препятствия начинают...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru