6 votes

iPad 3 renderInContext lent - Mauvaises performances de rendu

J'essaie d'extraire une image d'une vue sur laquelle un utilisateur peut peindre ou ajouter d'autres vues. Avec les iPad1 et 2, tout fonctionne bien jusqu'à présent. Mais sur l'iPad3, il fonctionne comme un chien. J'utilise simplement la méthode renderInContext des calques.

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
    UIGraphicsBeginImageContextWithOptions(self.viewDrawableViewContainer.frame.size, NO, [UIScreen mainScreen].scale);
else
    UIGraphicsBeginImageContext(self.viewDrawableViewContainer.frame.size);
[self.viewDrawableViewContainer.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();   

Je sais que c'est probablement dû au cpu qui est égal à celui de l'ipad2, mais cela prend environ 1 seconde. Plus l'utilisateur peint ou ajoute, plus le rendu sera long. Parfois jusqu'à 5 secondes, ce qui est vraiment inacceptable. Existe-t-il des options pour améliorer les performances ? Est-il possible de réduire la qualité du rendu - je n'ai pas besoin d'un rendu dans la plus haute résolution rétina...

J'apprécierais toute aide ! Merci d'avance

16voto

maxpower Points 539

Vous pouvez également augmenter la vitesse de rendu en modifiant la qualité de l'interpolation dans votre contexte avant d'appeler le rendu dans le contexte. J'ai pu obtenir des captures d'écran beaucoup plus rapides avec cette modification qu'en changeant le facteur d'échelle.

Bien sûr, vous pouvez utiliser les deux et vous n'avez pas besoin de régler la qualité sur Aucun, mais j'ai trouvé que c'était quand même une amélioration.

CGContextSetInterpolationQuality(ctx, kCGInterpolationNone);

En outre, pour le facteur d'échelle mentionné dans la réponse précédente, assurez-vous que votre nouveau facteur d'échelle est un multiple de l'original, c'est-à-dire que si l'échelle de l'écran est de 1,0, vous devriez faire quelque chose comme 0,5 et non 0,8. L'utilisation de .8 entraînera le calcul de plus d'informations dans le rendu (parce que l'échelle n'est pas égale) et le rendra donc plus lent que l'utilisation de 1.0.

Bien entendu, cette solution ne conviendra pas à tout le monde.

9voto

darrinm Points 2976

Vous pouvez augmenter la vitesse en effectuant le rendu à une résolution inférieure. Utilisez un facteur d'échelle UIGraphicsBeginImageContextWithOptions inférieur à 1,0, par exemple 0,5.

De plus, si vous n'avez pas besoin d'alpha, vous pouvez obtenir un petit gain de vitesse en passant YES pour le drapeau opaque. Je n'ai pas mesuré la différence moi-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X