BlackBerry Forums Support Community

BlackBerry Forums Support Community (http://www.blackberryforums.com/index.php)
-   Developer Forum (http://www.blackberryforums.com/forumdisplay.php?f=15)
-   -   How to implement double buffering? (http://www.blackberryforums.com/showthread.php?t=204948)

cristisor 09-22-2009 06:37 AM

How to implement double buffering?
 
Hi,
I'm porting a game from MIDP to the BB API but the Screen classes' double buffering doesn't work like in GameCanvas. I can't do all the painting in the paint(g) method so I created an auxiliary buffer and in paint I draw the buffer, but I still get the flickerings:

Code:

theBuffer = new Bitmap(screenWidth, screenHeight);
theGraphics = Graphics.create(theBuffer);

protected void paint(Graphics graphics) {
    super.paint(graphics);
    graphics.pushContext(new XYRect(0, 0, screenWidth, screenHeight), 0, 0);
    graphics.drawBitmap(0, 0, theBuffer.getWidth(), theBuffer.getHeight(), theBuffer, 0, 0);
    graphics.popContext();
}

I draw everything in "theGraphics".

ptys 09-22-2009 07:37 PM

Have you tried the midp version of this game on BB? If you haven't, then it may be just that hardware you're on, and not the lack of buffering. BB's cpu's are much slower than the competition's and it's much harder to get comparable frame rates.

Try avoiding full screen repaints if possible. Instead of buffering the whole screen, try buffering sections of the screen and paint only what's changed, etc. Profile your code.

Quote:

Originally Posted by cristisor (Post 1475649)
Hi,
I'm porting a game from MIDP to the BB API but the Screen classes' double buffering doesn't work like in GameCanvas. I can't do all the painting in the paint(g) method so I created an auxiliary buffer and in paint I draw the buffer, but I still get the flickerings:

Code:

theBuffer = new Bitmap(screenWidth, screenHeight);
theGraphics = Graphics.create(theBuffer);

protected void paint(Graphics graphics) {
    super.paint(graphics);
    graphics.pushContext(new XYRect(0, 0, screenWidth, screenHeight), 0, 0);
    graphics.drawBitmap(0, 0, theBuffer.getWidth(), theBuffer.getHeight(), theBuffer, 0, 0);
    graphics.popContext();
}

I draw everything in "theGraphics".


cristisor 09-23-2009 02:27 AM

The MIDP version is double buffered. After some research I found a way to do the double buffering: I make a secondary buffer, theBuffer, upon which I call the drawing method inside a "invokeAndWait()" and invalidate after this. In the paint method I paint only the buffer on the screen, like in the paint method posted on the first post.

Code:

UiApplication.getUiApplication().invokeAndWait(
        new Runnable() {
            public void run() {
                draw();
                invalidate();
            }
        }
);



All times are GMT -5. The time now is 02:17 AM.

Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2024, vBulletin Solutions Inc.