• 1751阅读
  • 5回复

[提问]OpenGL显示100M点数据 [复制链接]

上一主题 下一主题
离线turbine
 

只看楼主 倒序阅读 楼主  发表于: 2020-12-30
手里干的活,是一个仪器的控制软件,在一台工控机上展示采集的100M点数据曲线,要能缩放、平移,系统是win7 32位,4G RAM
一、首先排除QtChart、Qwt、QCustomPlot,因为这些图表库的内部数据都是double,内存不足,已测试确认;
二、参考《C++ GUI Qt 4编程》5.8节的Plotter,改造后不用内部数据,直接显示。测试可显示,没有内存问题,但显示时间实在漫长,完全不可用,更别说缩放、平移;
三、将Plotter改用OpenGL显示曲线,显示时间较长,可接受,但缩放、平移时卡顿严重。

我初学OpenGL,请教:
能否用OpenGL在显存中画出曲线,再设置用ViewPort选择曲线中的某部分,显示在GraphicsView?
这只是我的一个想法,不知道是否可行。或者,还有没有其他方法?


离线turbine

只看该作者 1楼 发表于: 2020-12-30
补充下,能否在OpenGL处理流程中,将光栅化前的数据保存在缓冲区中,再选择曲线中的部分,对该部分继续进行光栅化后的流程,最终显示?
离线20091001753

只看该作者 2楼 发表于: 2020-12-30
Qwt、QCustomPlot 可以首先排除

QtChart 与 QGraphicsView 都可以启用GPU加速,但要注意:
首先,GPU加速需要用代码开启,默认是CPU绘制。
然后,你的工控机上不一定GPU给力,所以还是要看实际效果。

QtChart 开启的方式是
QAbstractSeries::setUseOpenGL();

QGraphicsView 开启的方式是
setViewport( new QGLWidget(QGLFormat(QGL::SampleBuffers)));

QGraphicsView 有个叫 chip 的demo,演示的就是展示大量元素,可以供你参考:
Examples\widgets\graphicsview\chip

(づ ̄ 3 ̄)づ
离线turbine

只看该作者 3楼 发表于: 2020-12-30
回 20091001753 的帖子
20091001753:Qwt、QCustomPlot 可以首先排除
QtChart 与 QGraphicsView 都可以启用GPU加速,但要注意:
首先,GPU加速需要用代码开启,默认是CPU绘制。
然后,你的工控机上不一定GPU给力,所以还是要看实际效果。
....... (2020-12-30 17:25)

QAbstractSeries内部数据是double,100M点存进去,x、y两个值,需要100M×2×8,共1.6GB
工控机只有4G内存,win7 32位只认3.4GB,可分配内存不足
故,QtChart不能用

我现在用Plotter改造,不用内部数据,也不需要x值,直接用100M点数据(short)计算显示,占内存只有240M。
已经实现OpenGL显示,速度可以接受,就是缩放、平移时卡顿,想心思改进下。

chip的demo,我去看看,谢谢!

离线snow_man_0

只看该作者 4楼 发表于: 2020-12-30
双缓冲,全部在QPixmap里画完,再drawPixmap到滚动视图中
缩放可能会重绘、引起卡顿,平移一般不会重绘的

另外,这么大的数据量,不一定要全画,可以按倍数抽稀了画。short 的数据可以用QImage彩图显示,可能会快点(QPainter的老思路)



离线turbine

只看该作者 5楼 发表于: 2020-12-31
回 snow_man_0 的帖子
snow_man_0:双缓冲,全部在QPixmap里画完,再drawPixmap到滚动视图中
缩放可能会重绘、引起卡顿,平移一般不会重绘的
另外,这么大的数据量,不一定要全画,可以按倍数抽稀了画。short 的数据可以用QImage彩图显示,可能会快点(QPainter的老思路)
....... (2020-12-30 23:50) 

谢谢!

我再琢磨下
快速回复
限100 字节
 
上一个 下一个