gpt4 book ai didi

android - 当通过 Canvas.drawBitmap() 绘制的位图实际绘制在屏幕上时?

转载 作者:行者123 更新时间:2023-11-29 01:46:57 28 4
gpt4 key购买 nike

我已经覆盖了自定义 View 中的 onDraw() 方法。我的方法如下所示:

protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

data.lockData(); // uses reentrantlock
Bitmap bm = data.getBitmap();

if (bm != null) {
canvas.drawBitmap(bm,0,0,mPaint);
}
data.unlockData();
}

还有一个更新位图的线程,这个线程也使用lockData()方法来保证对位图的序列化访问。但是,我看到正在绘制的位图包含不完整的更新,即它在另一个线程更新的过程中被绘制到屏幕上。我不知道 Android 绘图管道的详细信息是否足够详细(或者实际上没有任何详细信息:),但我认为这是由于 drawBitmap() 实际上并未绘制位图,而只是将其放入绘制操作队列带有指向位图的指针,稍后系统的另一部分将使用此指针将位图像素的所需部分复制到将在屏幕上显示的缓冲区。因此,实际绘图不受互斥量保护。

有一个经典的解决方案,即双缓冲,我认为它可以在这种情况下工作。但是,我仍然认为我的绘制线程可能太快了,以至于它实际上会在实际绘制完成之前更新正在再次绘制的缓冲区。此外,我的位图可能非常大,分配一个单独的缓冲区会有些浪费。

我的问题是:

  1. 我对不完整绘制原因的上述理解是否正确,即 drawBitmap 在位图数据实际复制到显示器之前返回?您能否提供有关绘图工作原理的详细信息?

  2. 有没有办法知道位图实际绘制的时间,从而再次安全地修改位图?

  3. 如果双缓冲是唯一的解决方案,我如何确保 buffer1 已完成绘制,然后再允许 buffer1 用新数据再次更新?

最佳答案

我无法使 View 绘图同步。一种可行的方法是在 onDraw() 方法中进行计算,即 Bitmap bm = data.getBitmap();会计算更新的位图。这样做的缺点是,这会在计算期间阻塞 UI 线程,从而导致或例如错过输入事件等。

克服这个问题的一种方法是改用 SurfaceView。可以在单独的线程中进行计算和绘图,从而序列化这两个操作,同时仍然让 UI 线程空闲。

关于android - 当通过 Canvas.drawBitmap() 绘制的位图实际绘制在屏幕上时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20906525/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com