2012-10-08 6 views
1

J'essaie de dessiner de manière incrémentielle une forme d'onde sur un canevas dans un fil séparé, c'est-à-dire dans chaque boucle du fil dessine uniquement la partie récemment acquise par le matériel sans redessiner toute la courbe.dessin incrémental

Je ne suis pas sûr si je peux compter sur le contenu de la toile retenu entre SurfaceHolder.unlockCanvasAndPost et SurfaceHolder.lockCanvas.

La documentation semble être un peu ambiguë sur ce point et mes expériences donnent des résultats surprenants: le "vieux" contenu est différent pour le canevas retourné dans deux boucles suivantes du fil de dessin. Il semble que deux toiles aient été utilisées alternativement (mais j'ai vérifié - c'est la même toile mais avec des contenus différents).

La façon la plus simple que je trouve de reproduire ce comportement:

  1. Importer l'exemple LunarLander applicaton.

  2. Dans la méthode LunarView.run, insérez l'instruction sleep (500) dans la boucle. Dans la méthode LunarView.doDraw, mettez en commentaire la ligne: canvas.drawBitmap(mBackgroundImage, 0, 0, null);, qui efface l'ancien contenu.

Exécutez le jeu et laissez le navire s'écraser. Vous verrez les positions intermédiaires du navire mais elles clignoteront: les positions paires et impaires seront affichées alternativement. Donc, ma question est: pouvons-nous dessiner des images en ajoutant des changements seulement au contenu qui a été dessiné auparavant et si oui, y a-t-il une façon documentée de traiter le comportement étrange décrit ci-dessus?

+0

utilisent deux bitmaps. Une avec le fond, et une avec le contenu en mouvement – Doomsknight

+0

@Doomsknight. Merci pour le commentaire, cependant le problème n'est pas de dessiner le fond, mais dans le fait que certaines parties de la courbe dessinées dans les boucles précédentes sont visibles à chaque seconde boucle du fil de dessin. Bien sûr, si je ne trouve pas de réponse à ma question, j'utiliserai un bitmap de cache, mais je dois réduire le temps de dessin autant que possible. –

+0

Basé sur l'atterrissage lunaire, quand j'ai utilisé cela comme base, j'ai eu le même problème. c'était essentiellement aller et venir entre deux images dessinées. Lisez attentivement le code et réfléchissez à ce qu'il fait. C'est probablement un bug dans le code d'origine. – Doomsknight

Répondre

0

L'atterrissage lunaire ne cache pas. Il dessine l'image d'arrière-plan à chaque fois (actualisation) puis dessine le vaisseau spatial.

private void doDraw(Canvas canvas) { 
      // Draw the background image. Operations on the Canvas accumulate 
      // so this is like clearing the screen. 
      canvas.drawBitmap(mBackgroundImage, 0, 0, null); 

Vérifiez vos clauses If de manière close. Peut-être que l'on alterne vrai et faux. Cela ferait dessiner les choses et ensuite ne pas dessiner, en succession rapide.

Utilisez Log si besoin est pour afficher vos booléens, pour voir si l'un change. A défaut, ceci est la boucle de jeu suivante à la place.

http://blorb.tumblr.com/post/236799414/simple-java-android-game-loop

Questions connexes