Evas 简介

来源:互联网 发布:考勤机如何导出数据 编辑:程序博客网 时间:2024/06/04 19:37

 

 

1.    Evas是什么?

 

Evas是个用在许多目标显示系统中的一个干净的显示Canvas,可以绘制平滑的文本,光滑的超级以及子采样的缩放图像,带Alpha混合的Object以及更多功能。

它极尽可能的了解你的显示系统的特征,以及用什么图形调用来画图,以及如何画。它在Object级别打交道,因此你所需要做的就是创建以及管理画布上的Objects,设置它们的属性,剩下的工作会自动为你完成。

Evas优化了渲染管道以减轻重画所需要的工作量,将程序员从中解放出来,节省大量的时间和精力。

 

Evas小而精,从嵌入式系统直到大型超级多CPU工作站,都能很好的工作。如果你愿意的话,可以只编译目标平台所需要的功能,因此使得它小而精。它有许多的显示后台,使得它可以在许多显示系统上工作,使得它具备跨设备和跨平台开发的移植性。

 

2.    Evas不是什么?

 

Evas并不是一个widget集或者widget工具箱,尽管它是它们的基础。请参考Elementary网站(http://docs.enlightenment.org/auto/elementary/),这个是基于Evas, Edje, Ecore以及其它Enlightment技术的工具箱。

Evas不依赖于Main loops,输入或输出系统。输入应该通过其它途径进行,然后传给Evas. 类似的,它也不创建窗口或者向你的系统报告窗口更新,它只是绘制像素,以及向用户报告哪些区域发生了变化。当然了,这些操作都是非常通用的,可以在Ecore中随时使用,特别是Ecore_Evas(http://docs.enlightenment.org/auto/ecore/)

 

3.    Evas如何工作的

Evas是一个Canvas显示库。 它不同于大多数显示和windowing系统,Canvas是结构化的,而且是一个状态引擎。 然而大多数的显示和窗口系统是即时方式显示对象。Evas通过状态引擎来处理结构化显示之间的逻辑关系,以及控制目标窗口系统,以便显示当前画布状态的渲染结果。

即时方式显示系统保留非常少的状态,甚至没有。一个程序执行一系列的命令,如下伪代码所示:

画一条从 (0, 0) (100, 200)的线;

画一个从 (10, 30) 50500)的长方形;

bitmap_handle = create_bitmap();

缩放bitmap_handle 100*100;

(10, 30)处绘制图像 bitmap_handle;

窗口系统执行这一系列命令,结果显示在屏幕上。一旦命令执行,显示系统就几乎不知道如何重新产生这些图像,因此不得不由application来指导如何进行重新绘制。每一个后续命令都是由application指导,然后通过软件模拟或者发送给设备的图形硬件来执行。

 

这样的系统的一个优点就是简单,由程序来严格控制如何绘制,以及绘制成什么样。考虑到不断增加的显示的复杂性,以及用户要求有更好的显示界面,因此需要内部的widget集,定制的显示widget,以及其他程序做更多的工作。这意味着要一遍又一遍的写大量的逻辑以及显示渲染代码,每一次应用程序都要找出如何最小化重画工作,使得显示快速交互,并明了重画逻辑。这种能力用昂贵的代价,大量额外代码和工作来换来的。程序员如果不熟悉图形编程,就会经常在这个级别上犯错误,以及写出次优的代码。而熟悉这些编程工作的程序员,会很快厌倦一遍又一遍的写重复代码。

例如,在上面的场景里,窗口系统要应用程序在 (0,0) (50,50)重新绘制区域,那么程序员必须手工计算哪些需要更新,以及如何重绘。

(0,0)(50,50)重绘:

// (0,0,50,50)区域里都有些什么

//1. 与从(0,0)(100,200)的线的交叉部分?画一条从(0,0)(50,50)的线

//2. 与从(10,30)(50,500)的长方形的交叉部分? 画一个从(10,30)(50,50)的长方形

//3. (10,30)处得图像的交叉部分,大小是100*100?

聪明的读者或许已经注意到,如果所有的元素都是不透明的,那么系统在做无用的绘制:线的一部分藏在长方形后面,长方形的一部分又藏在图像的后面。这些无用的绘制代价是很大的,每一个像素要用4个字节,那么100*100像素的重复区域要用40000的无用写操作。开发者可以通过计算重复区域来避免绘制,但要和上面提到的”expose event”处理混合起来,很快就意识到,一开始的看似简单的方法变的非常复杂。

Evas是个结构化的系统,程序员只需要创建以及管理显示Objects以及它们的属性,由于更高级别的状态管理,当需要显示Canvas的当前状态时,Canvas可以重绘Objects集。

例如,伪代码如下:

line_handle = create_line();
set line_handle from position (0, 0) to position (100, 200);
show line_handle;
 
rectangle_handle = create_rectangle();
move rectangle_handle to position (10, 30);
resize rectangle_handle to size 40 x 470;
show rectangle_handle;
 
bitmap_handle = create_bitmap();
scale bitmap_handle to size 100 x 100;
move bitmap_handle to position (10, 30);
show bitmap_handle;
 
render scene;

 

这或许看起来有点长,但需要刷新或更新显示时,程序员只需要move, resize, showhide 需要变动的objects等。程序员只需要考虑Object逻辑级别的事情,剩下的工作,Canvas会负责处理,因为这是最后一次绘制,它会找出Canvas中哪些确实改变了,如何最高效的绘制Canvas和它的内容,以反映当前的状态,接下来它可以开始进行真正的Canvas绘制

这使得程序员在处理显示时,以更自然的方式来思考,节省大量的时间和精力,结合当前的显示系统,考虑如何加载,显示图像,渲染等。因为Evas具备跨显示系统的移植性,这使得程序员能够移植他们的代码,只需要很小的工作量,就可以在不同的显示系统上显示。

也可以将Evas看作是一个在widget 集和即时方式显示系统中间的这样一个显示系统。它保留了基本的显示逻辑,但是做很少的高级别逻辑工作,比如scrollbar, sliderspush buttons等。