Russian Qt Forum
Ноябрь 23, 2024, 06:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Кеширование данных VBO  (Прочитано 2167 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Март 24, 2013, 10:42 »

Добрый день

Задача ускорить OpenGL отрисовку используя технику VBO. Идея в том чтобы при рисовании не передавать всякий раз данные  CPU->GPU, а загрузить их в GPU один раз и затем юзать. Данные - простые линейные контейнеры, напр
Код
C++ (Qt)
vector <float> coord1;
vector <int> indices1;
...
vector <float> coord2;
vector <float> coord3;
vector <int> indices2;
...
 
С помощью OpenGL API можно передать напр coord1 в карту и получить уникальный ID (типа как handle в Вындоуз). Это работает и действительно заметно ускоряет отрисовку.

Проблема в том что контейнеры (подлежащие кешированию) разбросаны в приложении в десятках (если не больше) мест и могут приходить на рисование всяко-разно. В простейшем случае есть 3D объект, он ссылается на структуру, скажем, Base, а в ней уже нужные для рисования контейнеры. Неск объектов  могут шарить один Base. Однако если пользователь заказал модификацию объекта - то для рисования он уже часть контейнеров использует своих. При этом объект может быть удален или выключен временно. Если данные контейнера меняются - VBO кеш должен быть перегружен. Зависит и от режима рисования - те или иные данные используются. И наконец есть мерзкое исключение: в одном из режимов рисовалка создает временные контейнеры (на основании исходных) и их уже рисует.

Пока мне не удается удачно "поселить" ID, ф-ционал кеша неприятно проникает в десятки мест. Ваше мнение?

Спасибо
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Апрель 27, 2013, 12:07 »

Моя попытка завязать архитектурную дискуссию не возымела успеха  Улыбающийся Ну ладно, отпишусь как сделал. Я агрегировал данные кеша во все контейнеры, выглядит так

Код
C++ (Qt)
struct CFloatData : public std::vector <float> {
CHandleVBO mVBO:
};
 
Когда приходит пора рисовать проверяется кеш, и если Ok - используется, иначе пересоздается. Для члена mVBO конструктор/оператор копирования не запрещены, но сам кеш не копируется. Если данные контейнера изменились - вызывается метод mVBO::Reset, его пришлось повтыкать там и сям - ну не очень много. Исключение когда рисовалка сначала преобразует данные отрабатывается отдельно.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.086 секунд. Запросов: 23.