关于j2me game双缓冲实现探讨

双缓冲技术的应用很广泛,设计游戏的时候更是需要它。 在midp1.0中,api中并没有game这个包,看到网上很多人在讨论设计游戏的时候会出现图片断裂,屏幕闪烁等问题。

我经过这几天的学习整理下自己的学习心得,用来抛砖,希望对此有研究高手们相互讨论。让我也学习学习。

双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板。首先我们在内存环境中建立一个“虚拟“的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘制完毕的时候,再一次性的把内存中绘制好的图形“拷贝”到另一块黑板(屏幕)上。采取这种方法可以提高绘图速度,极大的改善绘图效果。

对于手机来说。具体的过程就是通过extends Canvas。然后获取bufferImage。再然后就getGraphics。最后就是在这个graphics中绘制图片等,再最后就是把这个绘制好的bufferImage绘制的屏幕上。

说归说。具体还是要看代码的。里面的代码参照了一些开源的代码。

java 代码

package org.wuhua.game;

import javax.microedition.lcdui.Canvas;

import javax.microedition.lcdui.Graphics;

import javax.microedition.lcdui.Image;

/**

* 类名:GameCanvas.java

编写日期: 2006-11-29

程序功能描述:

* 实现双缓冲的Game画布。实现原理是创建一个BufferImage。然后绘制,最后显示出来。就这么简单。

Demo:

Bug:

*

*

* 程序变更日期 :

变更作者 :

变更说明 :

*

* @author wuhua

*/

public abstract class GameCanvas extends Canvas {

/**

* 绘制缓冲的图片。用户绘制资源的时候都是操作这个图片来进行的

*/

private Image bufferImage;

private int height;

private int width;

private int clipX, clipY, clipWidth, clipHeight;

private boolean setClip;

protected GameCanvas() {

super();

width = getWidth();

height = getHeight();

this.bufferImage = Image.createImage(width, height);

}

protected void paint(Graphics g) {

//如果要求绘制指定区域的话就需要这样了

if (this.setClip) {

g.clipRect(this.clipX, this.clipY, this.clipWidth, this.clipHeight);

this.setClip = false;

}

g.drawImage(this.bufferImage, 0, 0, Graphics.TOP | Graphics.LEFT);

}

public void flushGraphics(int x, int y, int width, int height) {

this.setClip = true;

this.clipX = x;

this.clipY = y;

this.clipWidth = width;

this.clipHeight = height;

repaint();

serviceRepaints();

}

public void flushGraphics() {

repaint();

serviceRepaints();

}

/**

* 设计者主要是通过调用这个方法获取图片。然后就可以绘制了

* @return

*/

protected Graphics getGraphics() {

return this.bufferImage.getGraphics();

}

/**

* 这个方法主要是处理Nokia平台,用户调用setFullScreenMode(boolean enable) 时重新按照新的w & h创建缓冲图片

*/

protected final void sizeChanged(int w, int h) {

if (h > height) {

this.bufferImage = Image.createImage(w, h);

}

}

}

时间: 2024-09-19 09:06:49

关于j2me game双缓冲实现探讨的相关文章

java的双缓冲技术

Java的强大特性让其在游戏编程和多媒体动画处理方面也毫不逊色.在Java游戏编程和动画编程中最常见的就是对于屏幕闪烁的处理.本文从J2SE的一个再现了屏幕闪烁的Java Appilication简单动画实例展开,对屏幕闪烁的原因进行了分析,找出了闪烁成因的关键:update(Graphics g)函数对于前端屏幕的清屏.由此引出消除闪烁的方法--双缓冲.双缓冲是计算机动画处理中的传统技术,在用其他语言编程时也可以实现.本文从实例出发,着重介绍了用双缓冲消除闪烁的原理以及双缓冲在Java中的两种

c++- 我用VS2010的GDI+写了双缓冲为什么还是画面抖动?

问题描述 我用VS2010的GDI+写了双缓冲为什么还是画面抖动? public: Graphics *gg; Graphics g=dc.GetSafeHdc(); gg->DrawImage(bk,0,0); gg->DrawImage(zj,x,y,0+frame*100,0,100,120,UnitPixel); g.DrawImage(&bb,0,0); 解决方案 Graphics g=dc.GetSafeHdc();此处的dc是兼容dc吗?若不是,建议使用兼容dc. 解决方

C#绘图双缓冲技术总结

GDI+的双缓冲问题终于搞定了, 真是松了一口气!一直以来的误区:.net1.1 和 .net 2.0 在处理控件双缓冲上是有区别的..net 1.1 中,使用:this.SetStyle(ControlStyles.DoubleBuffer, true); .net 2.0中,使用:this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);怪不说老是提示参数无效,一直也不知道是这个问题,呵呵 要知道,图元无闪烁的实现和图元的绘制方法没有多

VC6下的GDI+双缓冲

一.概述 这段时间在研究GDI+双缓冲的实现方法,在网上花了很多时间都没有找到合适的示例,特别是针对VC6的.后来通过对网上资料的分析,和对SDK/MFC的学习,实现了VC6下的GDI+双缓冲,把它写出来与大家分享,希望可以找到更好的实现方法. GDI+的一个优点就是可以直接使用jpg图像,在这个示例中,我没有把图像文件放在资源中,而是动态读取,一是由于项目需求,图像数目是未知的:二是由于动态读文件效率低下,使用双缓冲更能体现出优势. 二.分析 在实现过程中,犯了一个错误,把读图像的方法放在了O

java中的双缓冲技术

毕业设计有个远程协助功能,得到对方的屏幕后,老是会闪,很是不爽,今天用java的双缓冲技术解决了.代码如下,本类重写了Swing中的JLabel,当Label重绘时,会默认的调用它的update方法,主要用于清除界面,然后update方法会调用paint方法,再把界面画上去,所以我现在update方法中创建了一个Image和Graphics对象Image off_screen_buf和off_screen_gc同时设置其大小和MyLabel对象的大小一样,用于把要画的东东先绘制到后台内存中,然后

实例解说双缓冲

本文配套源码 昨天在论坛上,有人问起双缓冲的实现问题,想起网上这方面资料比较凌乱,而且多是DirectX相关的,今天特地在这里给大家简要的介绍一下双缓冲技术及其在VC++的GDI绘图环境下的实现. 1.Windows绘图原理 我们在Windows环境下看到各种元素,如菜单.按钮.窗口.图像,从根本上说,都是"画"出来的.这时的屏幕,就相当于一块黑板,而Windows下的各种GDI要素,如画笔.画刷等,就相当于彩色粉笔了.我们在黑板上手工画图时,是一笔一划的,电脑亦然.只不过电脑的速度比

使用双缓冲技术绘制曲线图

当数据量很大时,绘图可能需要几秒钟甚至更长的时间,而且有时还会出现闪烁现象,为了解决这些问题,可采用双缓冲技术来绘制曲线图. 双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度.双缓冲实现过程如下: 1.在内存中创建与画布一致的缓冲区 BufferBmp=new Graphics::TBitmap(); BufferBmp->Canvas->Handle=CreateCompatibleDC(Ca

BitBlt()双缓冲解决图象闪烁

显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题.而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案. MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单,只要使用方法得当,再加上一些技巧,用MFC可以得到效率很高的绘图程序. 我想就我长期(呵呵当然也只有2年多)使用MFC绘图的经验谈谈我的一些观点. 1.显示的图形为什么会闪烁? 我们的绘图过程大多放在OnDraw或者OnPaint函数中,OnDraw在进行屏幕显示时是由OnPaint进行调用的.当窗口由于任何

使用双缓冲技术实现Android画板应用

双缓冲技术就是当用户操作界面完成后,会有一个缓冲区保存用户操作的结果. 为什么要使用双缓冲技术?拿Android 游戏开发来说,界面贞每次都是全部重画的,也就说画了新的,旧的就没了,所以需要使用双缓冲技术保存之前的内容. 如何实现双缓冲?使用一个Bitmap对象保留之前的画布即可. package com.example.phonegaptest; import android.content.Context; import android.graphics.Bitmap; import and