大家看这段代码是J2ME实现的双缓冲吗

来源:百度知道 编辑:UC知道 时间:2024/05/27 06:58:08
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
public class GameCanvas extends Canvas implements Runnable {
public Thread thread;
public GameHero hero;
public static final int SCREEN_WITH = 240;
public static final int SCREEN_HIGH = 320;
public static final int GameLogo = 0;
public static final int GameMenu = 1;
public static final int GameStart = 2;
public static int GameState = GameStart;
// NOKIA N73 标准键值
public final int KEY_UP = -1;
public final int KEY_DOWN = -2;
public final int KEY_LEFT = -3;
public final int KEY_RIGHT = -4;
public final int KEY_OK = -5;
//
public Image offscreen;//脱屏画布
public Image Img_Hero;
public Image Img_Black;
public int MapIndex = 0;
public Graphics offG;//脱屏画笔
public GameCanvas(){
off

1. 是实现双缓冲画法了, 但只是用了双缓冲方法, 而没有用到双缓冲的好处, 只是浪费了更多记忆体空间而已! 还不如不用offscreen!

2. 这个问题比较难说, 只能说在这段程序中没问题, 但双缓冲通常不会这么用, 在这段程序中没问题是因为你的代码中的offscreen画了一次之后就没有变化了, 就是说那个图像只是一个静态图像, offG.drawImage(...)写在构造函数中只调了一次, 而在run()中就一直会被调用很多次, 但因为你只是把同一个
图像(即Img_Black)画上去, 所以调用一次或调用多次都是一样!

而使用双缓冲是因为图像会不断改变, 而这个改变不想立即反应到屏幕上(否则屏幕会看到闪烁), 所以画offscreen时通常不会在构造函数中做的, 因为构造函数只会执行一次! 实际使用可看看下面的那段例子!

3. 是的.

有一点必须注意: 使用双缓冲的目的简单的说就是要另到调用g.drawImage(...)的次数减到最少, 这里的g指的是传到paint(...)的Graphics;

下面这例子是根据你的代码修改的, 希望能给你体会到双缓冲的实际用法!

public void paint( Graphics g ){
g.fillRect( 0 , 0 , SCREEN_WITH , SCREEN_HIGH );
switch( GameState ){
case GameLogo:
//把game logo画在offscreen上
offG.drawImage(Img_logo, ....);
break;
case GameMenu:
//drawGameMenu函数中在offscreen上通过offG画上game menu
drawGameMenu();
break;
case GameStart:
//所有游戏的在drawTheGame()中画在offs