• 16303阅读
  • 30回复

[提问]哪位大神知道在Qt中绘大量点的好方法,刷新速率3ms左右 [复制链接]

上一主题 下一主题
离线wangmingxiao
 

只看楼主 正序阅读 楼主  发表于: 2015-07-29
如题:我在QGraphicsView框架试了,因为是雷达显示,将一个圆切割成很多扇形,但是QGraphicsItem的边框只能是矩形,这样每次更新一个item的时候会把覆盖它的其他item都更新,效率低,画的时候看cpu在90%左右(这太夸张了,看网上说是每次都重绘全部?),哪位大神知道怎么把item的boundingRect设置为扇形或者三角形么?
然后又用直接在窗口上会图,但是每次都是全部重绘(将存的数据全部取出重绘),cpu虽然没占那么高,但根本不能及时刷新,请问有没有知道在qt中怎么使用内存绘图或者区域绘图(刷新)?
或者说有没有好的实时绘大量图形的方法?谢谢各位了》》》
能不能简单点
离线johnyork

只看该作者 30楼 发表于: 2015-11-24
是否可以考虑直接操作QPainter用基本的drawEllipse或者drawPoint来绘制?每个点的位置、半径(如果需要的话)需要自己用容器类管理,但是速度应该比用Item管理要快点吧?
离线wangmingxiao

只看该作者 29楼 发表于: 2015-11-24
回 uidab 的帖子
uidab:我不清楚你的代码,对于我的代码,就是基本的GL的绘制。 (2015-11-24 08:46) 

好吧,版主知道在qt中怎么操作显存没,第三方库也行,现在遇到瓶颈了
能不能简单点
离线uidab

只看该作者 28楼 发表于: 2015-11-24
回 wangmingxiao 的帖子
wangmingxiao:能不能告诉下用什么方法呢?GUI环境能操作显存吗? (2015-11-24 08:39) 

我不清楚你的代码,对于我的代码,就是基本的GL的绘制。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线wangmingxiao

只看该作者 27楼 发表于: 2015-11-24
回 uidab 的帖子
uidab:没谈下来,我只参照网上的例子写了一个非常简单的。 (2015-11-24 08:01) 

能不能告诉下用什么方法呢?GUI环境能操作显存吗?
能不能简单点
离线uidab

只看该作者 26楼 发表于: 2015-11-24
回 wangmingxiao 的帖子
wangmingxiao:版主,不知道你的雷达项目怎么样了?现在遇到的问题是opengl+qt勉强能解决绘图的问题,但是效率还是不行。qt中操作显存不起作用呀,有没有什么好方法呢? (2015-11-23 21:49) 

没谈下来,我只参照网上的例子写了一个非常简单的。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线wangmingxiao

只看该作者 25楼 发表于: 2015-11-23
回 圣域天子 的帖子
圣域天子:关掉自动刷,由于人的眼镜可接受的刷新是每秒20多,好象是24-25吧。
所以你可以每40ms刷新一次,不需要每3ms刷新的。 (2015-08-03 09:08) 

问下版主在Qt中怎么直接操作显存呢??
能不能简单点
离线wangmingxiao

只看该作者 24楼 发表于: 2015-11-23
回 uidab 的帖子
uidab:刚用到Qt里的OpenGL类,还不清楚。vc中用OpenGL确实对画图有一些提高! (2015-07-29 16:20) 

版主,不知道你的雷达项目怎么样了?现在遇到的问题是opengl+qt勉强能解决绘图的问题,但是效率还是不行。qt中操作显存不起作用呀,有没有什么好方法呢?
能不能简单点
离线stlcours

只看该作者 23楼 发表于: 2015-08-03
回 圣域天子 的帖子
圣域天子:关掉自动刷,由于人的眼镜可接受的刷新是每秒20多,好象是24-25吧。
所以你可以每40ms刷新一次,不需要每3ms刷新的。 (2015-08-03 09:08) 

好像不是这么回事吧。记得CRT显示器年代,刷新频率60还是觉得闪烁而且眼睛痛,到80才不疼不闪烁了。所以人眼应该是60~80之间。
离线圣域天子

只看该作者 22楼 发表于: 2015-08-03
关掉自动刷,由于人的眼镜可接受的刷新是每秒20多,好象是24-25吧。
所以你可以每40ms刷新一次,不需要每3ms刷新的。
离线彩阳

只看该作者 21楼 发表于: 2015-08-02
回 uidab 的帖子
uidab:刚用到Qt里的OpenGL类,还不清楚。vc中用OpenGL确实对画图有一些提高! (2015-07-29 16:20) 

OpenGL是三维渲染的强项。虽然二维渲染也是可行的。
Qt中使用OpenGL做二维渲染最最典型的例子就是Qt Quick框架,其次就是QGraphics-View + OpenGL。
建议学习Qt Quick以及底层的实现Scene Graph框架。
上海Qt开发联盟,热忱地欢迎你的加入!
离线wangmingxiao

只看该作者 20楼 发表于: 2015-08-01
回 daily 的帖子
daily:openGL +shader. 使用drawbackground 函数中绘制。1000W个点不会有啥压力。
 (2015-07-29 11:15) 

我用opengl+drawbackground中绘制,速度是满足了,但是cpu消耗率好高,正常的绘直径1000的一半所有cpu消耗60%多。全部画就消耗90%多了,opengl有没有区域绘图的思想。。。
能不能简单点
离线uidab

只看该作者 19楼 发表于: 2015-07-29
回 wangmingxiao 的帖子
wangmingxiao:在qt中使用自带的opengl类来绘图是不是跟opengl绘图是一样的,对速率有很大提高? (2015-07-29 16:15) 

刚用到Qt里的OpenGL类,还不清楚。vc中用OpenGL确实对画图有一些提高!
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线wangmingxiao

只看该作者 18楼 发表于: 2015-07-29
回 uidab 的帖子
uidab:数据量不大的话,可以画在qimage或qpixmap上,如果数据量很大OpenGL是可以用的。
至于雷达方面,刚开始接触,也不清楚。 (2015-07-29 15:59) 

在qt中使用自带的opengl类来绘图是不是跟opengl绘图是一样的,对速率有很大提高?
能不能简单点
离线uidab

只看该作者 17楼 发表于: 2015-07-29
回 wangmingxiao 的帖子
wangmingxiao:版主有没有什么好的绘图方法,我也还在摸索中,感觉单独用qt有点恼火呀 (2015-07-29 14:28) 

数据量不大的话,可以画在qimage或qpixmap上,如果数据量很大OpenGL是可以用的。
至于雷达方面,刚开始接触,也不清楚。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线wangmingxiao

只看该作者 16楼 发表于: 2015-07-29
回 firebolt 的帖子
firebolt:你不是用的QGraphicsItem做的吗? (2015-07-29 15:48) 

是呀,item不知道怎么后台绘图呀,item里面的绘图操作在每次更新时都是绘到屏幕上吧
能不能简单点
离线firebolt

只看该作者 15楼 发表于: 2015-07-29
回 wangmingxiao 的帖子
wangmingxiao:想问下后台缓冲区是不是就是Qimage或者Qpixmap,还是有其他的方法? (2015-07-29 15:20) 

你不是用的QGraphicsItem做的吗?
离线wangmingxiao

只看该作者 14楼 发表于: 2015-07-29
回 firebolt 的帖子
firebolt:后台绘制就是你接收到数据后,先把图像绘制到一个后台缓冲区里,然后再把它贴到显示区域里,就视频播放一样,通过帧率来控制。 (2015-07-29 14:45) 

想问下后台缓冲区是不是就是Qimage或者Qpixmap,还是有其他的方法?
能不能简单点
离线firebolt

只看该作者 13楼 发表于: 2015-07-29
回 wangmingxiao 的帖子
wangmingxiao:这个例子我研究过,大概也是采用这种分割的方法,但是item只能为矩形,你有什么办法设置为扇形?个人感觉例子中虽然缩放没问题,不会卡,那是因为刷新率比较低,如果一直在刷新就可能又问题吧?
还有就是你说的后台绘制是个怎么绘制的方法,不太懂。。。。。 (2015-07-29 14:33) 

后台绘制就是你接收到数据后,先把图像绘制到一个后台缓冲区里,然后再把它贴到显示区域里,就视频播放一样,通过帧率来控制。
离线wangmingxiao

只看该作者 12楼 发表于: 2015-07-29
回 彩阳 的帖子
彩阳:OpenGL 绘制好了。 (2015-07-29 13:03) 

我把qgraphicsview的viewport设置为QGLWidget之后基本上就刷不动了,不知道怎么回事?是不是直接用opengl函数来绘会增加效率很多?
能不能简单点
离线wangmingxiao

只看该作者 11楼 发表于: 2015-07-29
回 firebolt 的帖子
firebolt://这是40000 chip里QGraphicsView的设置。
view->setCacheMode(QGraphicsView::CacheBackground);
view->setOptimizationFlags(QGraphicsView::DontSavePainterState);
view->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
....... (2015-07-29 14:04) 

这个例子我研究过,大概也是采用这种分割的方法,但是item只能为矩形,你有什么办法设置为扇形?个人感觉例子中虽然缩放没问题,不会卡,那是因为刷新率比较低,如果一直在刷新就可能又问题吧?
还有就是你说的后台绘制是个怎么绘制的方法,不太懂。。。。。
能不能简单点
离线wangmingxiao

只看该作者 10楼 发表于: 2015-07-29
回 uidab 的帖子
uidab:最近正在谈一个项目也是画雷达。可以向你学习一下 (2015-07-29 12:49) 

版主有没有什么好的绘图方法,我也还在摸索中,感觉单独用qt有点恼火呀
能不能简单点
离线firebolt

只看该作者 9楼 发表于: 2015-07-29
//这是40000 chip里QGraphicsView的设置。
view->setCacheMode(QGraphicsView::CacheBackground);
view->setOptimizationFlags(QGraphicsView::DontSavePainterState);
view->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);

你这个项目对图像分辨率和实时性有要求吗?可以考虑通过设置采样率降低图像分辨率,将图像分割为几个扇区进行后台绘制,然后在贴到scene中进行显示。
离线彩阳

只看该作者 8楼 发表于: 2015-07-29
OpenGL 绘制好了。
上海Qt开发联盟,热忱地欢迎你的加入!
离线uidab

只看该作者 7楼 发表于: 2015-07-29
最近正在谈一个项目也是画雷达。可以向你学习一下
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线wangmingxiao

只看该作者 6楼 发表于: 2015-07-29
回 daily 的帖子
daily:openGL +shader. 使用drawbackground 函数中绘制。1000W个点不会有啥压力。
 (2015-07-29 11:15) 

大神有没有一些教程之类的,没有接触过,我画的点最大不超过100w个。。。
能不能简单点
离线wangmingxiao

只看该作者 5楼 发表于: 2015-07-29
回 yanwuyue 的帖子
yanwuyue:你看Rect这个单词就知道肯定只能是矩形了,
你看你能不能把不变的部分先保存起来,设置成全局变量,每次再这个基础上绘制,
另外可以考虑合并一些绘制,你想显示器帧率就这么大,多了它也刷不出来 (2015-07-29 11:12) 

起始刷新率没那么快,一般是一秒钟20次左右(自己控制的),自动的刷新就不知道了。。。。
在paintevent中不是每次都是全部刷新么,保存了也还是刷掉了,主要刷新的区域是扇形,要是矩形就好了。。。。。如果在一个线程中在QImage上不断绘图(想再Qpixmap上,因为对屏幕显示做了优化,但是在其他线程中Qpixmap无法绘制),然后在paintevent中再不断绘Qimage,你觉得可行么?还有就是再Qimage上绘制擦出一个扇形区域有没有什么办法?
能不能简单点
离线daily

只看该作者 4楼 发表于: 2015-07-29
openGL +shader. 使用drawbackground 函数中绘制。1000W个点不会有啥压力。
离线yanwuyue

只看该作者 3楼 发表于: 2015-07-29
回 wangmingxiao 的帖子
wangmingxiao:不知道js和qml的刷新效率怎么样,主要也不会。。。。有没有其他办法?[表情] (2015-07-29 11:00) 

你看Rect这个单词就知道肯定只能是矩形了,
你看你能不能把不变的部分先保存起来,设置成全局变量,每次再这个基础上绘制,
另外可以考虑合并一些绘制,你想显示器帧率就这么大,多了它也刷不出来
离线wangmingxiao

只看该作者 2楼 发表于: 2015-07-29
回 yanwuyue 的帖子
yanwuyue:用QWebView开一个html,用js绘制,或者直接用qml怎么样?[表情] 我用QWT也碰到类似问题,当时刷新勉强够 (2015-07-29 10:46) 

不知道js和qml的刷新效率怎么样,主要也不会。。。。有没有其他办法?
能不能简单点
离线yanwuyue

只看该作者 1楼 发表于: 2015-07-29
用QWebView开一个html,用js绘制,或者直接用qml怎么样? 我用QWT也碰到类似问题,当时刷新勉强够
快速回复
限100 字节
 
上一个 下一个