2011-08-15 4 views
0

Je commence un nouveau projet, et jusqu'à présent, j'ai fait une application simple qui a une image qui est dessiné sur un Canvas, que vous pouvez faire glisser autour de l'écran avec votre doigt. L'idée est de tirer beaucoup de choses sur ce Canvas pour un jeu. Cependant, le glissement est extrêmement lent, tout en faisant glisser avec mon doigt l'écran met à jour l'image peut-être 2-3 fois par seconde. C'est très lent, donc je suppose que je le fais très mal (je suis sur un Nexus S).Existe-t-il une meilleure façon de créer un arrière-plan pouvant être déplacé?

J'ai seulement les barebones de l'application, juste un SurfaceView contenant un fil pour mettre à jour le Canvas avec cette image. Voici le code:

// In GameThread 

private void doDraw(Canvas c) { 
    if(canvasInit){ 
     Bitmap background = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg); 
     c.drawBitmap(background, offsetX, offsetY, null);   
    } 
} 


public boolean doTouchDown(MotionEvent event) { 
    if(drag == false){ 
     //initialize drag 
     startX = event.getX(); 
     startY = event.getY(); 
     drag = true; 
    }else{ 
     //caluclate new position 
     offsetX = Math.max(Math.min(0, offsetX + (event.getX() - startX)), mCanvasWidth - BACKGROUND_WIDTH); 
     offsetY = Math.max(Math.min(0, offsetY + (event.getY() - startY)), mCanvasHeight- BACKGROUND_HEIGHT); 
     startX = event.getX(); 
     startY = event.getY(); 
    } 
    return true; 
} 

public boolean doTouchUp(MotionEvent event){ 
    drag = false; 
    return true; 
} 

Répondre

1

Vous semblez charger le Bitmap chaque fois que vous dessinez. Vous pouvez essayer de déplacer le chargement de la ressource vers une sorte de méthode d'initialisation/constructeur SurfaceView et comparer la performance?

Bitmap background; 
... 

private void init() { 
    ... 
    background = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg); 
    ... 
} 

private void doDraw(Canvas c) { 
    if(canvasInit){ 
     c.drawBitmap(background, offsetX, offsetY, null);   
    } 
} 
1

Je pense que le problème est dans la méthode doDraw, votre création d'une nouvelle image chaque Draw, essayez de charger cette Bitmap dans Constructor puis obtenir référence dans doDraw méthode, et d'en tirer à l'aide de votre x et y.

Questions connexes