我正在尝试TextureView
在 Android 上制作一个绘图/绘画应用程序。我想支持高达 4096x4096 像素的绘图表面,这对于我的最小目标设备(我用于测试)来说似乎是合理的,它是一个具有不错的四核 CPU 和 2GB 内存的 Google Nexus 7 2013。
我的要求之一是我的视图必须位于允许放大和缩小和平移的视图内,这是我编写的所有自定义代码(想想 iOS 中的 UIScrollView)。
我尝试使用TextureView
带有 OnDraw 的常规 View (不是),性能绝对糟糕 - 每秒不到 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 而不是 rect,则性能在 60 fps 时非常出色,但内容会TextureView
闪烁并损坏,这令人失望。我原以为它只是在下面使用 OpenGL 帧缓冲区/渲染纹理,或者至少可以选择保留内容。
除了在 Android 的原始 OpenGL 中执行所有操作以实现高性能绘图和在绘图调用之间保留的表面上绘图之外,还有其他选择吗?