Russian Qt Forum

Программирование => Общий => Тема начата: Igors от Март 24, 2013, 10:42



Название: Кеширование данных VBO
Отправлено: Igors от Март 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, ф-ционал кеша неприятно проникает в десятки мест. Ваше мнение?

Спасибо


Название: Re: Кеширование данных VBO
Отправлено: Igors от Апрель 27, 2013, 12:07
Моя попытка завязать архитектурную дискуссию не возымела успеха  :) Ну ладно, отпишусь как сделал. Я агрегировал данные кеша во все контейнеры, выглядит так

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