我正在尝试使用Android上的
我的要求之一是,我的视图必须位于允许缩放和平移的视图内,这些都是我编写的自定义代码(类似于iOS中的UIScrollView)。
我尝试使用常规的View(而不是
然后我尝试使用
如果我将lockCanvas更改为传递null而不是矩形,则性能非常好,可以达到60 fps,但是
除了在Android中使用原始OpenGL进行高性能绘图和绘画的一切工作以外,还有其他选择吗?这样可以在绘制调用之间保留表面。
TextureView
制作绘画应用程序。我希望支持多达4096x4096像素的绘图表面,这对于我的最低目标设备(我用于测试)——Google Nexus 7 2013是合理的,该设备配备了一个不错的四核CPU和2GB内存。我的要求之一是,我的视图必须位于允许缩放和平移的视图内,这些都是我编写的自定义代码(类似于iOS中的UIScrollView)。
我尝试使用常规的View(而不是
TextureView
)和OnDraw,但性能非常差 - 不到1帧每秒。即使我只调用更改后的rect参数的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 fps,但是
TextureView
的内容会闪烁和损坏,这令人失望。我本以为它只是在底层使用OpenGL帧缓冲区/渲染纹理或至少有一个选项来保留内容。除了在Android中使用原始OpenGL进行高性能绘图和绘画的一切工作以外,还有其他选择吗?这样可以在绘制调用之间保留表面。