Pregunta

Pregunté antes sobre el empuje de píxeles, y ahora he logrado llegar lo suficientemente lejos como para que el ruido aparezca en la pantalla. Así es como yo inicio:

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
);

Así es como renderizo cada cuadro:

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

El problema es que esto es terriblemente lento, alrededor de 5 fps. Creo que mi camino para publicar el búfer debe estar equivocado. ¿Es posible hacer gráficos basados ??en píxeles de pantalla completa que pueda actualizar a 30 fps, sin usar el chip 3D?

¿Fue útil?

Solución

La lentitud es casi seguro en la generación de ruido. Si ejecuta esto en Instruments, probablemente verá que se gasta una tonelada de tiempo sentado en su bucle.

Otro problema menor es su espacio de color. Si usa el espacio de color de la pantalla, evitará una conversión de espacio de color que es potencialmente costosa.

Si puede utilizar las rutinas CoreGraphics para su dibujo, sería mejor crear un CGLayer para el contexto del dibujo en lugar de crear un nuevo objeto cada vez.

El componente bytesPerRow también es importante para el rendimiento. Debería ser un factor de 32 IIRC. Hay algunos códigos disponibles texto de enlace que muestra cómo calcularlo .

Y sí, para un rendimiento bruto, OpenGL.

Otros consejos

Sospecho que hacer 614400 ( 320 * 480 * 4 ) escribe en memoria, genera números aleatorios y crea un nuevo objeto cada fotograma te está ralentizando.

¿Has intentado escribir un mapa de bits estático en la pantalla y ver qué tan rápido es? ¿Has intentado quizás perfilar el código? ¿También necesita hacer un nuevo CGRect cada vez?

Si solo desea dar el efecto de aleatoriedad, probablemente no sea necesario regenerar todo el mapa de bits cada vez.

Que yo sepa, se supone que OpenGL es la forma más rápida de hacer gráficos en el iPhone. Esto incluye 2D y 3D. Un UIView está respaldado por una capa de animación central, que termina dibujando con OpenGL de todos modos. Entonces, ¿por qué no omitir al intermediario?

Puede evitar el viaje a través de CGContextDrawImage asignando su CGImageRef a - [CALayer setContents:] , solo asegúrese de no liberar el mapa de bits mientras lo sigas usando.

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

Sí, sé que esto es viejo, me topé con Google

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top