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 для высокопроизводительного рисования и рисования на поверхности, которая сохраняется между вызовами рисования?

Ответы на вопрос(1)

Ваш ответ на вопрос