(原创)J2ME中利用双缓存技术消除画面闪烁

choaryzhang 2007-04-29 10:46:42
[原文地址:http://home.51.com/home/vip_showdiarys.php?user=yatou_worm&go=2&diary_id=10006329 作者QQ:195374787]
今天在J2ME下开发一个手机游戏的时候,涉及到画面移动的问题。开始的时候,画面移动的速度比较慢,还很容易造成模拟器死机。查下资料,仔细分析了下代码。发现在Canvas中重新绘制画面的时候造成时间等待过多,这样给人的视觉效果就是闪烁。于是决定采用双缓存技术来解决下这个问题。
开始之前先说明下什么是双缓存技术.它是在屏幕外做一个图片的缓存区域,实现在这个缓存区将图片绘制好,然后在将内存缓冲区内的图片传输到手机界面上去。虽然动画切换的比较频繁,但是在进行消除和刷新工作的时候带来的屏幕闪烁。特别注意的是。由于图片是实现在内存中被画好了的,所以在图片比较大的情况下,手机内存占用资源比较厉害。要适当选择使用。
下面是我的写的程序在模拟器上的运行图:


以下是我的代码:有两个类,一个是Canvas画布类。一个是MIDlet主要应用程序。使用的简表是MIDP2.0

**********************************************
public class BallDownCanvas extends Canvas implements Runnable{
int drawX,drawY;//原点坐标
Image source;//内存缓冲区要绘制的图像
Image copy;//缓冲区对象

//构造函数,初始化下落点信息
public BallDownCanvas()
{
drawX=this.getWidth()/2;
drawY=0;
//以下是创建一个可变图像对象,用来在内存中修改参数在界面输出
copy=Image.createImage(this.getWidth(), this.getHeight());
}

protected void paint(Graphics g) {
// TODO Auto-generated method stub
Graphics offScreen=copy.getGraphics();
//清屏
offScreen.setColor(255, 255, 255);
offScreen.fillRect(0, 0, this.getWidth(), this.getHeight());
//绘制下落的方框
offScreen.setColor(0, 0, 0);
offScreen.fillRect(drawX, drawY, 10, 10);
g.drawImage(copy, 0, 0, Graphics.LEFT|Graphics.TOP);
}
public void run() {
// TODO Auto-generated method stub
while(true)
{
this.DOWN();
repaint();

try {
// 线程暂停50秒
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}
public void Start()
{
//启动线程
Thread t=new Thread(this);//记住线程的默认构造参数一定要是this否则无法启动
t.start();
}
protected void DOWN() {
// TODO Auto-generated method stub
//下落距离一次降1,如果超出屏幕底边界,则重置0
if(drawY<this.getHeight())
{
drawY=drawY+1;
}
else
drawY=0;
}
}

************************************************
public class BallDownMid extends MIDlet implements CommandListener {
private Command cmdExit;
private BallDownCanvas bdc;

public BallDownMid() {
// TODO Auto-generated constructor stub
cmdExit=new Command("Exit",Command.EXIT,1);
bdc=new BallDownCanvas();
bdc.addCommand(cmdExit);
bdc.setCommandListener(this);
bdc.Start();
Display.getDisplay(this).setCurrent(bdc);

}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
protected void startApp() throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
public void commandAction(Command c, Displayable d) {
// TODO Auto-generated method stub
if(c==cmdExit)
{
//结束程序
try {
destroyApp(false);
} catch (MIDletStateChangeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
notifyDestroyed();
}
}
}
...全文
373 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

23,404

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧