Domanda

Ho già chiesto informazioni sulla tecnologia pixel-push e ora sono riuscito ad arrivare abbastanza lontano da far apparire il rumore sullo schermo. Ecco come ho init:

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

Ecco come rendering ogni fotogramma:

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

Il problema è che è terribilmente lento, circa 5 fps. Penso che il mio percorso per pubblicare il buffer debba essere sbagliato. È anche possibile realizzare grafici a pixel a schermo intero che potrei aggiornare a 30 fps, senza usare il chip 3D?

È stato utile?

Soluzione

La lentezza è quasi certamente nella generazione del rumore. Se lo esegui in Instruments, probabilmente vedrai che passa un sacco di tempo seduto nel tuo loop.

Un altro problema minore è il tuo spazio colore. Se si utilizza lo spazio colore dello schermo, si eviterà una conversione dello spazio colore che è potenzialmente costosa.

Se puoi usare le routine CoreGraphics per il tuo disegno, verrai servito meglio creando un CGLayer per il contesto del disegno invece di creare un nuovo oggetto ogni volta.

Anche il componente bytesPerRow è importante per le prestazioni. Dovrebbe essere un fattore di 32 IIRC. C'è del codice disponibile testo del link che mostra come calcolarlo .

E sì, per prestazioni allo stato puro, OpenGL.

Altri suggerimenti

Sospetto di fare 614400 ( 320 * 480 * 4 ) scritture di memoria, generazione di numeri casuali e creazione di un nuovo oggetto ogni frame ti rallenta.

Hai provato a scrivere una bitmap statica sullo schermo e vedere quanto è veloce? Hai forse provato a profilare il codice? Devi anche creare un nuovo CGRect ogni volta?

Se vuoi solo dare l'effetto della casualità, probabilmente non è necessario rigenerare l'intera bitmap ogni volta.

Per quanto ne so, OpenGL dovrebbe essere il modo più veloce per fare grafica su iPhone. Ciò include 2D e 3D. Un UIView è supportato da un livello di animazione principale, che finisce comunque per disegnare con OpenGL. Quindi perché non saltare l'intermediario.

Puoi evitare il viaggio attraverso CGContextDrawImage assegnando il tuo CGImageRef a - [CALayer setContents:] , assicurati di non liberare bitmap mentre lo stai ancora usando.

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

Sì, lo so che è vecchio, mi sono imbattuto su Google

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top