Question

J'ai une vue qui a une image d'arrière-plan et un qui se change CGPath que l'utilisateur touche l'écran. Dessin avec l'image, puis dessiner CGContextDrawImage() le chemin sur le dessus est pas assez rapide et il entrave les performances de l'événement touche. Ce que je voudrais avoir est d'avoir un tampon bitmap et dessiner seulement les changements dans le chemin d'accès. Ainsi, la vue de la drawRect() sera juste dessiner la mémoire tampon. Je pense que je vais devoir utiliser s mais je CGContext ne peux pas comprendre tout à fait comment le faire. Y at-il une autre façon d'optimiser cela?

Edit:

J'ajoute au chemin chaque fois que l'utilisateur touche l'écran; de sorte que le « chemin change » fait référence à ajouter plus de points à un chemin existant. Voilà pourquoi je pense que je peux juste tamponner l'image et d'en tirer juste le « delta » du chemin au lieu de tirer la chose à chaque fois. Au moment où mon dessin et la logique d'événement sont quelque chose comme ceci:

-(void)drawRect{
    //Draw the background image
    //Draw the whole path
}

-(void)touchesMoved{
    //Add the touch point to the path
    [self setNeedsDisplay];
}

Dessin l'arrière-plan de cette façon rend l'échantillonnage de l'événement tactile effectuer sensiblement pire que juste dessiner le chemin.

Était-ce utile?

La solution

Si l'image d'arrière-plan ne change pas (je ne peux pas dire avec certitude si elle est), alors vous devriez mettre l'image d'arrière-plan dans une couche de CoreAnimation différente, avec la couche contenant le chemin au-dessus de celui-ci. Cela permet le GPU gérer le compositing, plutôt que de le faire tout dans votre -drawRect. L'image de fond peut alors être mis en cache lorsque cela est possible, et la seule chose que vous devez mettre à jour sera le chemin (que vous pouvez toujours probablement éviter de redessiner entièrement à chaque trame). Vous serez également en mesure de faire des choses comme l'échelle ou faire pivoter le chemin sans avoir à se soucier de l'effet sur l'image d'arrière-plan.

Autres conseils

En fait, c'est à peu près la façon dont il fonctionne déjà. Le contexte est passé à drawRect tire dans un CALayer, qui est tamponnée jusqu'à ce que vous faites quelque chose qui exige en vue de se redessiner. Vous avez dit que le chemin est changé « que l'utilisateur touche l'écran » - vous ensuite le réglage setNeedsDisplay sur la vue

Si vous avez vraiment un chemin différent à chaque fois que vous n'êtes pas allez pouvoir le tampon. Si c'est la même, aussi longtemps que vous n'êtes pas appeler setNeedsDisplay, ou quelque chose qui va effectuer étant appelé, puis la couche qui sauvegarde votre point de vue doit être tamponnées. J'ai une charge de ces vues en couches, toutes avec beaucoup de choses de fantaisie CG (dessin et les chemins de remplissage, des images de découpage, etc colourising etc) et la performance est grande.

Si vous avez des chemins différents (peut-être pour représenter visuellement, au toucher) - vous voudrez peut-être penser à utiliser d'autres vues - qui elles-mêmes ne changent pas - ou peut-être grâce à l'animation de vue sur la vue prérendu unique?

Si rien de tout cela touche la marque, s'il vous plaît poster plus d'informations pour nous aider à voir ce que vous essayez de faire.

Je ne suis pas 100% positif que cela fonctionne de cette façon sur l'iPhone, mais la classe équivalente Mac OS X, setNeedsDisplay: effectivement synchrones, les opérations de dessin si coûteux peuvent tuer les performances d'une boucle. Essayez de mettre votre code de dessin sur une minuterie qui exécute plusieurs fois par seconde au lieu d'appeler explicitement dans votre code de gestion des événements.

Voir ce fil CocoaBuilder pour plus d'informations .

De votre édition il semble que vous faites une sorte de dessin application.

Dans ce cas, je vais essayer la suggestion de « inconnu » (mettre l'image d'arrière-plan dans la couche / vue séparée du chemin). En fait, je le ferais de toute façon. Utilisez-vous CGPath? Sinon, il vaut probablement la peine de faire cela aussi.

Si vous êtes toujours avoir des problèmes, il pourrait être utile de séparer les actuelles « modifications » (toutes les lignes tracées en succession rapide) dans leur propre chemin (dans leur propre couche / vue), et les ajouter à la voie principale après une période de repos convenable (à l'aide d'une minuterie).

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