Форум программистов, компьютерный форум, киберфорум
Наши страницы
OpenGL
Войти
Регистрация
Восстановить пароль
 
snake32
1649 / 1102 / 193
Регистрация: 26.02.2009
Сообщений: 4,086
Записей в блоге: 5
#1

Ускорение генерации/уничтожения имён Textures,Buffers, etc

05.09.2013, 15:22. Просмотров 464. Ответов 9
Метки нет (Все метки)

Доброго времени!

Столкнулся с такой проблемой. Есть набор графический объектов, которые при создании вызывают:
Delphi
1
2
glGenTextures(1, @texid );
glGenBuffers( 1, @bufid );
А при уничтожении вызывают:
Delphi
1
2
glDeleteTextures(1, @texid );
glDeleteBuffers( 1, @bufid );
Это очень удобно, однако, если разом добавить/удалить пол миллиона объектов то эта поэлементная генерация/уничтожение занимает неприличное время. Вывод: нужен манагер ресурсов, который бы генерировал/удалял имена сразу пачками:
Delphi
1
2
3
4
5
glGenTextures( 1000, @texids );
glGenBuffers( 1000, @bufids );
//--------
glDeleteTextures( 1000, @texid );
glDeleteBuffers( 1000, @bufid );
Как его организовать?
Какие алгортимы поиска наиболее эффективны? Ведь мне придётся превзойти стандартный OpenGL-вский.
Есть ли что почитать по сабжу?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2013, 15:22
Ответы с готовыми решениями:

OpenGL textures
воопщем когда я задаю цвет: glColor(0.5f,0.5f,0.5f); мои текстуры смешиваются...

Transparent textures
Помогите составить параметры смешивания "BlendFunc", чтобы можно было...

Скрипт генерации имён
за домен и хостинг форума приходится платить из собственного кармана, т,к,...

Ускорение отображения страницы в момент генерации
Есть php скрипт, который запускаешь и он работает много времени. Он получает...

Скорость, касательное ускорение, полное ускорение, нормальное ускорение и радиус кривизны траектории
Движение точки задано координатным способом. Найти траекторию и начертить ее....

9
Raali
639 / 343 / 74
Регистрация: 06.07.2013
Сообщений: 1,107
Завершенные тесты: 1
05.09.2013, 18:14 #2
Цитата Сообщение от snake32 Посмотреть сообщение
если разом добавить/удалить пол миллиона объектов
если в сцене находится пол-миллиона РАЗНЫХ объектов и текстур то их загружать все равно придется, и потратить на это кучу времени, разве что загружать нужно одной функцией а не много раз вызывать одну для каждой текстуры/буффера, все зависит от того как устроена сама игра...

например в сцене у нас есть 50 текстур и 50 объектов - создать для этой сцены так называемый PACK

enum PACK_SCENE01_TEXTURES
{
IDT_NULL,
IDT_GRASS,
.....
IDT_BRICKS,
IDT_TOTAL,
}

загружать сразу пак glGenTextures(PACK_SCENE01_TEXTURES::IDT_TOTAL , ....);
0
snake32
1649 / 1102 / 193
Регистрация: 26.02.2009
Сообщений: 4,086
Записей в блоге: 5
05.09.2013, 19:07  [ТС] #3
Raali, это не игра, а редактор. В этом то и вся соль. Теперь, допустим, из предложенного вами пака я удаляю половину случайно выбранных текстур. Как их быстро удалить? Не прибегая к поэлементному удалению?
0
Ух ты!
Ах ты! All we Astronautы
121 / 98 / 1
Регистрация: 20.10.2012
Сообщений: 373
Записей в блоге: 2
06.09.2013, 07:58 #4
если разом добавить/удалить пол миллиона объектов
имхо, это уже само по себе не нормально. пол ляма объектов, куда столько? нужно заняться какой-то оптимизацией и свести к гораздо меньшему кол-ву объектов гл.

нужен манагер ресурсов
можешь конечно еще попытаться обернуть все это дело, расставлять флаги (используется/нет) в пуле с поллямом текстур/буферов и ничего реально не создавать и не удалять после инициализации, лишь только перезаливать в объекты с взведенным неиспользуемым флагом. Ну и как-то сортировать этот пул по флагам периодически.
0
Raali
639 / 343 / 74
Регистрация: 06.07.2013
Сообщений: 1,107
Завершенные тесты: 1
06.09.2013, 13:48 #5
Цитата Сообщение от snake32 Посмотреть сообщение
Не прибегая к поэлементному удалению?
удалять уж точно поэлементно придется, либо как раз делать такие PACK'и которые будут удаляться разом
0
snake32
1649 / 1102 / 193
Регистрация: 26.02.2009
Сообщений: 4,086
Записей в блоге: 5
09.09.2013, 17:14  [ТС] #6
Цитата Сообщение от Ух ты! Посмотреть сообщение
нужно заняться какой-то оптимизацией и свести к гораздо меньшему кол-ву объектов гл.
Вот как раз об этом я и спрашиваю.
Цитата Сообщение от Ух ты! Посмотреть сообщение
можешь конечно еще попытаться обернуть все это дело, расставлять флаги (используется/нет) в пуле с поллямом текстур/буферов и ничего реально не создавать и не удалять после инициализации, лишь только перезаливать в объекты с взведенным неиспользуемым флагом. Ну и как-то сортировать этот пул по флагам периодически.
Есть ли где-нить более подробная инструкция как это дело правильно реализовать?

Добавлено через 11 минут
Вскользь прочитал книгу Снук Г. - 3D-ландшафты в реальном времени на С++ и DirectX я так понял там вообще создаётся один огромный буфер вершин и индексов и чуть ли не каждый кадр перезаливается. Тем самым почти вся прорисовка сводится к единственному вызову DIP(на огле это glDrawElemets). Только пока не понял как с разными текстурами он выкрутился.
0
Ух ты!
Ах ты! All we Astronautы
121 / 98 / 1
Регистрация: 20.10.2012
Сообщений: 373
Записей в блоге: 2
10.09.2013, 06:58 #7
>Есть набор графический объектов
А что за объекты?
Кол-во вершин?
Часто ли меняют свою геометрию ?
Уникальны ли по геометрии либо же подобные друг-другу?

Есть ли где-нить более подробная инструкция как это дело правильно реализовать?
ну вообще-то в качестве примера можно покопаться в любом переопределенном менеджере памяти для пула объектов любого класса оператора new в с++.
Там вся магия с флажками и выделением памяти в самом простейшем виде.
ты просто в место new или malloc free будешь вставлять гл функции. А создание нового гл объекта, это просто запись в первый свободный из списка освобожденных который тебе вернет менеджер пула. мб это несколько ускорит, хотя тоже большой вопрос, пол ляма микро-перезаливок тоже не айс )

большой буфер вершин это - правильный путь, один выводишь, а другой в это время - заполняешь и свап своеобразный.

Только пока не понял как с разными текстурами он выкрутился.
мб массив текстур ?
1
snake32
1649 / 1102 / 193
Регистрация: 26.02.2009
Сообщений: 4,086
Записей в блоге: 5
10.09.2013, 13:57  [ТС] #8
Цитата Сообщение от Ух ты! Посмотреть сообщение
А что за объекты?
Кол-во вершин?
Объекты наипростейшие - точки, линии, квады, полигоны и квады с текстурой.
типа как здесь:
http://www.openstreetmap.org/#map=17/55.76038/37.61223
Но тут точек вообще нет, а у меня их будет много. Нужно добиться адекватной скорости отображения хотя бы 0,5 млн точек.
Цитата Сообщение от Ух ты! Посмотреть сообщение
Часто ли меняют свою геометрию ?
Каждый объект должен быть редактируемый(изменение цвета, положения, текстуры если есть; удаление/ добавление новых точек/объектов ). Но в большинстве случаев просто отображение.
Цитата Сообщение от Ух ты! Посмотреть сообщение
ну вообще-то в качестве примера можно покопаться в любом переопределенном менеджере памяти для пула объектов любого класса оператора new в с++.
Там вся магия с флажками и выделением памяти в самом простейшем виде.
ты просто в место new или malloc free будешь вставлять гл функции. А создание нового гл объекта, это просто запись в первый свободный из списка освобожденных который тебе вернет менеджер пула. мб это несколько ускорит, хотя тоже большой вопрос, пол ляма микро-перезаливок тоже не айс )
Это станет ненужным если действительно
Цитата Сообщение от Ух ты! Посмотреть сообщение
большой буфер вершин это - правильный путь
Теперь нужно оценить все(или хотя бы основные) минусы этого подхода. Вот, кстати, одни из них:
Цитата Сообщение от Ух ты! Посмотреть сообщение
мб массив текстур ?
Ограничения массива текстур, не позволяют использовать разного разрешения текстуры и типа(формата). Придётся подгонять/резать все текстуры к единому разрешению формату. Либо хотя бы разделить на несколько основных форматов разрешений и подгонять все текстуры к ним. Естественно кол-во DIPов значительно увеличится, но не думаю что фатально.

Вообщем... если есть какие нибудь мысли "как сделать лучше" не стесняйтесь с удовольствием выслушаю.
0
Ух ты!
Ах ты! All we Astronautы
121 / 98 / 1
Регистрация: 20.10.2012
Сообщений: 373
Записей в блоге: 2
15.09.2013, 08:34 #9
"как сделать лучше"
Перед заливкой и выводом тестировать геометрию на попадание во фтустум камеры + может быть Quadtree если 2д, окклюжн тест по группам мелких объектов.
1
snake32
1649 / 1102 / 193
Регистрация: 26.02.2009
Сообщений: 4,086
Записей в блоге: 5
15.09.2013, 13:33  [ТС] #10
Цитата Сообщение от Ух ты! Посмотреть сообщение
+ может быть Quadtree если 2д
Это уже есть.
Цитата Сообщение от Ух ты! Посмотреть сообщение
окклюжн тест по группам мелких объектов.
Не уверен что это мне как-то поможет, но всё равно спасибо
0
15.09.2013, 13:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2013, 13:33

Поиск файлов по списку имён и по заданным расширениям с выводом полных имён найденных в текстовый файл
Доброго времени суток! Стоит задача сделать батник. Для поиска файлов по...

Диспетчер имён, перенос имён в другую таблицу
всем привет, нужна помощь, ситуация следующая: есть два excel файла, в них...

Имя типа или пространство имён sess отсутствуют в классе или в пространстве имён user
Привет Написана страничка User в ней: namespace user { public class user...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru