Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
有关GUI
发布于 2008-09-01 17:35:19 浏览:14135
订阅该版
推荐你们把UCGUI加上去.
查看更多
19
个回答
默认排序
按发布时间排序
bernard
2008-09-01
这家伙很懒,什么也没写!
ucgui太弱了,而且有版权限制。
hqbvqv
2008-09-02
这家伙很懒,什么也没写!
嵌入式的程序是不需要这么多窗体的,我们一直用UCGUI开发,是个很不错的GUI.
bernard
2008-09-02
这家伙很懒,什么也没写!
>嵌入式的程序是不需要这么多窗体的,我们一直用UCGUI开发,是个很不错的GUI. --- RTGUI一出,众GUI黯然失色 [s:175]
shaolin
2008-09-03
这家伙很懒,什么也没写!
[s:154]
bernard
2008-09-04
这家伙很懒,什么也没写!
贴几个在clf上和别人的讨论, [s:187] ,请允许我转贴吧
bernard
2008-09-04
这家伙很懒,什么也没写!
nxin> 有没有这样的GUI:只有顶级窗口由系统集中管理,系统的消息分发也只到顶级窗口,顶级窗口的合成用硬件实现(opengl),每个顶级窗口对应一个缓冲区,可以直接写屏;子窗口由应用自己管理(创建、销毁、裁减、消息分发等),这样不同应用的窗口更新互不影响,不需要同步,而一个应用内部的窗口更新需要同步,但是在一个进程之内,即使支持多线程,也可以做得效率很高。 gogoliu> 先更正一下各位的观点: 1)从不同桌面环境的快慢程度来看,某桌面环境慢是该桌面环境设计的问题,跟X Window关系不大 2)DirectFB的多进程模式是通过内核fashion机制实现的,不是在共享库中实现的 要实现多窗口系统,各窗口之间必须能相互感知,这样就必须能得知各窗口的几何信息。因此: 1)单任务中实现多窗口系统无需通过内核或IPC让各窗口之间相互感知,程序内部实现即可,这部分实现也可抽象为一个共享库。 2)多线程中实现多窗口系统也无需通过内核或IPC让各窗口之间相互感知,因为多线程最简单快捷的通信方式是全局变量,因此同样的多线程的实现也可以抽象为一个共享库。 (minigui的单任务和多线程版本之所以能以库的形式提供,现在大家知道答案了。) 3)多进程中实现多窗口系统需要通过内核或IPC让各窗口之间相互感知,内核就像同一进程中多个线程的全局变量一样可被系统内进程访问。 4)分布式系统中实现多窗口系统需要通过socket实现。 上述4种不同的设计,后者的方法能用于前者,反之则不行;而越往后的实现手段性能越差。X Window开始设计时是属于分布式系统的一部分的,所以采用socket实现各窗口之间相互感知。而由于采用socket的兼容性最大,所以X默认并没有采用更快的IPC手段,更没有把X Server放入内核(虽然X server带有显示芯片驱动)。当然X Server没有放入内核还因为Unix系统最早并不支持图形显示设备、Unix的硬件平台太多显示子系统各不相同、Unix中的设备通常都是单进程访问的。 任何IPC必须经过进程切换和系统调用,所以对比而言确实比把窗口系统置入内核慢。如果提高X Server的优先级,则有更快的速度接收到IPC信息并处理,这是几年前linux 2.4时代使用的方法,后来因为在进程调度和切换方面做了工作,这个方法不用了。 另外,X中窗口剪切域由X Server管理,所以X Client会把窗口的绘制指令发到X Server,X Server进行剪切后再调用内部的显示驱动绘制要显示在屏幕的部分。如果X Client拥有窗口剪切域,那么它可以完成剪切域计算,可提高计算并行性,也可以减少绘制指令的发送。但会出现一个问题,如果X Server不做剪切运算的话X Client可以随意绘制,这样屏幕可能就会被Bad Client弄花。 另,X Client必须通过X Server访问显示设备也会加长访问显示设备的路径,降低性能。 如想获得高性能,把窗口管理功能和图形功能放入内核确实是最好的选择了。 上面nxin提的设计确实可行,但如果你没有如窗口半透、阴影的需求,采用窗口剪切域来实现多窗口是最好的。因为采用窗口剪切域你只需要屏幕缓存那么大的显存,而采用你的设计,那消耗的显存是相当大的,Mac OS X推出时消耗内存大跟这点不无关系。在20世纪PC的显示硬件根本无法支撑你的这种设计,(我猜测)windows也是在xp推出时才采用你这样的设计,但它没像OS X那样采用3D合成各个窗口。而且即使采用了你的这种设计,窗口剪切域依然有用。 easion> nxin讲的并没有什么特别明显的好处,因为你子窗口内也需要实现剪切域管理,只是该谁来计算的问题。 nano-x有一个非常优秀的设计:当建立用户程序创建窗口的消息传到窗口管理器程序的时候,窗口管理器(根据增加标题栏和边框)来计算他的大小,之后创建一个新的窗体,最后调用GrReparentWindow,使用户程序创建的窗口成为他的一部分(子窗口),这样当你移动标题栏的时候,消息被分发到窗口管理器;当你在这个窗体内移动鼠标的时候,消息被分发到用户程序。 我猜x window窗口管理器的实现可能也大概如此吧,这样是不是非常灵活呢? 用户程序最好不要直接写屏幕,在多进程情况下,写屏过程中互斥的设计令人痛苦。
bernard
2008-09-04
这家伙很懒,什么也没写!
gogoliu> > 因为你子窗口内也需要实现剪切域管理,只是该谁来计算的问题 既然子窗口必定属于同一个进程,那当然由各个进程自己管理就行了啦。如X这样直接支持子窗口的虽然减少client的工作,但加重了自身的复杂度,并且导致client跟server之间的通信量增加。QT4.4已经默认不采用X的子窗口了,在QT内部实现,性能得到明显提升。 > nxin讲的并没有什么特别明显的好处 1. 所有对窗口的绘图操作只需计算一次剪切运算。这是以空间换时间。 2. 要实现半透这些效果也只有让每个窗口都渲染到离屏缓存才好办。 > 用户程序最好不要直接写屏幕,在多进程情况下,写屏过程中互斥的设计令人痛苦。 除非所有窗口都渲染到离屏缓存,否则因为要共享屏幕,所以互斥是必需的。在X中不过是X Server做了这个工作。
bernard
2008-09-04
这家伙很懒,什么也没写!
RTGUI> 如果要在子窗口内实现自己的剪切域管理,那么一些事件(特别是鼠标事件是和位置直接相关的)得先传到窗口,然后再一级级派发到相应的子窗口。而如果子窗口剪切域在server端实现,那么server就可以直接定位到子窗口一级。 在RTGUI中,子窗口的剪切域是由窗口自己管理的,所以事件也得这样一级级派发。针对于鼠标事件,如果client要监控鼠标移动,这可真是一个头大的问题:所有的鼠标移动事件都经由server->window->widget这样的路线传递(widget就类似于X中的子窗口),一下子通信量就上去了。所以现在的做法是,需要监控鼠标移动事件的窗口需要在server进行登记,由server决定是否发送鼠标移动事件,这个也算是子窗口自己管理剪切域的一个补充。 从设计的角度来说,因为RTGUI提倡使用panel(一个屏幕上互不相重叠的区域,这一块块区域(panel)也可以看成是一个特殊的window),所以把剪切域管理放到了client,应该会减少不少的计算量及通信量。 RTGUI的实现是窗口剪切域完全由client管理,因为绘图也放在了client,所以它只允许在自己的可视范围内进行绘图操作。server只保留各个window的位置信息,如果window发生变化(创建,消失,移动,更改大小等),会把剪切信息(外剪切)发送给各个相应的window(按照Z序的顺序发送,只发送window上层的剪切信息)。把绘图放在client的缺点就是要实现alpha绘图比较麻烦,如果只是绘到buffer 缓冲,那占用的内存就比较大了。现在想到的办法是:client alpha->发送刷新的消息->server->通知底层覆盖的window进行更新;当底层window更新完成后,server->发送允许绘图->client alpha进行alpha绘图。只是这样时序得严格要求,否则出现了同步问题,很快就花屏。 RTGUI> >>上面nxin提的设计确实可行,但如果你没有如窗口半透、阴影的需求,采用窗口剪切域来实现多窗口是最好的。因为采用窗口剪切域你只需要屏幕缓存那么大的显存,而采用你的设计,那消耗的显存是相当大的,Mac OS X推出时消耗内存大跟这点不无关系。在20世纪PC的显示硬件根本无法支撑你的这种设计,(我猜测)windows也是在xp推出时才采用你这样的设计,但它没像OS X那样采用3D合成各个窗口。而且即使采用了你的这种设计,窗口剪切域依然有用。 采用窗口剪切域需要缓存屏幕大小的缓存?窗口自己管理剪切域后,就可以直接写屏了,不用缓存的。 RTGUI的实现中,一个window可以保留自己窗口大小的缓存,也可以直接采用直接写屏的方式。只是窗口透明这些特效,我想了半天还只是想出一个蹩脚的方法。在RTGUI中,一个panel可对应于一个主程序(workbench),然后一个workbench上可放置多个view,如果只在workbench上实现一些特效倒是容易,所以以后有打算把view通过3D特效的方式展示出来。而window的特效,有些黔驴技穷了。。。
bernard
2008-09-04
这家伙很懒,什么也没写!
gogoliu> > 这可真是一个头大的问题:所有的鼠标移动事件都经由server->window->widget这样的路线传递(widget就类似于X中的子窗口),一下子通信量就上去了。 window->widget仅仅是进程内通信,其性能损耗相对server->window来说是非常小的,因此,这么做是值得的。 > 把剪切域管理放到了client,应该会减少不少的计算量及通信量。 整体而言,把剪切域放到client会减少计算量和通信量。但因为server端为了提供暴露和覆盖事件必须保留每个窗口的剪切域,把剪切域放到client会导致系统中有2份剪切域并且更新剪切域时要计算2次(server一次,client一次)。如果server不保留各个窗口的剪切域,从窗口几何信息计算暴露或覆盖区域,那么计算量会增大。 > RTGUI的实现是窗口剪切域完全由client管理,因为绘图也放在了client,所以它只允许在自己的可视范围内进行绘图操作。 你不能假设client是永远正确的,即使在一个封闭的系统中进行了严格的测试,也会出现client因计算错误而导致的屏幕绘制出错的问题。并且出错概率跟client个数成正比。而放在server端,虽然同样会有计算错误的时候,但出错概率是个常值,而且问题定位简单。而且系统中剪切域只有一份。在开放的系统中,server管理剪切域优势更大。 > client alpha->发送刷新的消息->server->通知底层覆盖的window进行更新;当底层window更新完成后,server->发送允许绘图->client alpha进行alpha绘图。 半透混合需要得到前后窗口的像素值,你是哪个client做混合操作呢?底层的还是上层的?另一个窗口的像素数据怎么传给做混合的client? > 采用窗口剪切域需要缓存屏幕大小的缓存?窗口自己管理剪切域后,就可以直接写屏了,不用缓存的。 屏幕缓存那么大的显存是指framebuffer。
bernard
2008-09-04
这家伙很懒,什么也没写!
RTGUI> > window->widget仅仅是进程内通信,其性能损耗相对server->window来说是非常小的,因此,这么做是值得的。 也不尽然:大窗口 A,子窗口 B。实际上server是不能感知到子窗口B的存在的,如果子窗口B需要捕捉鼠标事件,它能怎么办呢?两种: 1、所有窗口A的鼠标事件都经由server传递到窗口A然后到B。 2、仅仅窗口B的鼠标事件经由server传递到窗口A然后到B。 方法1,鼠标事件的传递不是一般的多,通信量不是一般的大。 > 整体而言,把剪切域放到client会减少计算量和通信量。但因为server端为了提供暴露和覆盖事件必须保留每个窗口的剪切域,把剪切域放到 client会导致系统中有2份剪切域并且更新剪切域时要计算2次(server一次,client一次)。如果server不保留各个窗口的剪切域,从窗口几何信息计算暴露或覆盖区域,那么计算量会增大。 server端不用保留剪切域 > 你不能假设client是永远正确的,即使在一个封闭的系统中进行了严格的测试,也会出现client因计算错误而导致的屏幕绘制出错的问题。并且出错概率跟client个数成正比。而放在server端,虽然同样会有计算错误的时候,但出错概率是个常值,而且问题定位简单。而且系统中剪切域只有一份。在开放的系统中,server管理剪切域优势更大。 弱弱的先问一句,Qtopia是server端做剪切吗?Windows PPC/SP是server端做剪切吗? client不会永远都是正确的,所以有时会发现一些商用的embedded GUI系统会出现一些小的花屏错误,但问题并不象想象的那么严重。 > 半透混合需要得到前后窗口的像素值,你是哪个client做混合操作呢?底层的还是上层的?另一个窗口的像素数据怎么传给做混合的client? 窗口A,B,C,其中覆盖关系(半覆盖)是A覆盖B覆盖C,假设B要做混合。B只会去和C混合,不会和A混合(因为A是处于顶端,且非透明)。 当B要刷新时,B先通知C刷新覆盖区域,C刷新完成后,B取framebuffer数据,然后直接混合。 当C要刷新时,C刷新完成时,发生更新事件给B,B做混合。 速度慢是肯定的:-) 但如果都做缓冲,感觉代价太大了,所以这么做也蛮土鳖的
撰写答案
登录
注册新账号
关注者
0
被浏览
14.1k
关于作者
hqbvqv
这家伙很懒,什么也没写!
提问
1
回答
2
被采纳
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
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
2
RT-Thread EtherKit开源以太网硬件正式发布
3
如何在master上的BSP中添加配置yml文件
4
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
5
RT-Thread 发布 EtherKit开源以太网硬件!
热门标签
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
keil_MDK
rt_mq_消息队列_msg_queue
MicroPython
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
19
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
6
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部