在ANativeWindow_lock()期间只写一些像素

时间:2012-07-08 09:44:55

标签: android android-ndk

在将一些像素写入使用ANativeWindow_lock()获得的像素缓冲区时,我注意到了一些奇怪的行为。我们假设我想从(0 | 0)到(320 | 240)画一条线。为此,我调用ANativeWindow_lock()并将boundary参数设置为:

ARect b;
b.left = 0;
b.top = 0;
b.right = 320;
b.bottom = 240;

然后我使用Bresenham算法将我的线绘制到像素缓冲区。因为线不直,我只需修改从ANativeWindow_lock()获得的像素缓冲区中的极少数像素。它主要只是像素缓冲区中每个扫描线的一个像素,由我的Bresenham实现修改。像素缓冲区的其余部分保持不变。

现在出现奇怪的行为:当我现在调用ANativeWindow_unlockAndPost()时,我没有修改的所有像素通常包含一些随机颜色而不是最后绘制的颜色。这让我感到困惑:为什么这些像素不能保留我上次写给他们的颜色值?

考虑以下案例来了解发生了什么:

  1. 用蓝色填充整个屏幕。
  2. 用红色填充整个屏幕。
  3. 在整个屏幕上画一条对角线。
  4. 现在我没有修改的像素缓冲区的部分突然出现在蓝色中,虽然我在绘制线之前已经将屏幕清除为完全红色。
  5. 有没有人解释为什么会这样?解决这个问题的唯一方法是始终修改从ANativeWindow_lock()获得的像素缓冲区中的所有像素。但是,如果只需要绘制一些像素,这通常意味着很多开销,例如在一条线的情况下!

    在Android 2.3和3.1上测试过。

    有什么想法吗?

    由于

1 个答案:

答案 0 :(得分:0)

David Turner解释了Android NDK邮件列表的内容:Android使用双倍甚至三倍缓冲,这就是为什么在调用ANativeWindow_lock()时无法对像素缓冲区中的内容做出任何假设,并且总是必须刷新所有像素在要更新的矩形中。