Question

J'ai déjà posé des questions sur le pixel-pushing et suis maintenant parvenu à aller assez loin pour que le bruit apparaisse à l'écran. Voici comment je initie:

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

Voici comment rendre chaque image:

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

Le problème, c’est terriblement lent, environ 5 images par seconde. Je pense que mon chemin pour publier le tampon doit être faux. Est-il même possible de faire des graphiques en plein écran basés sur les pixels que je pourrais mettre à jour à 30 ips, sans utiliser la puce 3D?

Était-ce utile?

La solution

La lenteur est presque certainement liée à la génération de bruit. Si vous utilisez ceci dans Instruments, vous constaterez probablement qu’il faut passer une tonne de temps dans votre boucle.

Votre espace colorimétrique est un autre problème moins important. Si vous utilisez l'espace colorimétrique de l'écran, vous éviterez une conversion d'espace colorimétrique potentiellement coûteuse.

Si vous pouvez utiliser les routines CoreGraphics pour votre dessin, vous feriez mieux de créer un CGLayer pour le contexte de dessin plutôt que de créer un nouvel objet à chaque fois.

Le composant bytesPerRow est également important pour la performance. Il devrait être un facteur de 32 IIRC. Un texte de lien de code est disponible, qui explique comment le calculer. .

Et oui, pour les performances brutes, OpenGL.

Autres conseils

Je suppose que la mémoire 614400 ( 320 * 480 * 4 ) écrit, génère des nombres aléatoires et crée un nouvel objet à chaque image, ce qui vous ralentit.

Avez-vous essayé d’écrire une image bitmap statique à l’écran et de constater sa rapidité? Avez-vous peut-être essayé de profiler le code? Avez-vous également besoin de créer un nouveau CGRect à chaque fois?

Si vous souhaitez simplement donner l’effet du caractère aléatoire, il n’est probablement pas nécessaire de régénérer le bitmap entier à chaque fois.

À ma connaissance, OpenGL est censé être le moyen le plus rapide de créer des graphiques sur iPhone. Cela inclut 2D et 3D. Un UIView est soutenu par une couche d'animation principale, qui finit par dessiner avec OpenGL de toute façon. Alors, pourquoi ne pas passer à l’intermédiaire.

Vous pouvez éviter le voyage par CGContextDrawImage en affectant votre CGImageRef à - [CALayer setContents:] , veillez simplement à ne pas libérer de bitmap pendant que vous l'utilisez encore.

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

Oui, je sais que c'est vieux, je suis tombé dessus par Google

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top