2015年5月24日日曜日

SurfaceのCanvasはダブルバッファなのかトリプルバッファなのか?

一時期Chromeでダブルバッファリング絡みのバグがあって非常に残念な時期があったが、どうも手元のA1000-Fはトリプルバッファなんじゃないかという感じがしています。

いろいろな所に書かれている話としては「SurfaceViewはダブルバッファリングなので~」という感じに書かれていますが、Android4.1の(現時点で古い感じの)端末でトリプルバッファということは、グラフィックスチップに依存する部分なのでしょうね。



もともとの問題はBitmapを内部で保持した時にうまく開放してくれないところから始まりました。

ワーク用のBitmapが保持できないならダブルバッファリングされているCanvasに追記するようにすればいいかなと。

手元のロジックは単純にワーク用のBitmapを更新するようになっているのでダブルバッファリングさせるためには内部的に一つ前の状態も保持する必要がありましたが、思っていたよりは処理はスッキリ出来上がりました。(とはいっても、スクロールには対応できないし、計算が暫定な部分があるので色合いが異なったりしていたり現状では残念なところも多いですが。)

実際に動かしてみると目視で3枚あるように見えました。

検証用にちょっとかいてもよさそうですねぇ

public void init(Context context, int w, int h) {
    cnt = 0;
    paint.setColor(Color.WHITE);
}

public void draw(Canvas canvas) {
    if(cnt < 20) {
        
        canvas.drawText("CNT : " + cnt++, 100, 100 + 32 * cnt, paint);
    }
}



ちょっと試しに書いてみました。
まぁ微妙なクラスの微妙なメソッドのみの抜き出しで超微妙ですが(笑)

initは初期化時でdrawはSurfaceHolderのCanvasに描画するメソッドです。

実際に実行した結果はこちら。
A1000-FとTegra NOTE7で実行してみました。
どちらもトリプルバッファのようです。
Lenovo A1000-F

Tegra Note7

Tegraのほうはダブルバッファなのかなとも思っていたんですけど、実際にスクリーンショットをとると見事にトリプルです。

で、結局バッファのフレーム数はどこで判断すればいいんでしょうかね(笑)

0 件のコメント:

コメントを投稿