TextureView
Androidでお絵かきアプリを作ろうとしています。最大 4096x4096 ピクセルの描画面をサポートしたいと考えています。これは、適切なクアッド コア CPU と 2GB メモリを搭載した Google Nexus 7 2013 である最小ターゲット デバイス (テストに使用) には妥当と思われます。
私の要件の 1 つは、ビューをズームイン、ズームアウト、およびパンできるビュー内に配置する必要があることです。これはすべて、私が作成したカスタム コードです (iOS の UIScrollView を考えてください)。
私はTextureView
OnDraw で通常のビュー (ではない) を使用しようとしましたが、パフォーマンスはまったくひどいものでした - 1 秒あたり 1 フレーム未満でした。これはInvalidate(rect)
、変更された rect だけで呼び出しても発生しました。ビューのハードウェア アクセラレーションをオフにしようとしましたが、4096x4096 はソフトウェアには大きすぎるため、何もレンダリングされませんでした。
その後、使用してみTextureView
ましたが、パフォーマンスは少し良くなりました.毎秒約5〜10フレームです(それでもひどいですが、より良いです). ユーザーはビットマップに描画し、後でバックグラウンド スレッドを使用してテクスチャに描画します。私は Xamarin を使用していますが、コードが Java の人々にとって意味のあるものであることを願っています。
private void RunUpdateThread()
{
try
{
TimeSpan sleep = TimeSpan.FromSeconds(1.0f / 60.0f);
while (true)
{
lock (dirtyRect)
{
if (dirtyRect.Width() > 0 && dirtyRect.Height() > 0)
{
Canvas c = LockCanvas(dirtyRect);
if (c != null)
{
c.DrawBitmap(bitmap, dirtyRect, dirtyRect, bufferPaint);
dirtyRect.Set(0, 0, 0, 0);
UnlockCanvasAndPost(c);
}
}
}
Thread.Sleep(sleep);
}
}
catch
{
}
}
rect の代わりに null を渡すように lockCanvas を変更すると、パフォーマンスは 60 fps で優れていますが、コンテンツがちらついてTextureView
破損し、残念です。単純に OpenGL フレーム バッファを使用するか、その下にテクスチャをレンダリングするか、少なくともコンテンツを保持するオプションがあると考えていました。
Android の生の OpenGL ですべてを実行する以外に、ドローコール間で保持されるサーフェス上で高性能の描画とペイントを行うオプションはありますか?