iPad2 требуется 0,5 секунды, чтобы скопировать изображение размером 1 КБ - это лучшее, что я могу сделать? - PullRequest
4 голосов
/ 10 августа 2011

Я работаю над приложением для iPad, которое отображает световые сцены.Загрузка 20 или около того 1Kx1K текстур, которые задействованы, занимает некоторое время, и когда я начал синхронизировать различные операции, я обнаружил, что это занимает чуть меньше 1/2 секунды на текстуру.Изображение текстуры из файловой системы довольно быстрое, и узким местом является копирование UIImage в CGContext, чтобы передать изображение в glTexImage2D()

. Я пробовал два разных способа:создание копии:

    CGContextSetInterpolationQuality(textureCopyContext, kCGInterpolationNone);
    CGContextDrawImage( textureCopyContext, CGRectMake( 0, 0, width, height ), image);

и

    UIGraphicsPushContext(textureCopyContext) ;
    [uiImage drawInRect:CGRectMake(0, 0, width, height)] ;
    UIGraphicsPopContext() ;

, и то и другое занимает около 0,45 секунды.Это кажется мне чрезмерным, даже для относительно слабого устройства.

Я относительно новичок в разработке для iOS, поэтому я просто хочу спросить, являются ли времена, которые я вижу, разумными, или их можно улучшить.

Обновление: Я знаю об альтернативе PVRTC, но сейчас я должен придерживаться PNG.Тем не менее, в этом ответе есть отличная сводка плюсов и минусов PVRTC.Тот же ответ также намекает на то, почему PNG приводят к такому длительному времени настройки текстуры - «внутреннему переупорядочению пикселей».Кто-нибудь может это подтвердить?

Ответы [ 2 ]

1 голос
/ 10 августа 2011

Переключение текстурного контекста традиционно обходилось дорого, начиная с настольных компьютеров (на современных графических процессорах это происходит намного быстрее). Вы можете попробовать использовать текстурный атлас, в зависимости от размера ваших текстур, это наиболее эффективный подход. Текстурный Атлас объединяет текстуры, я думаю, что iPad способен загружать 2048 на 2048 текстур, вы можете сложить 4 текстуры вместе.

Другой вариант, использующий сжатие текстур pvrtc, позволяет уменьшить размер файла примерно на 25% в зависимости от качества. Чип PowerVR хранит его на устройстве, используя это сжатие, что экономит время и трафик при копировании. Иногда это может выглядеть с потерями при более низких настройках, но для 3d-текстур это лучший вариант, тогда как 2d-спрайты предпочитают первый вариант.

Дайте мне знать, если вам нужно больше разъяснений. Не забывайте, что файлы png сжимаются при загрузке из файловой системы и расширяются в полноразмерный битовый буфер, который чуть больше.

0 голосов
/ 10 августа 2011

Я бы начал с рассмотрения того, как это делается в https://github.com/cocos2d/cocos2d-iphone/blob/develop/cocos2d/CCTexture2D.m. Надеюсь, что-то там поможет. Там они делают glTexImage2D прямо из данных изображения, без CGContext.

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