硬汉嵌入式论坛

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

[emWin] 我这个界面切换闪烁问题,采用什么方法解决?

[复制链接]

39

主题

929

回帖

1051

积分

至尊会员

积分
1051
发表于 2017-8-24 14:18:29 | 显示全部楼层 |阅读模式




上面视频显示,界面切换时会有闪烁现象。该采用三缓存解决,还是存储设备解决?
回复

使用道具 举报

39

主题

929

回帖

1051

积分

至尊会员

积分
1051
 楼主| 发表于 2017-8-24 14:22:21 | 显示全部楼层
没有自动在这里显示,只有链接,是不是视频必须的800*480?还是什么原因?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107641
QQ
发表于 2017-8-24 14:23:14 | 显示全部楼层
你现在是怎么绘制的,是不是将图片绘制到存储设备里面,然后调用存储设备的API函数绘制,是的话,没问题的,推荐三缓冲。F429上面,三缓冲要比存储设备的性能强。

ps:已经将你的视频编辑上了。
回复

使用道具 举报

39

主题

929

回帖

1051

积分

至尊会员

积分
1051
 楼主| 发表于 2017-8-24 14:38:28 | 显示全部楼层

回 eric2013 的帖子

eric2013:你现在是怎么绘制的,是不是将图片绘制到存储设备里面,然后调用存储设备的API函数绘制,是的话,没问题的,推荐三缓冲。F429上面,三缓冲要比存储设备的性能强。

ps:已经将你的视频编辑上了。
 (2017-08-24 14:23) 
感谢老大。我现在是直接绘制的,开了三缓存,没用存储设备。不知道是我的三缓存开启失败,还是需要存储设备配合使用。
回复

使用道具 举报

39

主题

929

回帖

1051

积分

至尊会员

积分
1051
 楼主| 发表于 2017-8-24 14:40:46 | 显示全部楼层

回 eric2013 的帖子

eric2013:你现在是怎么绘制的,是不是将图片绘制到存储设备里面,然后调用存储设备的API函数绘制,是的话,没问题的,推荐三缓冲。F429上面,三缓冲要比存储设备的性能强。

ps:已经将你的视频编辑上了。
 (2017-08-24 14:23) 
我是在WM_PAINT里面直接绘制的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107641
QQ
发表于 2017-8-24 16:35:42 | 显示全部楼层
以我们的V6综合Demo为例。

1. 先正确开启三缓冲,有没有开启的一个验证办法是创建一个对话框,然后任意拖动它,注意边界的变化,如果能够看到边界缓慢的绘制过程,说明没有开启,另外可以跟开启窗口使用存储设备做对比,三缓冲的效果很明显的。

2. 将图片绘制到存储设备里面:
QQ截图20170824163414.png


3. 直接调用存储设备的API函数显示即可
GUI_MEMDEV_WriteAt(hMempic, 0, 0);

你试试你那里,是不是好用些。
回复

使用道具 举报

39

主题

929

回帖

1051

积分

至尊会员

积分
1051
 楼主| 发表于 2017-8-24 16:56:41 | 显示全部楼层

回 eric2013 的帖子

eric2013:以我们的V6综合Demo为例。

1. 先正确开启三缓冲,有没有开启的一个验证办法是创建一个对话框,然后任意拖动它,注意边界的变化,如果能够看到边界缓慢的绘制过程,说明没有开启,另外可以跟开启窗口使用存储设备做对比,三缓冲的效果很明显的。

2. 将图片绘制到存储设备里面: .. (2017-08-24 16:35) 
非常感谢头儿,我试一下。
回复

使用道具 举报

4

主题

19

回帖

74

积分

初级会员

积分
74
发表于 2017-8-24 17:28:36 | 显示全部楼层

回 eric2013 的帖子

eric2013:以我们的V6综合Demo为例。

1. 先正确开启三缓冲,有没有开启的一个验证办法是创建一个对话框,然后任意拖动它,注意边界的变化,如果能够看到边界缓慢的绘制过程,说明没有开启,另外可以跟开启窗口使用存储设备做对比,三缓冲的效果很明显的。

2. 将图片绘制到存储设备里面: .. (2017-08-24 16:35)
借问一下,为什么我用这种存储设备的方法, 背景图片闪一下就没了?
如果不用存储设备,直接绘制的画,可以。
还一个问题是,用回调函数在绘制GUI_DrawBitmap(&bmday_bkbmp,0,0);图片后,再用GUI_AA_DrawArc绘制圆弧就会进入硬件错误,卡死在那里。  
不用回调函数就直接绘制又没有问题,这是什么原因呢
回复

使用道具 举报

39

主题

929

回帖

1051

积分

至尊会员

积分
1051
 楼主| 发表于 2017-8-24 18:12:11 | 显示全部楼层

回 eric2013 的帖子

弄错了,删除
回复

使用道具 举报

39

主题

929

回帖

1051

积分

至尊会员

积分
1051
 楼主| 发表于 2017-8-25 11:48:56 | 显示全部楼层

回 eric2013 的帖子

eric2013:以我们的V6综合Demo为例。

1. 先正确开启三缓冲,有没有开启的一个验证办法是创建一个对话框,然后任意拖动它,注意边界的变化,如果能够看到边界缓慢的绘制过程,说明没有开启,另外可以跟开启窗口使用存储设备做对比,三缓冲的效果很明显的。

2. 将图片绘制到存储设备里面: .. (2017-08-24 16:35) 
貌似解决了,里面有个宏定义是#define DISPLAY_DRIVER GUIDRV_EMWIN,我改为#define DISPLAY_DRIVER &GUIDRV_Lin_16_API后,基本上看不到那个闪烁效果了。

多谢老大
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107641
QQ
发表于 2017-8-25 12:11:23 | 显示全部楼层

回 morgen1 的帖子

morgen1:借问一下,为什么我用这种存储设备的方法, 背景图片闪一下就没了?
如果不用存储设备,直接绘制的画,可以。
还一个问题是,用回调函数在绘制GUI_DrawBitmap(&bmday_bkbmp,0,0);图片后,再用GUI_AA_DrawArc绘制圆弧就会进入硬件错误,卡死在那里。  
不用回调函 .. (2017-08-24 17:28) 
1. 估计是你的工程模板有问题,另外使用存储设备,emWin的动态内存一定要大。
2. 使用函数GUI_AA_DrawArc,如果是M4版本的STemWin库,做了浮点优化了。你的工程是不是用RTOS了,比如uCOS等。
回复

使用道具 举报

4

主题

19

回帖

74

积分

初级会员

积分
74
发表于 2017-8-25 16:54:22 | 显示全部楼层

回 eric2013 的帖子

eric2013:1. 估计是你的工程模板有问题,另外使用存储设备,emWin的动态内存一定要大。
2. 使用函数GUI_AA_DrawArc,如果是M4版本的STemWin库,做了浮点优化了。你的工程是不是用RTOS了,比如uCOS等。 (2017-08-25 12:11) 
1.我用的是官方的emwin移植过来的, 闪一下就没的问题, 是三缓冲的问题.
后面我移植你 例程 的emwin,但是一运行就死机,还在找原因中.
2.是用了ucos, 以前确实碰到 浮点运算就死机的情况.请问如何解决?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107641
QQ
发表于 2017-8-26 03:06:28 | 显示全部楼层

回 morgen1 的帖子

morgen1:1.我用的是官方的emwin移植过来的, 闪一下就没的问题, 是三缓冲的问题.
后面我移植你 例程 的emwin,但是一运行就死机,还在找原因中.
2.是用了ucos, 以前确实碰到 浮点运算就死机的情况.请问如何解决? (2017-08-25 16:54) 
现在可以先用F1系列里面的STemWin库做测试。那个没有用浮点做优化。

测试没问题了,再解决浮点问题,可以移植我们V5的uCOS,浮点处理了。
回复

使用道具 举报

4

主题

19

回帖

74

积分

初级会员

积分
74
发表于 2017-8-26 17:22:26 | 显示全部楼层

回 eric2013 的帖子

eric2013:现在可以先用F1系列里面的STemWin库做测试。那个没有用浮点做优化。

测试没问题了,再解决浮点问题,可以移植我们V5的uCOS,浮点处理了。 (2017-08-26 03:06) 
我移植了,存储设备不能用,大概会是什么原因呢,就是使用了存储设备,    往存储设备写入图片文字等,  然后一点显示都没有.  不用存储设备 都能正常显示.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107641
QQ
发表于 2017-8-28 02:24:05 | 显示全部楼层

回 morgen1 的帖子

morgen1:我移植了,存储设备不能用,大概会是什么原因呢,就是使用了存储设备,    往存储设备写入图片文字等,  然后一点显示都没有.  不用存储设备 都能正常显示. (2017-08-26 17:22) 
你现在GUIConf.c文件中的emWin动态内存设置的多大,如果够用的话,还有这种问题,极有可能是你的工程模板有问题。
回复

使用道具 举报

4

主题

19

回帖

74

积分

初级会员

积分
74
发表于 2017-8-31 14:57:55 | 显示全部楼层

回 eric2013 的帖子

eric2013:

你现在GUIConf.c文件中的emWin动态内存设置的多大,如果够用的话,还有这种问题,极有可能是你的工程模板有问题。
移植问题解决了.画弧线也不死机了...但是会闪烁,我是做了个定时去画弧线,然后弧线一直闪,这是为什么 呢,  已经开启了三缓冲
  1. static void _cbBkWindow(WM_MESSAGE* pMsg)
  2. {
  3.     GUI_RECT Rect={0, 100, 480, 180};
  4.     WM_HWIN hWin = pMsg->hWin;
  5.    
  6.     switch(pMsg->MsgId)
  7.     {
  8.         case WM_PAINT:
  9.             GUI_MEMDEV_WriteAt(hMempic,0,0);
  10.             break;
  11.         case WM_TIMER:
  12.             WM_InvalidateRect(hWin, &Rect);
  13.             GUI_AA_EnableHiRes();
  14.             GUI_AA_SetFactor(1);//(AA_FACTOR);
  15.             GUI_SetPenShape(GUI_PS_ROUND);
  16.             GUI_SetColor(GUI_RED);
  17.             GUI_SetPenSize(5);
  18.             GUI_AA_DrawArc(80,160,50,50,0,180);
  19.             GUI_AA_DisableHiRes();
  20.             WM_RestartTimer(pMsg->Data.v, 100);
  21.             break;
  22.         default:
  23.             WM_DefaultProc(pMsg);
  24.     }
  25. }
复制代码

122.jpg 还有这样的弧线怎么画呢,画两个不同的半径的去叠加吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107641
QQ
发表于 2017-9-1 00:59:44 | 显示全部楼层

回 morgen1 的帖子

morgen1:移植问题解决了.画弧线也不死机了...但是会闪烁,我是做了个定时去画弧线,然后弧线一直闪,这是为什么 呢,  已经开启了三缓冲static void _cbBkWindow(WM_MESSAGE* pMsg)
{
    GUI_RECT Rect={0, 100, 480, 180};
    WM_HWIN  .. (2017-08-31 14:57) 
1、降低下你的LTDC输出时钟,然后试试还闪烁不,另外就是重新下载程序后,关闭1分钟板子,然后重新上电看看。

2. WM_TIMER消息里面不可以直接做2D绘制,你得放在WM_PAINT消息里面做。

3. 调用两次函数 GUI_DrawPie绘制两个扇形
回复

使用道具 举报

4

主题

19

回帖

74

积分

初级会员

积分
74
发表于 2017-9-1 08:17:05 | 显示全部楼层

回 eric2013 的帖子

eric2013:

1、降低下你的LTDC输出时钟,然后试试还闪烁不,另外就是重新下载程序后,关闭1分钟板子,然后重新上电看看。

2. WM_TIMER消息里面不可以直接做2D绘制,你得放在WM_PAINT消息里面做。

.......
我是参考了你综合demo更新时间 的方法.       然后我去WM_TIMER 写数字GUI_DispString("0123456"),也会一下就闪没了.而例程的更新时间就不会闪呢?
  1. case WM_TIMER:
  2.             WM_InvalidateRect(hWin, &rRTC);
  3.             Clock_Update(pMsg);
  4.             WM_RestartTimer(pMsg->Data.v, 1000);
  5.             break;
复制代码
还有三缓冲是不是使能了就好,其他什么都不用做?   不过我看到日历里的        
case WM_PRE_PAINT:
    GUI_MULTIBUF_Begin();
是干嘛用的?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107641
QQ
发表于 2017-9-2 02:11:25 | 显示全部楼层

回 morgen1 的帖子

morgen1:我是参考了你综合demo更新时间 的方法.       然后我去WM_TIMER 写数字GUI_DispString("0123456"),也会一下就闪没了.而例程的更新时间就不会闪呢?case WM_TIMER:
           & .. (2017-09-01 08:17) 
1.确认一个问题,先正确开启三缓冲,有没有开启的一个验证办法是创建一个对话框,然后任意拖动它,注意边界的变化,如果能够看到边界缓慢的绘制过程,说明没有开启,另外可以跟开启窗口使用存储设备做对比,三缓冲的效果很明显的。

2. 三缓冲是整体更新,这个是针对专门的一个区域做一个缓冲更新,耗时短。
回复

使用道具 举报

4

主题

19

回帖

74

积分

初级会员

积分
74
发表于 2017-9-2 14:56:34 | 显示全部楼层

回 eric2013 的帖子

eric2013:1.确认一个问题,先正确开启三缓冲,有没有开启的一个验证办法是创建一个对话框,然后任意拖动它,注意边界的变化,如果能够看到边界缓慢的绘制过程,说明没有开启,另外可以跟开启窗口使用存储设备做对比,三缓冲的效果很明显的。

2. 三缓冲是整体更新,这个是针对专门的一个区 .. (2017-09-02 02:11)
移动对话框试了,三缓冲开启了确实对比明显.

闪一下的原因我找到了,就是被背景重绘了. 因为WM_TIMER 里写数字  就直接操作的是背景.
对话框里更新数字没问题.

但是对话框\\框架\\窗体好像都不能设置图片做为背景.   
TXET 这些小工具好像不创建 对话框或者窗体或者框架  ,单独是用不了的.

那我是不是只能把更新数字的内容 放在WM_PAINT里去?

另外请问下 过渡动画 只有淡入淡出吗? 有其他效果吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107641
QQ
发表于 2017-9-3 12:23:30 | 显示全部楼层

回 morgen1 的帖子

morgen1:移动对话框试了,三缓冲开启了确实对比明显.

闪一下的原因我找到了,就是被背景重绘了. 因为WM_TIMER 里写数字  就直接操作的是背景.
对话框里更新数字没问题.
....... (2017-09-02 14:56) 
1.  对话框\\框架\\窗体可以设置图片做为背景。
2.  如果的基本的文本显示函数,比如GUI_DispString之类的,最好放在WEM_PAINT消息里面。
而使用Text文本控件就无需此要求了。

3. 手机方式的左右切换:http://www.armbbs.cn/forum.php?mod=viewthread&tid=1866
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-9 07:47 , Processed in 0.310022 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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