Android TextureView / Рисование / Производительность рисования
Я пытаюсь сделать приложение для рисования / рисования, используяTextureView
на андроид. Я хочу поддерживать поверхность рисования размером до 4096x4096 пикселей, что представляется разумным для моего минимального целевого устройства (которое я использую для тестирования), которое представляет собой Google Nexus 7 2013, с хорошим четырехъядерным процессором и 2 ГБ памяти.
Одно из моих требований заключается в том, что мое представление должно быть внутри представления, позволяющего увеличивать, уменьшать и панорамировать его, что является всем написанным мной нестандартным кодом (например, UIScrollView из iOS).
Я пытался использовать обычный вид (неTextureView
) с OnDraw и производительность была абсолютно ужасной - менее 1 кадра в секунду. Это случилось, даже если я позвонилInvalidate(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
{
}
}
Если я изменю lockCanvas, чтобы передать null вместо прямоугольника, производительность будет велика при 60 кадрах в секунду, но содержимоеTextureView
мерцают и портятся, что разочаровывает. Я бы подумал, что это будет просто использование буфера кадров OpenGL / текстуры рендера внизу или, по крайней мере, возможность сохранить содержимое.
Есть ли какие-либо другие варианты, кроме как делать все в сыром OpenGL в Android для высокопроизводительного рисования и рисования на поверхности, которая сохраняется между вызовами рисования?