硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2407|回复: 6
收起左侧

[emWin] 请问如何将GUI_DrawGraph叠加到GRAPH控件上

[复制链接]

9

主题

46

回帖

73

积分

初级会员

积分
73
发表于 2017-4-18 16:18:02 | 显示全部楼层 |阅读模式
大家好,小弟最近学习GRAPH控件,目前面临一个问题。

如果用 GRAPH YT 或XY 模式刷波形(600个点),经计算,也就5帧/秒,实在太慢。

如果直接使用GUI_DrawGraph 进行刷600点,经计算能有将近100帧/秒。

现在我想 通过加载对话框,初始化GRAPH控件(显示出栅格),不使用YT/XY模式,直接用GUI_DrawGraph 在 GRAPH界面上进行绘图。

可是目前发现,GUI_DrawGraph的绘图被 GRAPH空间所遮盖。请问怎么解决?

另外,每执行一次GUI_DrawGraph 后, 在下一次GUI_DrawGraph 执行之前,需要对 GUI_DrawGraph所绘制图形进行删除,要不然多个GUI_DrawGraph 都叠加一起了,请问怎么清除波形呢? 如果用CLEARRECT的话是 清除一个面,而不是线。
回复

使用道具 举报

356

主题

2180

回帖

3253

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3253
发表于 2017-4-18 17:34:04 | 显示全部楼层
控件Graph有个函数,GRAPH_SetUserDraw()
这个里面有个case GRAPH_DRAW_LAST

在这个里面调用GUI_DrawGraph()就可以在控件的表面画图。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2017-4-19 10:40:22 | 显示全部楼层
采用这种方法可以加快GRAPH绘制
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=24997
回复

使用道具 举报

9

主题

46

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2017-4-20 10:40:15 | 显示全部楼层

回 eric2013 的帖子


我就是用这种方法测试的,一次性add 600个像素点,然后更新,但是还是5帧每秒
回复

使用道具 举报

9

主题

46

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2017-4-20 10:40:37 | 显示全部楼层

回 caicaptain2 的帖子

caicaptain2:控件Graph有个函数,GRAPH_SetUserDraw()
这个里面有个case GRAPH_DRAW_LAST

在这个里面调用GUI_DrawGraph()就可以在控件的表面画图。
 (2017-04-18 17:34) 
你好,我用你的方法,是这么设计的,
回复

使用道具 举报

9

主题

46

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2017-4-20 10:45:20 | 显示全部楼层

回 caicaptain2 的帖子

caicaptain2:控件Graph有个函数,GRAPH_SetUserDraw()
这个里面有个case GRAPH_DRAW_LAST

在这个里面调用GUI_DrawGraph()就可以在控件的表面画图。
 (2017-04-18 17:34) 
主函数中,这个线程就是不停的调用ADDVALUES 子函数
    while(1)
    {
        GUI_Delay(10);
        _AddValues();
        GUI_Exec();
    }

子函数中 frame_cnt代表刷新帧频(也就是调用ADDVALUES的次数),然后随便添加一个点,以便触发回调函数GRAPH_SetUserDraw()
void _AddValues(void){
    frame_cnt++;
    GRAPH_DATA_YT_AddValue(_ahData[0], 0);
}

最后在回调函数中,使用DrawGraph 进行 600个点的绘制
static void _UserDraw(WM_HWIN hWin, int Stage) {
  if (Stage == GRAPH_DRAW_LAST) {
    for(i=0;i<GUI_COUNTOF(aY);i++)   
    {
            aY = frame_cnt%400;
    }   
    GUI_DrawGraph(aY,GUI_COUNTOF(aY),50,0);
        
  }


经测试,这种方法可以将刷新率提高到10帧/秒,比直接循环调用 YT_AddValue  600次后更新 要快一倍。但是还是有点不太够。。。如果能有20帧/秒刷新就可以了。

我也试过减少点数,比如300点,但是发现帧率还是10帧/秒,所以不知道哪里还能提高了。
回复

使用道具 举报

356

主题

2180

回帖

3253

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3253
发表于 2017-4-20 13:22:26 | 显示全部楼层

回 orta1986 的帖子

orta1986:主函数中,这个线程就是不停的调用ADDVALUES 子函数
    while(1)
    {
        GUI_Delay(10);
....... (2017-04-20 10:45)
5帧,10帧,20帧实际上的显示效果差不多的。眼睛都看不出来吧?
这个性能提高不容易。

你可以把GUI_Delay(10)改为GUI_Delay(5) 看看。而且GUI_Exec()应该可以删除。因为已经被GUI_Delay()包含了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-19 10:26 , Processed in 0.041889 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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