ANativeWindow_lock() を使用して取得したピクセル バッファーに一部のピクセルのみを書き込むと、奇妙な動作に気付きました。(0|0) から (320|240) までの線を引きたいとしましょう。そのために、境界パラメータを次のように設定して ANativeWindow_lock() を呼び出しています。
ARect b;
b.left = 0;
b.top = 0;
b.right = 320;
b.bottom = 240;
次に、ブレゼンハムのアルゴリズムを使用してピクセル バッファーに線を引きます。この線は直線ではないため、ANativeWindow_lock() から取得したピクセル バッファー内のごく少数のピクセルのみを変更する必要があります。Bresenham の実装によって変更されるのは、ほとんどの場合、ピクセル バッファー内のスキャンラインごとに 1 ピクセルだけです。残りのピクセル バッファは変更されません。
ここで奇妙な動作が発生します。ANativeWindow_unlockAndPost() を呼び出すと、変更していないすべてのピクセルに、最後に描画された色ではなく、ランダムな色が含まれることがよくあります。これは私を混乱させます: なぜこれらのピクセルは最後に書き込んだ色の値を保持しないのですか?
何が起こっているのかを理解するために、次のケースを検討してください。
- 画面全体を青で塗りつぶします。
- 画面全体を赤で塗りつぶします。
- 画面全体に対角線を引きます。
- 線を描画する直前に画面を完全に赤くクリアしたにもかかわらず、変更していないピクセル バッファの部分が突然青く表示されます。
なぜこれが起こっているのか誰にも説明がありますか? これを回避する唯一の方法は、ANativeWindow_lock() から取得したピクセル バッファー内のすべてのピクセルを常に変更することです。しかしもちろん、線の場合など、一部のピクセルのみを描画する必要がある場合、これは多くのオーバーヘッドを意味します!
Android 2.3 および 3.1 でテスト済み。
何か案は?
ありがとう