提高 SurfaceView 的绘图速度
Increase drawing speed of SurfaceView
这是我的项目:我想用从 USB 端口接收到的数据打印图形。
我目前正在使用 SurfaceView
,但我只是注意到它每秒将通过线程 30 次,但我想快 10 倍。
public void run() {
while (isItOK) {
if (!holder.getSurface().isValid()) {
continue;
}
Canvas c = holder.lockCanvas();
c.drawPoint(pos, 50, p);
holder.unlockCanvasAndPost(c);
}
}
有没有办法提高速度,或者我必须使用 GLSurfaceView
或其他方式?
每次调用 unlockCanvasAndPost()
时,您都在翻转缓冲区,将刚刚提取的缓冲区发送到系统图形合成器 (SurfaceFlinger)。如果您绘制的点似乎在闪烁,那是因为 SurfaceView 是双缓冲或三缓冲的。
SurfaceFlinger 不会从 SurfaceView 丢帧,因此如果您发送它们的速度快于设备可以显示它们的速度,缓冲区队列将填满并阻塞。每次显示刷新都会显示一个新缓冲区,通常每秒发生 60 次。所以如果你画一个紧密的循环,你不会超过60fps。
如果您每秒接收 300 个样本,构建程序的更好方法是尽快接收数据,并在每次屏幕刷新后绘制当前集。您可以通过 Choreographer class.
从显示中获取回调
这是我的项目:我想用从 USB 端口接收到的数据打印图形。
我目前正在使用 SurfaceView
,但我只是注意到它每秒将通过线程 30 次,但我想快 10 倍。
public void run() {
while (isItOK) {
if (!holder.getSurface().isValid()) {
continue;
}
Canvas c = holder.lockCanvas();
c.drawPoint(pos, 50, p);
holder.unlockCanvasAndPost(c);
}
}
有没有办法提高速度,或者我必须使用 GLSurfaceView
或其他方式?
每次调用 unlockCanvasAndPost()
时,您都在翻转缓冲区,将刚刚提取的缓冲区发送到系统图形合成器 (SurfaceFlinger)。如果您绘制的点似乎在闪烁,那是因为 SurfaceView 是双缓冲或三缓冲的。
SurfaceFlinger 不会从 SurfaceView 丢帧,因此如果您发送它们的速度快于设备可以显示它们的速度,缓冲区队列将填满并阻塞。每次显示刷新都会显示一个新缓冲区,通常每秒发生 60 次。所以如果你画一个紧密的循环,你不会超过60fps。
如果您每秒接收 300 个样本,构建程序的更好方法是尽快接收数据,并在每次屏幕刷新后绘制当前集。您可以通过 Choreographer class.
从显示中获取回调