硬汉嵌入式论坛

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

[emWin] Emwin GUI_FillRect() 詢問

[复制链接]

34

主题

112

回帖

214

积分

高级会员

积分
214
发表于 2018-11-24 15:13:26 | 显示全部楼层 |阅读模式
各位好:

目前使用 GUI_FillRect() 函數 顯示 160*120 個不同顏色的正方形
螢幕刷新的速度當然希望越快越好!

目前嘗試兩種方式,都利用        WM_SetCallback(WM_HBKWIN, &_cbBkWindow); 方式,以下說明使用方式

第一種方式:   此方式是我目前使用的
case WM_PAINT:
    for(y=0;y<160;y++)
           for(x=0;x<120;x++)
   {
       GUI_SetColor(TermoClr(rand(),0,255));       
       GUI_FillRect(x*3,y*3,x*3+3,y*3+3);
   }       


break;
case WM_TIMER:
        WM_InvalidateArea(&ThermalImage);        // 利用 "無效 160*120 個正方形區域" 來重繪此區域  
        WM_RestartTimer(pMsg->Data.v, 100);
break;

第二種方式:   此方式會有些許的海波浪,因為螢幕是從上而下刷新的,且沒有進儲存設備內整理完再顯示,所以海波浪很正常
case WM_TIMER:
    for(y=0;y<160;y++)
           for(x=0;x<120;x++)
   {
       GUI_SetColor(TermoClr(rand(),0,255));
       GUI_FillRect(x*3,y*3,x*3+3,y*3+3);
   }
WM_RestartTimer(pMsg->Data.v, 100);       

break;


以上兩種方式都使用 WM_RestartTimer(pMsg->Data.v, 100);  /100ms來刷新,但很明顯速度沒有到100ms ....
想應該是我使用的方式效率太低,所以請問各位是否能告知更有效率、更好的顯示方式,尤其在利用 GUI_FillRect 函數 大量顯示圖形時

謝謝


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115777
QQ
发表于 2018-11-25 02:55:30 | 显示全部楼层
速度没有到100ms是什么意思,绘制一次远远超过了100ms?
回复

使用道具 举报

34

主题

112

回帖

214

积分

高级会员

积分
214
 楼主| 发表于 2018-11-25 13:21:29 | 显示全部楼层
對的,繪製一次遠遠超過100ms , 感覺像是300ms~500ms  沒有很順的感覺

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115777
QQ
发表于 2018-11-26 09:51:07 | 显示全部楼层
查一下DMA2D底层有没有被调用到。
回复

使用道具 举报

34

主题

112

回帖

214

积分

高级会员

积分
214
 楼主| 发表于 2018-11-26 11:18:17 | 显示全部楼层
本帖最后由 fcdxsdxsza 于 2018-11-26 14:05 编辑

版主:
這是以 V6-550_STemWin实验_窗口管理器之定时器使用(RTOS).rar  為基底修改的只需更改MainTask.c  即可
MainTask.c (7.38 KB, 下载次数: 7)

您可以燒入程式看看,以100ms來跑的話, 1秒應該要閃動10次

很明顯,看起來沒有1秒閃動10次,1秒只大約閃動2次 (用肉眼看的情況)


謝謝



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115777
QQ
发表于 2018-11-26 15:15:38 | 显示全部楼层
的确是太卡了,你的这个实现想办法优化优化,点太小了,无法发挥DMA2D的优势。
for(y=0;y<160;y++)
           for(x=0;x<120;x++)
   {
       GUI_SetColor(TermoClr(rand(),0,255));
       GUI_FillRect(x*3,y*3,x*3+3,y*3+3);
   }
回复

使用道具 举报

34

主题

112

回帖

214

积分

高级会员

积分
214
 楼主| 发表于 2018-11-26 16:13:55 | 显示全部楼层
很難過的是,熱影像照相機的數據就是利用不同顏色的正方形來代表冷熱程度的...

看來只能這麼卡了.....
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115777
QQ
发表于 2018-11-26 16:22:26 | 显示全部楼层
得优化下啊,你当前的实现方案,我的电脑测试都卡的嗷嗷的,而且有撕裂感


QQ截图20181126162151.jpg


回复

使用道具 举报

34

主题

112

回帖

214

积分

高级会员

积分
214
 楼主| 发表于 2018-11-26 16:33:22 | 显示全部楼层
還真不知道怎麼優化...
因為讀到的值其實都是類似0x1234 ->分為代表不同的RGB而已

而目前就把0x1234轉成RGB

uint32_t RGB565(uint8_t R,uint8_t G,uint8_t B) {
        return R | (G << 8) | (B << 16);
}

uint32_t TermoClr(uint16_t Val,uint16_t MinVal, uint16_t MaxVal){ // 我們對調色板執行轉碼
        uint16_t value;
        uint16_t delta=MaxVal-MinVal;
        if (delta==0) delta=1;
        value = (Val - MinVal) * 255.0 / delta;       
        return RGB565(colormap_rainbow[3*value], colormap_rainbow[3*value+1], colormap_rainbow[3*value+2]);
}                                                 //         colormap_rainbow總共3總顏色=>每個顏色有255/3個
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-17 11:58 , Processed in 0.455528 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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