Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
rtgui api函数关于形参的一点修改建议
发布于 2011-07-23 12:06:07 浏览:4159
订阅该版
在rtgui中很多api函数的形参使用的是结构体指针,这种方式使用的很频繁. 函数中的形参使用结构体指针,避免不了要在引用前先创建这些临时结构体变量,并为这些变量赋值,这些地方改进一下会大大提高函数的易用性.而且在很多GUI的api中已经形成一种默认标准.我认为rtgui有必要对这个问题作个讨论. 而且我实际测试了一下,在形参个数较多时,使不使用结构体指针并不会给性能带来提升,都会采用堆栈传递参数.但是使用结构体指针作为参数的话,会导致代码尺寸增大,原因是在函数被引用前都有处理这些结构体的代码,这些增加的代码代码是可以避免的.如果将rtgui中函数使用的结构体指针全部展开,编译之后代码尺寸可以较小几K,还是比较可观的.尺寸减小的程度与用户使用这些api的频率成正比. 看看实际使用这种函数的一个例子: 这段代码可以在一个控件上绘制一个十字架,并且不破坏控件原有的数据,会用到DC缓冲区,正好符合测试的要求. static rt_int16_t bak_x=0,bak_y=0; struct rtgui_dc_buffer *dc_grp; /* 绘图层缓冲区 */ struct rtgui_dc_buffer *dc_cross; /* 会在此缓冲区绘制十字线 */ #define USER_GRP_W 320 #define USER_GRP_H 240 /* 函数功能:初始化用户使用到的DC缓冲区 */ void user_dc_buffer_init(void) { dc_grp = rtgui_dc_buffer_create(USER_GRP_W, USER_GRP_H); if(dc_grp == RT_NULL) return; dc_cross = rtgui_dc_buffer_create(20,20); /* 创建cross缓冲 */ if(dc_cross == RT_NULL) return; } void user_draw_cross(rtgui_dc_t *dc) { int w,h; rtgui_rect_t rect; rtgui_dc_get_rect(dc, &rect); w = rtgui_rect_width(rect); h = rtgui_rect_height(rect); RTGUI_DC_FC(dc) = blue; rtgui_dc_draw_hline(dc, 0, w, h/2-1); rtgui_dc_draw_vline(dc, w/2-1, 0, h); } /* 函数功能:在用户指定的控件上绘制一个十字线 */ void user_draw_cross_flag(PVOID wdt, int x, int y) { rtgui_dc_t *dc; rtgui_rect_t rect; rtgui_point_t point; RT_ASSERT(wdt != RT_NULL); if(dc_cross == RT_NULL || dc_grp == RT_NULL) return; dc = rtgui_dc_begin_drawing(wdt); if(dc == RT_NULL) return; rect.x1 = bak_x; rect.x2 = bak_x+20; rect.y1 = bak_y; rect.y2 = bak_y+20; point.x = bak_x; point.y = bak_y; rtgui_dc_blt(dc_grp, &point, dc, &rect); point.x = x; point.y = y; rect.x1 = 0; rect.x2 = 20; rect.y1 = 0; rect.y2 = 20; rtgui_dc_buffer_copy(dc_grp, &point, dc_cross, &rect);/* buffer copy */ user_draw_cross(dc_cross); rect.x1 = x; rect.x2 = x+20; rect.y1 = y; rect.y2 = y+20; rtgui_dc_blit(dc_cross, RT_NULL, dc, &rect); rtgui_dc_end_drawing(dc); bak_x = x; bak_y = y; } rt_bool_t dc_grp_event_handle(PVOID wdt, rtgui_event_t *event) { if(event->type == RTGUI_EVENT_PAINT) { rtgui_rect_t rect; rtgui_dc_t *dc = rtgui_dc_begin_drawing(wdt); rtgui_dc_get_rect(dc, &rect); rtgui_dc_blit(dc_grp, RT_NULL, dc, &rect); rtgui_dc_end_drawing(dc); } else return rtgui_view_event_handler(wdt, event); return RT_TRUE; } 用户可以使用user_draw_cross_flag(user_view, x, y);的方式在控件user_view上绘制一个十字架.如果看不懂这些代码,抱歉,我是在rtgui_win下编写的,移植到SVN_rtgui上也不难. 代码中红色的部分代码是完全可以优化的代码. 将 rect.x1 = bak_x; rect.x2 = bak_x+20; rect.y1 = bak_y; rect.y2 = bak_y+20; point.x = bak_x; point.y = bak_y; rtgui_dc_blt(dc_grp, &point, dc, &rect); 更改成 rtgui_dc_blt(dc_grp, bak_x, bak_y, dc, bak_x, bak_y, 20, 20); 这种方式更便于理解,也可以避免犯错,第一种方式在代码很长时,一不小心就会导致传递参数错误或者参数赋值错误. 从性能上分析,这两种情况应该接近.分析错误了请别拍我. [s:175] 第一种方式会开辟临时变量,第二种方式会在堆栈中存放参数,RAM消耗差不多吧. 从代码尺寸上分析,显然第二种更有优势,比第一种方式小64字节.如果这种优势扩展到整个rtgui,则更加可观了. 综上所述,我的观点是,改进api函数中使用结构体指针作为形参的情况,因为在实际传递实参时影响不大,但是编程不方便,代码尺寸也会变大. 希望各位多多讨论. [s:188]
查看更多
1
个回答
默认排序
按发布时间排序
撰写答案
登录
注册新账号
关注者
0
被浏览
4.2k
关于作者
amsl
这家伙很懒,什么也没写!
提问
12
回答
137
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
开源共生 商业共赢 | RT-Thread 2024开发者大会议程正式发布!
2
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
3
RT-Thread EtherKit开源以太网硬件正式发布
4
如何在master上的BSP中添加配置yml文件
5
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
20
个答案
2
次被采纳
张世争
11
个答案
2
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部