2009-03-04 6 views

Répondre

0

En général en OpenGL, il existe deux façons de le faire « défilement », à savoir déplacer le contenu affiché perpendiculairement à la direction d'observation:

  1. Ajustez le visionnement, en d'autres termes "déplacez la caméra", afin que le contenu change.
  2. Déplacez le contenu directement, en gardant l'appareil photo fixe.

Ceux-ci sont bien sûr totalement équivalents, et inversement l'un de l'autre. Ces deux méthodes supposent que vous réalisez des retraits complets de votre scène pour chaque image. Faire défiler dans le sens le plus "classique", en copiant le contenu de la mémoire tampon de trame tout en étant décalé d'un montant (dx, dy), n'est pas une technique qui convient très bien à OpenGL. Fondamentalement, la création d'une image défilante pourrait être aussi simple que de dessiner un seul quad texturé, puis de changer sa position pour chaque nouvelle image.

+0

Avez-vous un échantillon de code? – Dimitris

+0

Non, je suis désolé ... Cela fait longtemps que je n'ai pas écrit de code GL. :/ – unwind

0

Quelle est la taille de vos images et à quel point leur lenteur est-elle trop lente? En utilisant un UIScrollView avec un UIView contenant du contenu qui est dessiné via Quartz, j'ai pu faire défiler des vues jusqu'à 2000 x 2000. Si vous ne redessinez pas le contenu de votre image à chaque image, mais déplacez plutôt la position de vos vues et laissez Core Animation faire le reste, je parie que vous pourrez obtenir le type de performance que vous voulez sans tomber dans OpenGL.

La plupart des problèmes de performance en 2D que j'ai vus sont le résultat de personnes essayant de faire toute leur animation dans drawRect, en redessinant constamment leur contenu. Vous voulez dessiner une fois, puis déplacez simplement l'origine de la vue ou du calque dessiné. Le contenu de la vue est mis en cache en tant que texture OpenGL, il devient donc très efficace de l'animer.

Pour le travail en 2D, je considère OpenGL comme le dernier endroit vers lequel se tourner après avoir épuisé toutes les autres alternatives. Il vous faudra beaucoup plus de temps pour faire les mêmes choses que vous pouvez utiliser UIViews simples et Core Animation.

+0

Merci pour ça. À l'heure actuelle, j'ai une minuterie appelant une fonction de mise à jour 30 fois par seconde. La fonction de mise à jour définit les nouveaux rectangles pour les mosaïques que j'ai définies en tant que vues. Avec cette méthode, l'iPhone tombe en dessous de 20fps une fois que le nombre de tuiles passe 20. J'apprécierais tout conseil. – Dimitris

+0

Vous pouvez voir ma réponse à cette question: http://stackoverflow.com/questions/595922/how-do-i-prevent-core-animation-blocking-my-main-thread. N'utilisez pas les minuteurs et les fonctions de mise à jour, mais laissez Core Animation faire le travail pour vous. Vous seriez surpris de la performance que vous pouvez obtenir. –

+0

Merci pour le conseil Brad. À la fin, nous avons décidé d'OpenGL! Cela signifie que nous pouvons garder notre logique de jeu. J'ai jeté quelque chose rapidement et j'ai obtenu 60 fps. À votre santé – Dimitris

Questions connexes