【问题标题】:Increase drawing speed of SurfaceView提高SurfaceView的绘制速度
【发布时间】:2016-05-16 15:36:12
【问题描述】:

这是我的项目:我想用从 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 或其他方式?

【问题讨论】:

    标签: java android surfaceview


    【解决方案1】:

    每次调用unlockCanvasAndPost() 时,都会翻转缓冲区,将刚刚提取的缓冲区发送到系统图形合成器(SurfaceFlinger)。如果您绘制的点似乎在闪烁,那是因为 SurfaceView 是双缓冲或三缓冲的。

    SurfaceFlinger 不会从 SurfaceView 丢帧,因此如果您发送它们的速度超过设备显示它们的速度,缓冲区队列将填满并阻塞。每次显示刷新都会显示一个新缓冲区,通常每秒发生 60 次。所以如果你画一个紧密的循环,你不会超过 60fps。

    如果您每秒接收 300 个样本,构建程序的更好方法是尽快接收数据,并在每次屏幕刷新后绘制当前集。您可以通过Choreographer 类从显示中获取回调。

    【讨论】:

    • 感谢您的回答。如果我理解,我达到了每秒 30 帧的速度,因为线程将在第一个缓冲区中打印一个点,而在第二个缓冲区中不打印任何内容,如果我想要每秒 60 帧,我必须创建 2 个画布并将它们称为一个又一个?
    • 不...参见例如en.wikipedia.org/wiki/… 了解双缓冲。我不知道你为什么达到 30fps 而不是 60fps。我可以保证你在同步到显示器时不会达到 300fps。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 2021-06-15
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多