我正在使用 Qt Quick 2 开发一个实时日志绘图仪。它每毫秒接收一次日志数据,我想使用自定义 QQuickItem 以增量方式(到参数曲线)绘制它。
目前我正计划使用 QSGGeometry 并将顶点数据发送到 GPU。但是,由于 QSGGeometry 不支持增量顶点上传,我将不得不每帧发送所有顶点。由于日志大约有一百秒长,我将每帧发送数十万个顶点。每六十秒做一次我觉得自己很傻。
当然,我可以修剪不必要的顶点(那些离其他顶点太近的顶点)并使顶点缓冲区大小可能为 1/30,但我注意到这只是将 GPU 任务带入 CPU。(或者我可以只取 30 个数据中的每一个并发送,但用户可以放大图表,它会很难看。)
相反,我可以使用 QQuickPaintedItem 并在 FrameBufferObject 上逐步绘制,但是当用户拖动图形并且图形重绘时,它将在一帧中发送十万个 gl-calls(或者在 CPU 中执行,但无论如何它会很慢)。
哪一个是更快的方法?还是有更好的方法来做到这一点?
编辑:我想我找到了一个更好的解决方案。我可以递归地拆分数据并自适应地添加点,直到它变得足够平滑。这样我就可以将数据减少到大约 500 个点,这足够便宜,可以每帧发送到 GPU,同时只访问 CPU 中需要的点。唯一的问题是 g++ 是否可以优化递归调用以降低开销。