Android Canvas 表面视图

Android Canvas SurfaceView

我想知道关于使用 SurfaceView 和 Canvas 在屏幕上绘图的一种特定行为。

当我锁定 canvas 以在我的 SurfaceView 中操作屏幕像素时,您总是需要做一件事:透支 [=45] 的先前像素=] 例如黑色之类的颜色。

现在有时我会忘记这个和我以前的画在当前帧中可见。

此外,就像每一层都会被一次又一次地绘制,就好像不仅有一个(或两个,因为在 Android 绘图是三重缓冲)缓冲区,而且会生成更多的缓冲区和像素数据好像是一层层从里面加载出来的。

所以画的不是透支,而是像前面说的那样一层一层地画。除了它看起来像动画并且不符合显示的 "vsync"(刷新率)的事实外,还有让我想知道性能问题的事实,这也是一个让我烦恼的事实,因为我无法弄清楚为什么像素拼命设置。

应该是这样的:

我在第一帧的 x,y 处画了一个圆 然后在 2nd 我在 x+1,y+1

处画圆

现在 canvas 上会有两个圆圈,因为我还没有覆盖第一帧像素

现在就这样进行,每帧在另一个位置绘制圆....

现在假设我们在第 1234 帧

现在看起来好像每个圆都是单独绘制的,就像它开始绘制时一样,而不是在某个特定时间,surfaceflinger 来了,想要一个缓冲区来显示他只是抓住了一个还没有准备好绘制 1234 个圆的后缓冲区并显示它

(我希望你现在明白我说的画看起来像动画是什么意思了)

他只是在展示不同绘图状态的屏幕

这是为什么?

可以在 Android Graphics Architecture document.

中找到各种机制的完整描述

Surface通常是双缓冲的,但也可以是三缓冲的。如果它是双缓冲的,并且您绘制了 1000 个圆圈,一个缓冲区将包含所有偶数编号的圆圈,而一个缓冲区将包含所有奇数编号的圆圈。如果它是三重缓冲的,那么一个缓冲区将具有圆圈 0、3、6、...,另一个将具有圆圈 1、4、7、...,依此类推。每次绘制时,它都会循环到下一个缓冲区,因此每次绘制到屏幕时都会看到圆圈 "vibrate" 或 "animate"。

无法保证此行为 -- 缓冲区的数量不固定,并且不能保证给定的缓冲区在换出后会继续使用 -- 所以你不想依赖这个.

如果不想每次都清屏,可以指定一个"dirty"矩形,只在该区域绘制。系统可以拒绝你的脏矩形并用一个更大的矩形替换它,但这应该只发生在第一次绘制周期(因为没有以前的像素数据要保留)。