0

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

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

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

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

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

  1. 用蓝色填充整个屏幕。
  2. 用红色填充整个屏幕。
  3. 在整个屏幕上画一条对角线。
  4. 现在我没有修改的像素缓冲区部分突然出现在蓝色,尽管我在画线之前已经将屏幕清除为完全红色。

有人解释为什么会这样吗?解决此问题的唯一方法是始终修改从 ANativeWindow_lock() 获得的像素缓冲区中的所有像素。但是当然,如​​果只需要绘制一些像素,这通常意味着很多开销,例如在线条的情况下!

在 Android 2.3 和 3.1 上测试。

有任何想法吗?

谢谢

4

1 回答 1

0

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

于 2012-07-09T12:56:29.010 回答