Множество файлов png, загружаемых в текстуры для использования с OpenGLES, вызывают медленное время загрузки - PullRequest
2 голосов
/ 06 августа 2009

У меня есть тысячи файлов PNG, которые я загружаю с использованием libpng, а затем создаю текстуры OpenGLES для использования в приложении. Это вызывает огромную задержку загрузки iPhone. Есть ли способ ускорить время загрузки?

Ответы [ 3 ]

1 голос
/ 06 августа 2009

Что я обычно делал, так это создавал объект, который обрабатывает ленивую загрузку моих текстур через менеджер. При запуске я регистрирую свои известные текстуры и разрешаю их атрибуты файловой системы, которые понадобятся мне позже, чтобы сэкономить на простом вводе-выводе во время загрузки, а затем, когда они понадобятся, я их извлекаю.

Чтобы ускорить процесс, у меня также есть механизм пакетной загрузки, где я говорю: «Загрузите этот массив изображений и верните их мне». Это просто для устранения накладных расходов при повторных вызовах методов. Действительно, мое решение для одной загрузки - это просто обертка вокруг моей партии.

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

На практике это имеет тенденцию работать из-за возможных вероятностей - форсирование нагрузки во время запуска гарантирует, что вы столкнетесь со всеми текстурами одновременно, в то время как редкая загрузка их по вероятности приводит к снижению ожидаемой задержки пользователя, взвешенной по времени загрузки. латентность * вероятность загрузки в течение некоторого периода времени от начала. Если вы оптимизируете предварительную выборку времени запуска, чтобы не загружать текстуры, вы значительно уменьшите ожидаемые задержки интерфейса.

Кроме того, вы можете рассмотреть возможность использования NSURLConnection: connectionWithRequest: делегат: для загрузки ваших текстур из хранилища. Он асинхронный, поэтому вы можете попросить его загружать самые большие из них асинхронно и ваши меньшие синхронно, чтобы использовать преимущества коэффициентов простоя ввода-вывода / ЦП во время выборок файловой системы / декомпрессии текстур (большие файлы загружаются долго, в то время как небольшие файлы загружаются быстро и могут десериализоваться при в то же время). Вы должны проверить это, так как iPhone может плохо обрабатывать асинхронный доступ к файловой системе.

0 голосов
/ 06 августа 2009

Знаете ли вы, в каком порядке вам понадобятся тысячи изображений? Возможно, вы можете загрузить только несколько сотен при запуске приложения, а затем загружать больше в фоновом потоке по ходу работы.

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

0 голосов
/ 06 августа 2009

Вы можете поместить несколько текстур в одну большую текстуру (1024x1024). Это требует некоторого пересчета texcoords все же. Постарайтесь также, чтобы части текстуры были близки к фактическому разрешению, используемому при рисовании, т. Е. Если текстура заполнит половину высоты экрана (240 пикселей), этого достаточно, чтобы использовать текстуру 256x256.

Затем, более продвинутый метод (не проверенный) может заключаться в объединении всех файлов (+ регистрация их длины + pos), а затем использование mmap(..) для доступа к этому файлу png-db. Затем используйте NSData для подачи функции загрузки текстуры, если они основаны на UIImage. Хорошая вещь с использованием mmap(..), как это, состоит в том, что не открывают и не закрывают много файлов, и доступ к данным обрабатывается с помощью менеджера виртуальной машины ОС.

[Примечание: Да, нативный загрузчик PNG для iPhone требует некоторого png-манипулирования ... тогда может не понадобиться ни один нативный ридер, или вместо этого объединить искаженные файлы]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...