2010-08-04 7 views
3

J'ai cherché pendant quelques heures et je n'ai pas réussi à trouver une réponse précise et concise à ma question. J'ai une application où j'ai besoin de dessiner un terrain de sport (y compris toutes les lignes de tangage) à l'écran. Jusqu'à présent, j'ai étendu le SurfaceView et copié à peu près le reste de la démo de LunarLander. Toutes les données dont l'application a besoin pour dessiner la hauteur aux bonnes dimensions sont reçues d'une socket qui fonctionne bien aussi. Cependant, à la minute dans la fonction onDraw(), je dessine toutes les lignes de chaque image qui provoque un framerate assez lent dans l'émulateur (par exemple ~ 10fps). Voici ma fonction onDraw():Dessin 2D efficace sous Android

@Override 
public void onDraw(Canvas canvas) { 
canvas.drawARGB(255,0,144,0); 
canvas.drawLine(canvas, getFirstLine(), mPaint); 
canvas.drawRect(canvas, getFirstRect(), mPaint); 
canvas.drawRect(canvas, getSecondRect(), mPaint); 
... 
canvas.drawRect(canvas, getSecondRect(), mPaint); 
drawAnimatedObjects(); 
} 

Ensuite, je dessine des cercles et des positions différentes sur ce fond. Ma question est comment puis-je rendre cela plus efficace? Est-il possible de dessiner les lignes lors de l'initialisation de l'application et de ne pas avoir à les redessiner à chaque image?

Merci pour toute aide.

+0

OpenGL ES fonctionne bien mieux que d'utiliser le canevas. Si vous pouvez suivre cette route, ça vaut le coup. Il y a aussi des démonstrations de dessin 2d dans le projet API Demos. –

+1

Avez-vous testé sur un vrai appareil? Les performances graphiques de l'émulateur ne sont pas représentatives de ce que vous verrez sur les périphériques réels. – adamp

Répondre

10

Vous devez certainement mettre en cache tout dessin de canevas qui ne sera pas converti en bitmap au moment de l'initialisation, puis dessiner ce bitmap dans onDraw(). Cela aidera beaucoup à rendre les temps. Quelque chose comme:

Bitmap mField = null; 

void init() 
{ 
    mField = new Bitmap(...dimensions...); 
    Canvas c = new Canvas(mField); 
    c.drawRect(...); 
    ... 
} 

void onDraw(Canvas c) 
{ 
    c.drawBitmap(mField); 
} 
+0

Merci beaucoup. Cela semble avoir aidé à ne pas finir. –

0

Votre terrain de sport est-il statique ou fait-il défiler l'écran? Si elle est statique, vous devriez envisager de la construire une fois et l'enregistrer comme une image qui sera redessinée à chaque fois. Autre chose: L'émulateur est très lent par rapport aux appareils modernes. Vous devriez vérifier vos performances au moins sur un G1 ou plus tard pour vérifier la performance réelle.