Вопрос

Раньше я спрашивал о толчке пикселей, и теперь мне удалось продвинуться достаточно далеко, чтобы на экране появился шум. Вот как я начинаю:

CGDataProviderRef provider;
bitmap = malloc(320*480*4);
provider = CGDataProviderCreateWithData(NULL, bitmap, 320*480*4, NULL);
CGColorSpaceRef colorSpaceRef;
colorSpaceRef = CGColorSpaceCreateDeviceRGB();
ir = CGImageCreate(
320,
480,
8,
32,
4 * 320,
colorSpaceRef,
kCGImageAlphaNoneSkipLast,
provider,
NULL,
NO,
kCGRenderingIntentDefault
);

Вот как я отрисовываю каждый кадр:

for (int i=0; i<320*480*4; i++) {
bitmap[i] = rand()%256;
}
CGRect rect = CGRectMake(0, 0, 320, 480);
CGContextDrawImage(context, rect, ir); 

Проблема в том, что это ужасно медленно, около 5 кадров в секунду. Я думаю, что мой путь к публикации буфера должен быть неправильным. Можно ли вообще сделать полноэкранную пиксельную графику, которую я мог бы обновлять со скоростью 30 кадров в секунду, без использования 3D-чипа?

Это было полезно?

Решение

Медлительность почти наверняка связана с генерацией шума. Если вы запустите это в Instruments, вы, вероятно, увидите, что в вашем цикле тратится куча времени.

Еще одна небольшая проблема - ваше цветовое пространство. Если вы используете цветовое пространство экрана, вы избежите преобразования цветового пространства, которое потенциально дорого.

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

Компонент bytesPerRow также важен для производительности. Это должно быть в 32 раза больше IIRC. Существует текст ссылки с кодом, который показывает, как его вычислить. .

И да, для сырой производительности, OpenGL.

Другие советы

Я подозреваю, что запись в память 614400 ( 320 * 480 * 4 ), генерация случайных чисел и создание нового объекта в каждом кадре замедляют работу.

Вы пытались просто вывести на экран статическое растровое изображение и посмотреть, насколько это быстро? Возможно, вы пытались профилировать код? Вам также нужно каждый раз делать новый CGRect?

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

Насколько мне известно, OpenGL должен быть самым быстрым способом создания графики на iPhone. Это включает в себя 2D и 3D. UIView поддерживается базовым анимационным слоем, который в любом случае заканчивается рисованием с OpenGL. Так почему бы не пропустить посредника.

Вы можете избежать поездки через CGContextDrawImage , назначив CGImageRef для - [CALayer setContents:] , только убедитесь, что не освободите растровое изображение пока вы все еще используете его.

[[view layer] setContents:(id)ir];

Да, я знаю, что это старый, я наткнулся на это из Google

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top