`
xuyuanshuaaa
  • 浏览: 388317 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

双缓冲技术

阅读更多
    java双缓冲技术是为了解决Java在游戏编程的过程中由于页面刷新频率太快,而引起的页面闪烁问题。
    Android中的SurfaceView类就是双缓冲机制。因此,开发游戏时尽量使用SurfaceView而不要使用View,这样的话效率较高,而且SurfaceView的功能也更加完善。为了更容易的了解双缓冲技术,下面介绍用View实现双缓冲的方法。
    先概述一下,双缓冲的核心技术就是先通过setBitmap方法将要绘制的所有的图形绘制到一个Bitmap上也就是先在内存空间完成,然后再来调用drawBitmap方法绘制出这个Bitmap,显示在屏幕上。具体的实现代码如下:
View类代码:
public class GameView extends View implements Runnable   
{   
    /* 声明Bitmap对象 */  
    Bitmap  mBitQQ  = null;   
       
    Paint   mPaint = null;   
       
    /* 创建一个缓冲区 */  
    Bitmap  mSCBitmap = null;   
       
    /* 创建Canvas对象 */  
    Canvas mCanvas = null;      
       
    public GameView(Context context)   
    {   
        super(context);   
           
        /* 装载资源 */  
        mBitQQ = ((BitmapDrawable) getResources().getDrawable(R.drawable.qq)).getBitmap();   
        /* 创建屏幕大小的缓冲区 */  
        mSCBitmap=Bitmap.createBitmap(320, 480, Config.ARGB_8888);     
           
        /* 创建Canvas */  
        mCanvas = new Canvas();     
           
        /* 设置将内容绘制在mSCBitmap上 */  
        mCanvas.setBitmap(mSCBitmap);    
           
        mPaint = new Paint();   
           
        /* 将mBitQQ绘制到mSCBitmap上 */  
        mCanvas.drawBitmap(mBitQQ, 0, 0, mPaint);   
           
        /* 开启线程 */  
        new Thread(this).start();   
    }   
       
    public void onDraw(Canvas canvas)   
    {   
        super.onDraw(canvas);   
           
        /* 将mSCBitmap显示到屏幕上 */  
        canvas.drawBitmap(mSCBitmap, 0, 0, mPaint);   
    }   
       
    // 触笔事件   
    public boolean onTouchEvent(MotionEvent event)   
    {   
        return true;   
    }   
  
  
    // 按键按下事件   
    public boolean onKeyDown(int keyCode, KeyEvent event)   
    {   
        return true;   
    }   
  
  
    // 按键弹起事件   
    public boolean onKeyUp(int keyCode, KeyEvent event)   
    {   
        return false;   
    }   
  
  
    public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)   
    {   
        return true;   
    }   
       
       
    /**  
     * 线程处理  
     */  
    public void run()   
    {   
        while (!Thread.currentThread().isInterrupted())   
        {   
            try  
            {   
                Thread.sleep(100);   
            }   
            catch (InterruptedException e)   
            {   
                Thread.currentThread().interrupt();   
            }   
            //使用postInvalidate可以直接在线程中更新界面   
            postInvalidate();   
        }   
    }   
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics