方法一:(感谢此博主,精简有效)
参考链接:
qcustom使用OpenGL加速_远方~的风的博客-CSDN博客_qt使用opengl加速
qcustom使用OpenGL加速
qcustom使用OpenGL加速
qcustomplot开启opengl加速渲染,提示QOpenGLFramebufferObject::bind() called from incompatible context。
在QCPPaintBufferGlFbo::draw()前面加if(QOpenGLContext::currentContext() != mGlContext.data()) {
mGlContext.data()->makeCurrent(mGlContext.data()->surface());
}
使用setOpengl 出现这个情况:
void __cdecl QCustomPlot::setOpenGl(bool,int) QCustomPlot can’t use OpenGL because QCUSTOMPLOT_USE_OPENGL was not defined during compilation (add ‘DEFINES += QCUSTOMPLOT_USE_OPENGL’ to your qmake .pro file)
在pro文件加:Qt +=opengl
添加依赖项:
DEFINES += QCUSTOMPLOT_USE_OPENGL
如果报错不能使用glu的库,这个情况是缺少库文件:
加载qt5.x自带的OpenGL库文件:LIBS+=-lopengl32 -lglu32。
可以看到OpenGL已经进行显卡绘图了
搞定!
customPlot->setOpenGl(true);
qDebug()<<"opengle="<<customPlot->openGl();
方法二:(ps:罗里吧嗦的说了一通 反正我试了是不好使的还费劲 坑人博客)
参考链接:
qcustomplot绘制实时波形图(频谱图、瀑布图、星座图)并开启opengl支持_明卿的博客-CSDN博客_qcustomplot 频谱图
先简单介绍一下,绘制实时数据波形图,我们一般使用到的库有qwt、qcustomplot以及官方的QtCharts模块。
qwt这个库安装比较麻烦,界面老旧,不过功能比较全。
qcustomplot很精简小巧,就一个.h .cpp文件,大量数据绘制时,性能突出。
QtCharts这个模块以前是收费使用的,现在已经免费了,官方出品。
美观:Qcustomplot≈Qchart > Qwt
性能:Qcustomplot >Qchart> Qwt
绘制1000个数据点时,qcustomplot平均耗时 13.6毫秒,Qwt平均耗时40毫秒,QChart平均耗时12.5毫秒;
绘制10000个数据点时,qcustomplot平均耗时 21.6毫秒,Qwt平均耗时78毫秒,QChart平均耗时13.5毫秒;
绘制100000个数据点时,qcustomplot平均耗时22.5毫秒,Qwt平均耗时524毫秒,QChart平均耗时20.7毫秒;
绘制500000个数据点时,qcustomplot平均耗时43.3毫秒,QChart平均耗时194.25毫秒。
今天的主角是qcustomplot,使用的是最新的版本:
下载地址:https://www.qcustomplot.com/
最新版本:2.1.0,于2021年3月29日发布:
它建立了高达Qt 6.0的兼容性(保持兼容性一直到4.6),并包括许多功能添加,错误修复和较小的改进,增加了极坐标波形绘制控件等,需要C++11支持。具体见详细变更列表日志。
官方提供的demo提供了4个例程,这里初入手的特别注意范例plot-examples,其包含了多种效果,修改代码的数字实现不同的demo,如果修改 setupDemo(10);如下图:是Realtime Data Demo。这个就是绘制实时数据的demo。
官方这个没有鼠标当前位置的x/y值,有人封装了一个XCustomPlot类。添加了对鼠标当前位置信息的显示。然后自己在此基础上再次修改了一下,。自己对工程进行简单修改后,修改模拟数据点为20万个点一次刷新,刷新时间16ms。看上去还是很流畅的,我们看到没有开启opengl支持的情况下,cpu使用25%左右。当然显示的屏幕越大,cpu占用率稍微高一点会。
qcustomplot支持opengl绘制,然后我们开启qcustomplot的opengl。不过需要开启QT的opengl模块,同时需要安装glut库,由于GLUT的作者已经很久没更新了(最后更新于2001年!)所以其他人另外做了一个接口兼容GLUT的freeglut库,开源而且一直在维护中。freeglut是glut的超集,支持glut所有的api,跨平台(MS-Win,Linux,Mac OS均支持),并且有长期维护,十分可靠。所以我们继续修改代码让其支持opengl能够利用显卡加速的功能。需要支持opengl需要进行如下修改:
1 在.pro 文件中添加 QT += opengl 模块支持。
2 添加qt中freeglut库的支持,根据自己是使用msvc还是mingw选择不同的配置方式。本文的测试demo使用的是MinGW的配置,具体步骤见我的另一篇文章: https://blog.csdn.net/qing666888/article/details/78946384
3 完成上述配置后,在工程代码中XxwCustomPlot构造函数中,调用setOpenGl(true);开启qcustomplot的opengl模式。下面qDebug是打印当前qcustomplot模式是不是opengl模式。显示true则表示是opengl模式。
setOpenGl(true);
qDebug() << openGl();
开启后我们再看一下效果,可以看到GPU引擎已经开启,同时使用率为20%左右,而上面没开启之前则任务栏GPU列无任何显示:CPU使用率已经下降到20%左右。应为我的模拟数据是使用CPU在处理的。
2020-1-17 上述图源码,opengl库可能要根据自己的库路径配置一下:
https://download.csdn.net/download/qing666888/12288640
2020-5-9 更新一下开启opengl大概步骤说明
把freeglut库文件丢到工程项目目录下。.pro文件中增加如下依赖配置。
#qcustomplot使用opengl的宏定义
DEFINES += QCUSTOMPLOT_USE_OPENGL
#依赖freeglut库以及头文件
INCLUDEPATH += $$PWD/freeglut/include
LIBS += -L$$PWD/freeglut/lib/x64 -lfreeglut
在main.cpp文件中添加依赖#include <GL/freeglut.h>。
在XxwCustomPlot类构造函数中开启qcustomplot的opengl。
setOpenGl(true);
qDebug() << openGl();
2020-6-17 更新,下面效果由于公司项目使用的就不发源码了,开发优化思路在评论区,可根据思路自行开发,都是基于上面的版本基础上,自己修改了一点点qcustomplot源码,完美支持大量数据下的频谱图,瀑布图显示。如下图使用了20万个点的模拟数据,CPU占用13%左右,数据量应该还有提升空间,大概思路,就是重写qcustomplot的插入数据的接口,频谱图瀑布图都全部使用它内部的内存指针进行数据的批量拷贝赋值,而不像它原来的接口一个一个赋值效率太低了,数据稍微一多就非常卡。
2020-8-18 更新,使用qcustomplot控件完成了下面所有控件的开发。以下所有控件都是基于qcustomplot。由于gif图限制5M大小,只能节省空间缩小窗口录了。功能不能一一演示。主要包括了框选放大,波形图柱状图切换显示、框选指定范围测量出范围的频率范围以及时间范围、柱状图色柱动态修改等。主要有瀑布图(支持动态调整色柱配色范围)、频谱图(柱状图模式下支持每个频点柱状颜色设置)、星座图、IQ时域图、相位时域图、幅度时域图、信号识别(柱状图),以上图的数据都是基于信号IQ数据计算得来。所有的图都是基于qcustomplot子类化实现。里面修改了qcustomplot一些细节代码。