2019独角兽企业重金招聘Python工程师标准>>>
1. DirectFB概述
在嵌入式GUI中需要实现多种图形功能,包括图形绘制以及图形拷贝等。其中的许多功能需要进行大量的数据传递(如图形拷贝)或者需要进行大量的数值计算(如画样条曲线)。如果这些功能都由软件来实现的话,会占用大量的CPU时间且需要传递大量的数据,从而影响了图形性能。许多显示芯片都带有图形处理器,能够从硬件上实现一部分图形功能。支持硬件加速的图形库就可以通过图形处理器来实现这些功能,从而减轻了CPU的负担,并减少了数据在总线上的传输时间,提高了图形性能。
正是基于以上的情况,出现了DirectFB图形库。
DirectFB图形库是专门为满足嵌入式设备要求而开发的小巧、强大、灵活和易于使用的图形库,并且试图成为一个构建于Linux Framebuffer Device之上的新图形标准。它在Framebuffer的基础上提供了图形加速、输入设备处理提取、透明窗口和多重显示层的功能,能够对嵌入式GUI有较好的支持。与那些通用的嵌入式GUI系统相比,它具有非常简洁、高效的体系结构和硬件图形加速功能。
2. DirectFB体系结构
(1)DirectFB访问硬件显卡
DirectFB依靠内核中的Framebuffer设备驱动(/dev/fb)所提供的现有接
口来访问图形硬件。这就意味着DirectFB必须要有一个能够正常工作的
Framebuffer设备驱动才能正常运行。有些芯片组需要在Linux内核中有
特定的Framebuffer驱动。对于那些没有被支持的芯片组,VESA
Framebuffer也能正常工作(但会有些限制)。不管图形加速功能有没有用
到,DirectFB都将用Framebuffer设备驱动来完成以下任务:
A. 设置视频模式(分辨率、色深、时序)
B. 从Framebuffer到显卡的内存映射
C. 改变Framebuffer视口(针对双缓冲)
如果某种显卡被DirectFB支持且在Linux内核中也有这种图形处理器的
Framebuffer驱动。DirectFB则利用Framebuffer设备做如下额外的工作:
A. 映射显存IO端口
B. 关闭Framebuffer驱动中自带的加速功能
针对具体的图形操作(如图片拷贝),DirectFB加速驱动访问显存映射的
图形处理器I/O端口向图形处理器提交命令。也就是说真正的硬件加速
完全是在用户空间实现。这样DirectFB就可以对它支持的图形处理器提
供最大限度的硬件图形加速。
(2)DirectFB访问输入设备
DirectFB使用Linux内核提供的标准设备接口访问输入设备,而不是直接
访问输入硬件。
(3)DirectFB支持的系统
DirectFB支持的系统有:fbdev、osx(Mac OS)、sdl、vnc、x11,这可以在
DirectFB代码目录中的systems中找到。在具体开发基于DirectFB的应用
程序时,DirectFB支持的系统可以通过其配置文件directfbrc来配置。
3. 在Linux下建立一个基于DirectFB的应用程序开发环境
(1)选择一个合适的DirectFB版本,下载并安装。
(2)建立DirectFB的配置文件directfbrc
(3)运行DirectFB的例子程序,如果运行成功,则可以开始编写基于DirectFB
的应用程序了。
这里重点讲解第二步,如何配置DirectFB运行所需要的配置文件directfbrc:
所有的DirectFB应用程序在启动时都会试图去读取其配置文件directfbrc(如果存在的话)。
DirectFB有两个配置文件,一个位于/etc/directfbrc,是全局的;一个位于$HOME/.directfbrc,是局部的。当然局部的可以覆盖全局的。
默认情况下,配置文件directfbrc是不存在的,此时,DirectFB程序会按照默认的设置运行,如默认情况下,DirectFB程序是基于Framebuffer的。如果想改变这种默认设置,如让DirectFB程序基于X11或者SDL等运行,则可以自己建立该配置文件directfbrc,其语法如下:
(在directfbrc使用的参数也可以在命令行里传递给DirectFB应用程序,只需要加上前缀:--dfb:)
directfbrc文件每一行包含一个变量。注释行以井号“#”开始,一直到行尾。空行被忽略。
许多参数只是一种开关,控制着一些特性的开/关。这些开关选项有一个no-变量,可以关闭相应的特性。下面介绍一些实用的参数和一些默认的参数:
参数(以下参数可以在directfbrc文件中设定):
system=<system>
设定使用的图形系统。默认使用Linux framebuffer (fbdev),但你也可以在SDL或者X11上运行DirectFB应用程序。其它的系统在将来可能会被扩展近来。
fbdev=<device>
打开指定的framebuffer设备,而不是默认的/dev/fb0。
mode=<width>x<height>
设定默认的屏幕显示。如果不设定,DirectFB将使用/etc/fb.modes 的第一个设定值。一些framebuffer设备(如vesafb)不支持模式切换,而只能使用启动时设定的值。
depth=<pixeldepth>
使用二进制位数设置每像素默认的像素深度。如果没有指定,DirectFB将使用/etc/fb.modes 里面的第一个指定的深度值。DirectFB支持8, 15, 16, 24和32位的颜色深度(color depths),这些值依赖于你使用的framebuffer设备是否支持。一些frame buffer设备(如vesafb)根本就不支持模式切换,只能使用在启动时设定的像素深度值。
pixelformat=<pixelformat>
设置默认的像素格式。和上面描述的深度参数类似但允许更精细的控制。Pixelformat的值可以为LUT8, RGB332, RGB16, RGB24和RGB32。一些设备可能还支持更奇怪的A8, ALUT44, ARGB, ARGB1555, I420, UYVY, YUY2和YV12像素格式。
session=<num>
选择被添加或创建的多应用程序。开始为0,如果强行设置为负值,则使用一个可用的最小值。设定的值将覆盖环境变量“DIRECTFB_SESSION”的值。
primary-layer=<id>
选定哪一个层为“主层”(primary layer),默认的是第一个。查看‘dfbinfo’可以找到你的硬件支持的层列表。
tmpfs=<directory>
使用给定的文件夹(tmpfs挂载点)来多应用程序模式下创建共享内存文件。这个选项只在自动检测失败或者渴望非tmpfs存储时才有用。
memcpy=<method>
使用这个选项,对memcpy()程序(routines)的探测会被忽略,节省了不少启动时间。传递“help”参数可以看到一系列的可能值。
quiet
禁止从DirectFB控制台(console)输出。只显示错误信息。
[no-]banner
启动时使输出DirectFB标志(banner)有效。默认有效。
[no-]debug
使debug输出有效。默认有效,但是除非你编译DirectFB时支持debug选项,否则,你不会不看到任何错误输出。
force-windowed
强制主表面(primary surface)为一个窗口。这样可以使设计成全屏显示的应用程序在一个窗口上运行。
force-desktop
强制使主表面(primary surface)成为桌面的后台表面(background surface)。
[no-]hardware
置硬件加速为有效。默认会自动探测硬件加速。如果你置它为无效,则显卡驱动虽然也会被加载并可以访问其它的显示层(如果有的话),但是,所有的图形操作将被软件来渲染(renderer)。
[no-]sync
初始化DirectFB之前清空所有的硬盘缓冲区(disk buffers) 。当你工作环境为实验性的设备驱动和预计会出现冲突(crashes)时比较有用。默认此功能为无效。
[no-]mmx
选相no-mmx使得即使检测到有MMX的支持也不能使用MMX程序(routines)。如果提供了MMX并在编译时加入了MMX的支持,默认该选相有效。
[no-]argb-font
向ARGB面载入字的轮廓(glyphs),而不是使用A8面(alpha masks)。该设置使用了更多的内存,但是一些显卡在使用A8面时会出现一些诡异现象。如果你的字体看起来比较奇怪,试试该选项。
[no-]a1-font
向A1平面载入字的轮廓(glyphs),而不是使用A8平面(alpha masks)。如果图形驱动不支持彩色+混合平移(blit,译者注,blit此处翻译成平移,具体的含义见附录),该选项可以加速字体渲染,但会影响质量。一般情况下你根本不需要使用该选项,因为基于A8字体的软件已经是高度优化和足够快了。
[no-]sighandler
默认情况下,DirectFB为一些信号量(signal)安装了一个可以使应用程序退出的信号量句柄(handler)。这个信号量句柄试图在退出应用程序前解除初始化的DirectFB引擎。使用该选项可以开/关此特性。
dont-catch=<num>[[,<num>]...]
和上面对sighandler 选项描述类似。使用该选项你可以对不能使用该方式被处理的信号量列出一个详细的清单。
[no-]deinit-check
默认情况下,DirectFB在退出时会检查所有已释放所分配的资源,如果没有,它将在应用程序退出后释放之。该选项可以开/关此功能。
block-all-signals
该选项可以阻塞所有的信号量,对DirectFB daemons有用(DirectFB master应用程序除了是一个master外,什么也不做)。
[no-]vt-switch
默认情况下,DirectFB会分配一个新的虚拟终端并转向使用它。
[no-]vt-switching
可以使用<Ctrl>+<Alt>+<F?>来切换虚拟终端。这是一个实验特性,经常无效,你看着办吧。
[no-]graphics-vt
使虚拟终端转为图形模式。有如下优点:当DirectFB应用程序运行时,内核的消息不会在屏幕上显示。
[no-]motion-compression
DirectFB常常压缩(compresse)鼠标移动事件。也就是说,一系列的鼠标移动事件被看作一个简单的鼠标移动事件。这样可以达到更快的响应但是鼠标处理的精确度会受到影响。
mouse-protocol=<protocol>
为一个串口鼠标指定使用的协议。以下的协议被支持:
MS 使用微软鼠标协议的两个按钮的鼠标;
MS3使用扩展的微软鼠标协议的三按钮鼠标;
MouseMan使用一种Logitech开发的另一种扩展的微软鼠标协议的三按钮的鼠标;
MouseSystems 广泛使用的三按钮鼠标。
串口鼠标所使用的协议的详细信息可参考相关资料。
[no-]lefty
切换鼠标左右按键,对“左撇子”(^_^)比较有用。
[no-]capslock-meta
把CapsLock键映射到Meta。对建在WM的用户有用,因为键盘上没有Meta键(例如Window键)。
[no-]cursor
默认情况下,DirectFB在使用窗口时显示一个鼠标箭头。该选项允许彻底关闭鼠标箭头。即使在应用程序里也不能让它再出现。
disable-module=<modulename>
禁止该模块的载入。模块的名字为文件名,但不能带有libdirectfb前缀也不能是其扩展(例如,若文件名为keyboard,则键盘输入模块载入被禁止)。
bg-none
使背景处理完全无效。不要设置给选项,否则鼠标和窗口移动时会在背景留下难看的痕迹。
bg-color=AARRGGBB
控制背景的颜色。颜色的值为十六进制值。默认的alpha值为完全不透明并可能被忽略。例如,设定背景色为红紫色(magenta),可以使用bg-color=FF00FF。
bg-image=<filename>
使用给定的文件中的图象充填背景。图象会被伸缩(stretch)以适应屏幕的尺寸。
bg-tile=<filename>
类似bg-image,这里使用图象的图快(tile)方式在屏幕的尺寸显示,而不是伸缩方式。
[no-]translucent-windows
默认情况下,DirectFB窗口可能是半透明的。如果你使该选项无效,则窗口会被强制为完全不透明或者是全透明。当你的显卡不支持alpha半透明图快(alpha-transparent blit)时,该选项比较有用。
videoram-limit=<amount>
限制DirectFB使用的视频RAM。视频RAM大小的单位为K字节数。
matrox-tv-standard=[pal|ntsc]
控制由Matrox卡的TV输出产生的信号。
[no-]matrox-sgram
一些老的Matrox G400卡有SGRAM并且如果设定该选项,一些图形操作在这些卡上执行相当快。如果你的卡上没有SGRAM,不要试图选中该选项,否则,你不得不重起。
[no-]matrox-crtc2
如果你有个双重的head G400/G450/G550,你可是使用该选项利用第二个head驱动附加层。
screenshot-dir=<directory>
如果选定该选项,当你按下<Print>键,DirectFB将把屏幕的内容以PPM格式放到这个指定的目录。
window-surface-policy=<policy>
控制窗口平面存放的位置。<policy>的值可以是:
auto DirectFB依据硬件特性自动判断,默认为该选项;
videohigh 以高优先级方式切换(swap)系统/视频内存;
videolow 以低优先级方式切换(swap)系统/视频内存;
systemonly 窗口平面保存在系统内存中;
videoonly 窗口平面保存在视频内存中。
desktop-buffer-mode=<mode>
控制桌面缓冲区模式。无论何时,窗口在移动、打开、关闭、调整大小或者变换内容,DirectFB将在受影响的范围内重新合成窗口堆栈,这是通过和平移(blit)在该范围的窗口一起来完成的。不透明窗口被直接平移,而半透明的窗口则使用alpha混合或颜色键来平移。如果有后端缓冲区(back buffer)的话,合成是不可见的,因为只有最终的结果会被拷贝到前端缓冲区(front buffer)。如果没有后端缓冲区,合成的每一步都是可见的,这将导致明显的闪烁,除非所有的窗口都是非透明的。
<mode>的可选值有:
auto DirectFB依据硬件特性来判断,为默认值。如果硬件支持简单blit(从后端向前端缓冲区中拷贝)操作,DirectFB会在视频缓冲区中选取一个后端缓冲区。如果没有加速功能,会在系统内存中开辟一个后端缓冲区,因为这样软件里的alpha混合合成操作可以执行地更好,并可以避免在结果已经拷贝到前端缓冲区中的情况下,再重新从视频缓冲区中读取。
backsystem 在系统内存中开辟一个后端缓冲区。如果你的硬件支持简单blitting但却没有alpha混合,这是推荐选择,你将得到许多alpha混合窗口。
backvideo 在视频内存中分配前端和后端缓冲区。该值特别不建议设定,因为如果blit被加速的话,‘auto’模式下会选择该值。没有加速的blit操作,该值不推荐使用。
frontonly 没有后端缓冲区。如果你仅仅使用不透明窗口并且不使用任何颜色键,这是一个最佳选择。
vsync-after
flip操作后等待垂直折回(vertical retrace)。默认情况下在做flip操作前等待。
vsync-none
对垂直折回(vertical retrace)关闭polling操作。
例子
下面的例子说明了怎么在命令行模式下,把上面介绍的参数传递给DirectFB应用程序。
df_neo --dfb:no-hardware
以没有硬件加速的方式开始运行df_neo
df_neo --dfb:help
列出可以传递给df-neo的所有可选参数。
附录:说明,这里以下的部分是从网上摘录的,仅供参考!
Blit操作相关解释(从网络摘抄整理,详见参考文献,即reference):基本含义:其意义是将一个平面的一部分或全部图象整块从这个平面复制到另一个平面;
Blit与CopyBox的区别:
Blit用于在不同的屏幕设备(物理的或者内存的)之间拷贝一块像素点,CopyBox则用于在同一屏幕上实现区域像素的拷贝。如果使用的是线性模式,Blit的实现非常简
单,直接memcpy就可以了,而CopyBox为了防止覆盖问题,必须根据不同的情况,采用不同的拷贝方式,比如从底到顶底拷贝,当新老位置在同一水平位置并且重复时,则需要利用缓冲间接拷贝。如果使用平面显示模式,这里就比较复杂了。因为内存设备总是采用线性模式的,所以就要判断是物理设备还是内存设备,再分别处理。这也大大地增加了fbvga16实现的代码。
Blit与显示内存的有效利用新的 GAL接口能够有效利用显示卡上的显示内存,并充分利用硬件加速功能.我们知道,现在显示卡一般具有 4M以上的显示内存,而一般的显示模式下,不会占用所有的显示内存。比如在显示模式为 1204x768x32bpp时,一屏象素所占用的内存为 3M,还有 1M的内存可供应用程序使用。因此,新的GAL引擎能够管理这部分未被使用的显示内存,并分配给应用程序使用。这样,一方面可以节省系统内存的使用,另一方面,可以充分利用显示卡提供的加速功能,在显示内存的两个不同内存区域之间进行快速的位块操作,也就是常说的 Blitting。
Blitting
操作与嵌入式汇编代码优化处理
在上层GDI接口在建立内存DC设备时,将首先在显示内存上分配内存,如果失败,才会考虑使用系统内存。这样,如果GAL引擎提供了硬件加速功能,两个不同DC设备之间的Blitting操作(即GDI函数BitBlt),将以最快的速度运行。更进一步,如果硬件支持透明或Alpha混和功能,则透明的或者Alpha混和的Blitting操作也将以最快的速度运行。新的GAL接口能够根据底层引擎的加速能力自动利用这些硬件加速功能。目前支持的硬件加速能力主要有:矩形填充,普通的Blitting操作,透明、aha混和的Blitting操作等。当然,如果硬件不支持这些加速功能,新的GAL接口也能够通过软件实现这些功能。目前通过GAL的FrameBuffer引擎提供上述硬件加速功能的显卡有:Matrox、3dfx等。
在通过软件实现透明或混和的DC间Blitting 操作时,新的GAL 接口利用了两种有效的优化措施:
在i386平台上,充分利用嵌入式汇编代码进行优化处理;比如在处理32 位色模式下的普通Blitting 操作时,在利用普通的C 库函数,即memcpy 进行位块复制时,由于memcpy 函数是以字节为单位进行复制的,从而无法利用32 位CPU 对32 位字的处理能力,为此,可以使用嵌入式汇编,并以32 位字为单位进行复制,这将大大提高Bliting 操作的处理速度。对源DC进行RLE(Run Length Encoding)编码,从而对象素的处理数量最小化。RLE 可以看成是一种图象压缩算法,Windows BMP 文件就利用了这种算法。
RLE 是按水平扫描线进行压缩编码处理的。在一条扫描线上,如果有大量相同的象素,则不会保存这些象素点,而是首先保存具有相同象素点的数目,然后保存这些象素点的值。
这样,在进行透明或者混和的Blitting 操作时,可以大大降低逐点运算带来的速度损失。但是,如果在最坏的情况下,比如所有水平扫描线上的象素点都具有和相邻点不同的象素值,则RLE编码反而会增加象素的存储空间(最坏的情况是原有空间的两倍),同时也会降低Blitting操作的速度。因此是否使用RLE编码,要根据情况而定。新的GDI接口在指定源DC的透明和Alpha通道值时,可以指定是否使用RLE编码。
./directfbrc
例子:
system=fbdev
fbdev=/dev/fb0
wm=default
mode=640x480
depth=32
pixelformat=RGB32
续:directfb+gtk+webkit在 arm上的移植
http://www.eifr.com/article.php?id=1152