Android 在ANativeWindow_lock()期间仅写入一些像素

Android 在ANativeWindow_lock()期间仅写入一些像素,android,android-ndk,Android,Android Ndk,我注意到在使用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获得的像素

我注意到在使用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_Unlock和Post时,我没有修改的所有像素通常都包含一些随机颜色,而不是上次绘制的颜色。这让我很困惑:为什么这些像素没有保留我上次写入它们的颜色值

考虑以下情况以了解发生了什么:

用蓝色填充整个屏幕。 用红色填充整个屏幕。 在整个屏幕上画一条对角线。 现在,我没有修改的像素缓冲区部分突然显示为蓝色,尽管在画线之前我已经清除了屏幕上的红色。 有人能解释为什么会这样吗?唯一的解决方法是始终修改从ANativeWindow_lock获得的像素缓冲区中的所有像素。但当然,如果只需要绘制一些像素,这通常意味着大量开销,例如在直线的情况下

在安卓2.3和3.1上测试

有什么想法吗


感谢

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