Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Double buffering in Java on Android with canvas and surfaceview

How does one go about doing this? Could somebody give me an outline?

From what I've found online, it seems like in my run() function:

  1. create a bitmap
  2. create a canvas and attach it to the bitmap
  3. lockCanvas()
  4. call draw(canvas) and draw bitmap into back buffer (how??)
  5. unlockCanvasAndPost()

Is this correct? If so, could I get a bit of an explanation; what do these steps mean and how do I implement them? I've never programmed for Android before so I'm a real noob. And if it isn't correct, how DO I do this?

like image 453
Kalina Avatar asked Jun 30 '11 17:06

Kalina


2 Answers

It's already double buffered, that's what the unlockCanvasAndPost() call does. There is no need to create a bitmap.

like image 171
Romain Guy Avatar answered Sep 28 '22 05:09

Romain Guy


The steps from Android Developers Group say that you need a buffer-canvas, to which all the renders are drawn onto.

Bitmap buffCanvasBitmap;
Canvas buffCanvas;

// Creating bitmap with attaching it to the buffer-canvas, it means that all the changes // done with the canvas are captured into the attached bitmap
tempCanvasBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
tempCanvas = new Canvas();
tempCanvas.setBitmap(tempCanvasBitmap);

// and then you lock main canvas
canvas = getHolder().lockCanvas();              
// draw everything you need into the buffer
tempCanvas.drawRect.... // and etc
// then you draw the attached bitmap into the main canvas
canvas.drawBitmap(tempCanvasBitmap, 0, 0, drawView.getPaint());
// then unlocking canvas to let it be drawn with main mechanisms
getHolder().unlockCanvasAndPost(canvas);

You are getting the main buffer, which you are drawing into without getting different double-buffer canvas' on each holder's lock.

like image 26
Rustem Galiullin Avatar answered Sep 28 '22 04:09

Rustem Galiullin