Название: Кеширование данных VBO Отправлено: Igors от Март 24, 2013, 10:42 Добрый день
Задача ускорить OpenGL отрисовку используя технику VBO. Идея в том чтобы при рисовании не передавать всякий раз данные CPU->GPU, а загрузить их в GPU один раз и затем юзать. Данные - простые линейные контейнеры, напр Код С помощью OpenGL API можно передать напр coord1 в карту и получить уникальный ID (типа как handle в Вындоуз). Это работает и действительно заметно ускоряет отрисовку. Проблема в том что контейнеры (подлежащие кешированию) разбросаны в приложении в десятках (если не больше) мест и могут приходить на рисование всяко-разно. В простейшем случае есть 3D объект, он ссылается на структуру, скажем, Base, а в ней уже нужные для рисования контейнеры. Неск объектов могут шарить один Base. Однако если пользователь заказал модификацию объекта - то для рисования он уже часть контейнеров использует своих. При этом объект может быть удален или выключен временно. Если данные контейнера меняются - VBO кеш должен быть перегружен. Зависит и от режима рисования - те или иные данные используются. И наконец есть мерзкое исключение: в одном из режимов рисовалка создает временные контейнеры (на основании исходных) и их уже рисует. Пока мне не удается удачно "поселить" ID, ф-ционал кеша неприятно проникает в десятки мест. Ваше мнение? Спасибо Название: Re: Кеширование данных VBO Отправлено: Igors от Апрель 27, 2013, 12:07 Моя попытка завязать архитектурную дискуссию не возымела успеха :) Ну ладно, отпишусь как сделал. Я агрегировал данные кеша во все контейнеры, выглядит так
Код Когда приходит пора рисовать проверяется кеш, и если Ok - используется, иначе пересоздается. Для члена mVBO конструктор/оператор копирования не запрещены, но сам кеш не копируется. Если данные контейнера изменились - вызывается метод mVBO::Reset, его пришлось повтыкать там и сям - ну не очень много. Исключение когда рисовалка сначала преобразует данные отрабатывается отдельно. |