搜索
bottom↓
回复: 35

QT做的程序 三星6410板子,画图速度不满意。求解

[复制链接]

出0入0汤圆

发表于 2016-4-30 08:12:59 | 显示全部楼层 |阅读模式
本帖最后由 NJ8888 于 2016-4-30 08:18 编辑

for (dtloop=0;dtloop<700;dtloop++)
                        {
                                for (vloop=0;vloop<4;vloop++)
                                {
                                        dtt=filebuf[(dtloop<<2)+vloop];
                                        mask=0xc0;
                                        xx=dtloop+22;
                                        for (hloop=4;hloop>0;hloop--)
                                        {
                                                dt=(dtt & mask)>>((hloop-1)<<1);
                                                pos=(vloop<<2)+(4-hloop);
                                                yy=25*pos+30;
                                                mask=mask>>2;
                                                if (dtloop==0)
                                                {
                                                        if (dt==0)
                                                        {
                                                                painter.drawPoint(xx,yy+12);
                                                                laststate[pos]=0;       
                                                        }
                                                        else
                                                        {
                                                                if (dt<2)
                                                                {       
                                                                        painter.drawPoint(xx,yy);
                                                                        laststate[pos]=1;
                                                                }
                                                                else
                                                                {
                                                                        painter.drawLine(xx,yy,xx,yy+12);
                                                                        laststate[pos]=3;
                                                                }
                                                        }
                                                }
                                                else
                                                {
                                                        if (dt==0)
                                                        {
                                                                if (laststate[pos]==1)
                                                                {
                                                                        painter.drawLine(xx,yy,xx,yy+12);
                                                                }         
                                                                else
                                                                {
                                                                        painter.drawPoint(xx,yy+12);
                                                                }
                                                                laststate[pos]=0;       
                                                        }
                                                        else
                                                        {
                                                                if (dt<2)
                                                                {       
                                                                        if (laststate[pos]==0)
                                                                        {
                                                                                painter.drawLine(xx,yy,xx,yy+12);
                                                                        }         
                                                                        else
                                                                        {
                                                                                painter.drawPoint(xx,yy);
                                                                        }
                                                                        laststate[pos]=1;
                                                                }
                                                                else
                                                                {
                                                                        painter.drawLine(xx,yy,xx,yy+12);
                                                                        laststate[pos]=3;
                                                                }
                                                        }
                                                }
                                        }
                                }
                                //画总线,选D7--D0组合总线,略,执行时间消耗3.3ms
                        }
                        三张图片分别是
数据画法是一屏水平700点,16个通道,每个通道每列像素用2位,总每列32位,像素特征是bit00代表画低电平0,bit01代表画高电平点,bit1X代表画一段线,虚拟了画一屏的2800字节数据显示,消耗时间170ms,如果全画点120ms,全画线260ms,参看照片中下部黄色数字,单位us。现在感觉这个时间过长,求解如何缩短提高绘图效率

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2016-4-30 08:16:13 | 显示全部楼层
本帖最后由 NJ8888 于 2016-4-30 08:17 编辑

画法是按字节取数对应画四通道D15-D12第一像素列,再去下一字节换低四通道D11-D8。。。。。,四次一轮16通道完成,重复各通道第二像素列直到700像素列完成

出0入0汤圆

发表于 2016-4-30 08:38:54 | 显示全部楼层
6410跑Qt本身就费劲吧

出0入0汤圆

 楼主| 发表于 2016-4-30 08:53:39 | 显示全部楼层
d314361768 发表于 2016-4-30 08:38
6410跑Qt本身就费劲吧

我自己买的国产三汇示波器,用三星2440,我的6410全画线显示可以看出屏的像素覆盖达到2/3,我看当把示波器波形覆盖2/3时(高频脉冲信号降低时基同时提高垂直灵敏度使波形变大使波形成为亮带)目测0.25秒更新一次。这说明人家画图还是蛮快的

出0入12汤圆

发表于 2016-4-30 09:06:18 | 显示全部楼层
双 buffer 了吗?

出0入0汤圆

 楼主| 发表于 2016-4-30 09:11:39 | 显示全部楼层
本帖最后由 NJ8888 于 2016-4-30 09:12 编辑


我查资料双缓冲是减少闪烁,你确定能提高画图速度?写内存再拷出来真的会比直接写快吗?其实直接写也是写内存的然后ARM显示驱动去取数据,你确定用过双缓冲能提升?至少我没搜索到这方面说明,只看到减少闪烁作用

出0入12汤圆

发表于 2016-4-30 09:14:53 | 显示全部楼层
NJ8888 发表于 2016-4-30 09:11
我查资料双缓冲是减少闪烁,你确定能提高画图速度?写内存再拷出来真的会比直接写快吗?其实直接写也是写 ...

每次调用都要去更新屏幕内容,重画一部分,即使上层做了局部重画也要调用系统调用之类吧。批量传输的效率总是高一些。

出0入0汤圆

 楼主| 发表于 2016-4-30 09:25:47 | 显示全部楼层
abutter 发表于 2016-4-30 09:14
每次调用都要去更新屏幕内容,重画一部分,即使上层做了局部重画也要调用系统调用之类吧。批量传输的效率 ...

我这个显示,动态时肯定全局重画不可能局部更新的,因为采集数据一直会变

出100入101汤圆

发表于 2016-4-30 10:21:50 来自手机 | 显示全部楼层
示波器可能不是用的QT

出0入0汤圆

发表于 2016-4-30 10:27:30 | 显示全部楼层
s3c6410有2d加速,用上了吗

出0入0汤圆

发表于 2016-4-30 11:00:26 | 显示全部楼层
貌似这些 GUI 的底层驱动是可以对于大多带有 Controller 的 LCD 绘图速度加以优化。

出0入12汤圆

发表于 2016-4-30 12:08:55 | 显示全部楼层
NJ8888 发表于 2016-4-30 09:25
我这个显示,动态时肯定全局重画不可能局部更新的,因为采集数据一直会变 ...

所以试试双 buffer 或者 qwt 看看。

出0入0汤圆

发表于 2016-4-30 13:15:51 | 显示全部楼层
NJ8888 发表于 2016-4-30 08:53
我自己买的国产三汇示波器,用三星2440,我的6410全画线显示可以看出屏的像素覆盖达到2/3,我看当把示波 ...

你2440示波器用的不是Qt吧?  之前用6410在wince下跑Qt,测试后果断放弃,换的A8

出0入0汤圆

 楼主| 发表于 2016-4-30 15:55:38 | 显示全部楼层
下午用path办法画线,速度竟然令人吃惊的慢了10倍,原来160ms的现在要1.6秒 。用path.moveTo  path.lineTo  painter.drawPath(path)实现的

出0入0汤圆

 楼主| 发表于 2016-5-1 10:14:14 | 显示全部楼层
喜讯:大突破,今天用直接写显示缓存mmap的地址,对波形显示区域的700*436空间,逐点填空(就是全覆盖,写显存没有画线办法只能按地址单点赋值),消耗时间31ms。

哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈

上面研究结果相信有坛友感兴趣


五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   五一劳动真快乐   


休息去了,拜拜

出0入0汤圆

 楼主| 发表于 2016-5-1 10:19:23 | 显示全部楼层
下面研究下原来波形地址与显示缓存地址的对应关系,用于画波形

出0入0汤圆

 楼主| 发表于 2016-5-2 06:53:05 | 显示全部楼层
现在状况  qt下做那显示波形程序,qt自己画点画线效率比较低,就改用mmap操作显存碰到其他问题,它画的快但是画完如果就结束函数qt会自动调用重绘把图形擦光,如果画完写个while的死等或是循环写显存就不会被擦,但此时不能响应鼠标按键等操作,如果上述循环或死等中插入QCoreApplication::processEvents来响应鼠标操作,又会被自动重绘导致图形闪烁一次。有何办法处理禁止重绘其中波形部分,这样图形不被擦又能响应鼠标

出0入0汤圆

 楼主| 发表于 2016-5-2 08:26:41 | 显示全部楼层
新的想法是先处理整屏数据再画,水平线和矩形块代替原来单次数据点 竖短线的绘制方式

出0入12汤圆

发表于 2016-5-2 12:40:52 | 显示全部楼层
建议先用 Qwt 的库看看,毕竟省事,性能还不错。

出0入0汤圆

 楼主| 发表于 2016-5-3 20:11:41 | 显示全部楼层
最新试验18楼的办法,基本成功(数据处理还有点BUG)用画线代替点组合,画矩形代替线组合,,时间消耗由160ms左右画完缩短到8ms左右,数据处理额外消耗4ms,总的效率还是可观提升的,

出0入0汤圆

发表于 2016-5-3 21:12:11 | 显示全部楼层
哇,不错,我记得我之前用qt描曲线,也是由于刷一幅画面共四五千个点,四条曲线,一秒钟才刷两帧,是在是太慢了,但后来忙于其他,没有去进行改进,说不定可以尝试下你的方法可以有很大改善,我的硬件平台式adi的dsp,blackfin 609

出0入0汤圆

发表于 2016-5-4 09:04:58 | 显示全部楼层
6410 自身性能问题,换 A8 以上的 CPU 吧

出0入0汤圆

 楼主| 发表于 2016-5-4 11:33:52 | 显示全部楼层
litguy 发表于 2016-5-4 09:04
6410 自身性能问题,换 A8 以上的 CPU 吧

人家示波器还用2440那

出0入0汤圆

发表于 2016-5-5 09:04:43 | 显示全部楼层
NJ8888 发表于 2016-5-4 11:33
人家示波器还用2440那

分辨率不一样,我过去 2410 还跑过手持设备呢
讨论这个没有意义
除非 6410 其它事情不干
只弄 UI
否则 800X600 都是极限了
而且现在 A8 也很便宜
前年有个项目就是 6410 用到极限了
各种优化凑合能用
后来换了 TI 的 A8 啥都安静了
行云流水

出0入0汤圆

 楼主| 发表于 2016-5-5 11:36:22 | 显示全部楼层
本帖最后由 NJ8888 于 2016-5-5 11:38 编辑
litguy 发表于 2016-5-5 09:04
分辨率不一样,我过去 2410 还跑过手持设备呢
讨论这个没有意义
除非 6410 其它事情不干


当前测试结果,处理数据刷屏连同贴背景一次需要40ms,我计划100ms从FPGA中取一次数据,每次2800字节按32MHzSPI时钟操作,时间很宽裕的。人机界面流畅性还算好,100ms中40ms刷屏不能响应人机界面包括鼠标的移动,剩余60ms还可做蛮多的事。等同动态采集显示每100ms更新一次,应该可以接受

出0入0汤圆

 楼主| 发表于 2016-5-6 13:51:05 | 显示全部楼层
本帖最后由 NJ8888 于 2016-5-6 14:17 编辑

视频文件压缩包,我用80ms周期刷,刷一次43ms,波形是虚拟数据,加抖动,不然看不出变动   土豆视频上传审核中稍后贴链接



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2016-5-6 14:21:57 | 显示全部楼层
本帖最后由 NJ8888 于 2016-5-6 14:27 编辑

http://www.tudou.com/programs/view/Nh3HpLx_0xA/http://www.tudou.com/programs/view/Nh3HpLx_0xA/

出0入0汤圆

 楼主| 发表于 2016-5-7 22:54:38 | 显示全部楼层
继续研究有发现瓶颈写了paintEvent系统调用间隔200ms,我开了个定时器,定时40或80等在一个IO输出脉冲,确实按这个定时间隔输出脉冲,但是当加入update代码,paintevent造成定时间隔拉长到200ms,特意试过,paintevent中无论画图耗时30ms还是干脆屏蔽全部代码只是个空函数,都造成定时间隔变长到200ms,且此时鼠标响应迟钝。另外有做了个按钮,进入后是while死循环翻转io,不加update 和QCoreApplication::processEvents()时io翻转很快,但是加了这两句,200ms才翻一次,如果不加QCoreApplication::processEvents(),界面鼠标不再响应。

出0入0汤圆

 楼主| 发表于 2016-5-10 10:44:03 | 显示全部楼层
本帖最后由 NJ8888 于 2016-5-10 10:49 编辑

看来世界做QT的少,有折腾两天总算知道为何200ms才动一次,原因是我用update整屏刷,包含全部控件,后来刷局部波形部分,把所有按键编辑窗等都排除在外,刷屏周期能跟着80ms的定时器了,一秒刷12帧我觉得够了,再快大概能到20帧,因为数据要处理画图有消耗时间。前面视频有问题,实际刷的频率是4帧,240ms一次。

出0入0汤圆

 楼主| 发表于 2016-5-10 10:50:00 | 显示全部楼层
本帖最后由 NJ8888 于 2016-5-10 10:56 编辑

下面可以做FPGA采集传输部分了,当前界面做了16通道可独立开关显示独立高亮,D7--D0可组合总线显示并总体关闭D7--D0,两个光标独立移动或联动,鼠标拖动+双按键左右移动每次一个水平单位,以便弥补鼠标移动定位困难状况,7个水平位置触发控制(方便根据需要针对波形抓取触发前或触发后信息)。6410的SPI接口也完成

出0入0汤圆

发表于 2016-5-14 14:19:01 | 显示全部楼层
学习一下,这段时间在用Qt学做usb虚拟示波器的上位机,刷新一闪一闪的

出0入0汤圆

 楼主| 发表于 2016-5-14 15:34:36 | 显示全部楼层
donglaile 发表于 2016-5-14 14:19
学习一下,这段时间在用Qt学做usb虚拟示波器的上位机,刷新一闪一闪的

你是pc机?那不如用windows,随时可画图

出0入0汤圆

发表于 2016-5-15 00:36:05 | 显示全部楼层
NJ8888 发表于 2016-5-14 15:34
你是pc机?那不如用windows,随时可画图

要移植到6410啊,6410加虚拟示波器再加个电池

出0入0汤圆

 楼主| 发表于 2016-5-15 07:34:39 | 显示全部楼层
donglaile 发表于 2016-5-15 00:36
要移植到6410啊,6410加虚拟示波器再加个电池

奥,你数据采集怎么变成USB,为何用这个方式传6410

出0入0汤圆

发表于 2016-5-17 19:59:03 | 显示全部楼层
本帖最后由 donglaile 于 2016-5-17 20:27 编辑

直接买了个usb虚拟示波器。你有没有试过移植QtOpenGL进行绘图呢,6410支持是OpenGL ES的。我在网上找了一圈也没找到相应的移植资料,不过找到一个能在6410上跑的opengl库。
网址:关于s3c6410 实现opengl的分析
用到的软件包(将点zip去掉):
我交叉编译了下到6410是可以运行的,附图:


这个图片太大了,修改几次都这样。。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入4汤圆

发表于 2016-6-9 09:32:05 | 显示全部楼层
NJ8888 发表于 2016-4-30 09:25
我这个显示,动态时肯定全局重画不可能局部更新的,因为采集数据一直会变 ...

底层减小图像刷新率,不是提高,是减小
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 17:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表