2014-05-29 2 views
0

Мне нужно найти способ отслеживать позиции, в которых нарисованы загруженные текстуры. Когда некоторые загруженные текстуры перезаписываются, я должен удалить их из памяти.Лучший способ найти и удалить скрытые текстуры из памяти

У меня есть сервер удаленного интерфейса пользователя (RUI), который отправляет мне много мелких изображений, которые собираются, а затем отображаются на экране клиента RUI. В этом случае я не знаю, какие текстуры находятся за некоторыми другими текстурами, поэтому я не могу их удалить. Кроме того, переписывание должно быть полным (текстура позади должна быть полностью скрыта). Есть ли эффективный способ добиться этого отслеживания и удаления?

Мой блейд-код выглядит примерно так: у меня есть меню с изображениями кнопок, хранящимися на сервере. Весь экран сделан из фрагментов (кнопок, полос прокрутки, анимаций и т. Д.). Например, когда я нажимаю кнопку, сервер отправляет мне несколько эскизов изображений, хранящихся в его хранилище, и я показываю их, например, в правой половине экрана. На других нажатиях кнопки отображается список композиций, видеороликов, электронных книг или чего-то еще. Мне нужно удалить текстуры миниатюр изображений из памяти, а затем показать список песен, например. Таким образом, перезапись исчезнет, ​​и мое использование памяти будет значительно уменьшено.

Моя реализация openGL ES 2.0 находится на платформе Android, где вся работа выполняется в слое JNI. Существует не сложный рисунок, просто декодирование изображений png, преобразование в текстуры и отображение основных текстур.

ответ

0

Вы можете сделать что-то по линиям reference counting, чтобы отслеживать, сколько раз использовалось то же изображение. Когда экземпляр полностью закрыт или выключен, вы уменьшаете счетчик ссылок и удаляете все текстуры с 0 ссылками.

Подсчет ссылок может быть таким же простым, как std::map<Texture, int>.

Ваша проверка на окклюзию может быть просто испытанием на пересечение/сдерживание O (n^2) AABB и дополнительным O (n) тестом против AABB экрана. Если это недостаточно быстро для вас, попробуйте лучшую структуру данных, например, quadtree или spatial hashing.

В зависимости от того, как настроено ваше приложение, вы также можете отслеживать экземпляры вашей текстуры с типом smart pointer и выяснить, когда все ваши скрытые виды были удалены.

Это, вероятно, пустая трата времени, если вы фактически не связаны количеством VRAM на устройстве или не приближаетесь к нему. Загрузка/выгрузка изображений с любого диска или сетевого местоположения будет на несколько порядков медленнее, чем просто держать его в VRAM, если у вас есть это.

Смежные вопросы