【问题标题】:Double buffering in Java on Android with canvas and surfaceview使用canvas和surfaceview在Android上使用Java进行双缓冲
【发布时间】:2011-09-26 04:12:45
【问题描述】:

如何做到这一点?谁能给我一个大纲?

根据我在网上找到的,它似乎在我的 run() 函数中:

  1. 创建位图
  2. 创建一个画布并将其附加到位图
  3. lockCanvas()
  4. 调用draw(canvas)并将位图绘制到后台缓冲区(如何??)
  5. 解锁CanvasAndPost()

这是正确的吗?如果是这样,我能得到一点解释吗?这些步骤是什么意思,我该如何实施?我以前从未为 Android 编程过,所以我是一个真正的菜鸟。如果不正确,我该怎么做?

【问题讨论】:

    标签: java android canvas doublebuffered


    【解决方案1】:

    Android Developers Group 的步骤说您需要一个缓冲区画布,所有渲染都被绘制到该画布上。

    Bitmap buffCanvasBitmap;
    Canvas buffCanvas;
    
    // Creating bitmap with attaching it to the buffer-canvas, it means that all the changes // done with the canvas are captured into the attached bitmap
    tempCanvasBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
    tempCanvas = new Canvas();
    tempCanvas.setBitmap(tempCanvasBitmap);
    
    // and then you lock main canvas
    canvas = getHolder().lockCanvas();              
    // draw everything you need into the buffer
    tempCanvas.drawRect.... // and etc
    // then you draw the attached bitmap into the main canvas
    canvas.drawBitmap(tempCanvasBitmap, 0, 0, drawView.getPaint());
    // then unlocking canvas to let it be drawn with main mechanisms
    getHolder().unlockCanvasAndPost(canvas);
    

    您正在获取主缓冲区,您正在绘制该缓冲区,而不会在每个持有者的锁上获得不同的双缓冲区画布。

    【讨论】:

    • 我觉得这里的变量名有点乱?
    【解决方案2】:

    它已经是双缓冲的,这就是 unlockCanvasAndPost() 调用的作用。无需创建位图。

    【讨论】:

    • 我不太明白。所以,我只是在锁定和解锁之间画出我需要的一切,然后……双缓冲是自己发生的吗?在我锁定之前我不需要也画吗?抱歉,我需要以最基本的方式解释这一点...
    • @TheBeatlemaniac:当您在调用lockCanvas() 之后在Canvas 上绘图时,您实际上是在下一个 帧上绘图,而当前帧正在显示。 unlockCanvasAndPost() 调用将用当前帧缓冲区切换下一个帧缓冲区,以显示更新的Canvas
    • 如果您希望能够放大/缩小并移动“工作空间”,位图部分会派上用场。
    猜你喜欢
    • 2011-02-20
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多