【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 3090|回复: 1

關於QUARTZ EXTREME

[复制链接]
发表于 2007-7-29 18:20:32 | 显示全部楼层 |阅读模式
OIKOS 刊登過的拙文,放在這裡紀念一下。

寫這篇短文的目的,是在於MacOS X 10.2(code name: Jaguar)裡頭,QC做了大幅度的提升,而由於MacOS X本身複雜的底層設計,使得許多人對QE多有疑惑(無論是技術上的不解或效能上的疑慮)。為了讓大家能更清楚的了解QE(以及MacOS X),筆者決定動手寫一篇短文,解釋Q2D, QC, QE以及MacOS X的WS。

1) Window Server, MacOS 9, QUARTZ Compositor

首先我們必需先了解一些作業系統的結構:關於2D螢幕繪製,2D加速,以及整個顯示的原理。首先來看Window Server﹣GUI的背後守護神。Window Server有很多工作,包括傳達UI Event(例如告知某個應用程式滑鼠點下去了),決定螢幕使用權限(例如螢幕上的某一個部份屬於桌面,另一塊屬於IE等等)以及一部份的螢幕顯示。

在MacOS X裡,Window Server在UI Event傳遞以及決定螢幕使用權限的角色上,與MacOS 9並沒有太大的不同(注意:這並不是說,實作-implement-的方式沒有不同,相反的,實作以及實際的運作方式上,MacOS X的Window Server與MacOS 9完全不同,但是就基本的角色定義來說是纇似的:紀錄硬體事件﹣例如滑鼠﹣,傳遞硬體事件,以及紀錄和分配螢幕的使用)這部份的問題我們等下才會觸及,現在我們來專心對付Window Server在MacOS X的新角色:QUARTZ Compositor。

什麼是QUARTZ Compositor?這個東西筆者以前其實講過,但為了讓更多人能夠理解,現在筆者準備用更親切的方式來說明:圖解。

首先我們來看MacOS 9的運作方式。由於手上已沒有MacOS 9,筆者使用MacOS X的畫面來說明,所幸,這完全不會影響我們對於這方面的理解和討論。假設這是一個MacOS 9下的桌面:



在這個畫面,螢幕被分成三個部份:桌面,App 1(綠色),App 2(淡紫色),在MacOS 9裡頭,這三個程式分別繪製自己那部份的螢幕。



移動App 2的視窗後,螢幕上有色個部份要重新繪製:紅色(原屬桌面,現在交給App 2),綠色(原屬App 2,現在仍是,但內容不同),黃色(原屬App 2,現在交給App 1)以及紫色(原屬App 2,現在交給桌面)。

由於MacOS 9的程式是直接繪製影像到螢幕上,這個重繪的過程事實上必需經過好多個步驟:首先這塊區域會被清除(白色)。



接下來App 2更新自己那塊區域(紅色,綠色)。



第三步:App 1更新自己的區域(黃色)。



最後:桌面重繪(紫色)。




相信大家都還記得,在MacOS 9裡頭移動或縮放視窗的動作都會讓螢幕部份區域閃動(flicking),原因正在於螢幕重繪的機制。這種方式我們稱為直接螢幕繪製(direct screen drawing),亦即所有的程式負責更新螢幕上屬於自己的區域。這個方式的好處是節省記憶體,快速以及不耗資源,壞處是有某些動作是不可能(無論是技術上的不可行或效能上的問題),例如“移動視窗時顯示內容”,“跨程式的半透明處理”。另外附加的缺點包括程式寫作難度較高(要計算不規則形區域)以及對系統穩定度可能造成的危險(例如讓程式直接存取記憶體,等於破壞記憶體保護的機制)。

那,在MacOS X裡頭這個機制發生了什麼改變?要說明這一點,我們得來看看顯示卡基本的運作原理:



這是一個簡化過的結構圖,但已經足夠我們要說明的主題。首先,所有要在螢幕上顯示的內容,都會以bitmap(點陣)的方式存在顯示卡的VRAM中,這塊我們稱為frame buffer。通常來說,frame buffer裡頭都有一個以上的單位,每個單位都是一整個螢幕。當系統在更新其中一個單位時(亦即:重繪螢幕),會下令buffer selection的單元選擇到另一個單位(例如:系統繪製buffer 0,螢幕上顯示buffer 1)等到系統更新完成,就命令2D Processor切換到更新過的單位。2D Processor,另一方面來說,會每秒鐘更新螢幕數十次(這個次數就是所謂的更新率),所以在下一次2D Processor更新螢幕時,我們就會看到新的影像。

如果能明白這樣的顯示原理,大家應該就會想到:在MacOS 9裡頭,所謂的直接螢幕繪製(direct screen drawing),就是直接讓程式把要顯示的內容寫到frame buffer裡頭。而MacOS X使用的方法,就是把這個動作單純化,亦即採用所謂雙重緩衝(double buffer)的技巧。

所謂的雙重緩衝,就是每支程式都有自己的buffer,而這些buffer最後會匯整到真正繪製螢幕用的frame buffer,由於有兩道buffer,所以稱為雙重緩衝。為了說明清楚,我們還是用最親切的方法:圖解。同樣的,這個圖解也是簡化過的版本,但也同樣的足夠我們了解MacOS X的2D運作:


在圖中我們可以看到,每一個程式都有一塊(或好幾塊)buffer,對這些程式來說,他們不必管視窗在螢幕的什麼位置,他們只負責把整塊區域用自己認為正確的方式繪製出來(例如Dock.app只負責畫出整個Dock的長相),最後,Window Server,參照一個列表,將螢幕顯示的內容合成出來。這個負責合成的元件,就是所謂的QUARTZ COMPOSITOR。合成的動作可能很單純(例如整個視窗蓋到一個區域),也可能有點複雜(例如陰影和半透明效果,就會牽涉兩個視窗內容的cross blend / cross fade)。而Quartz Compositor所繪製出來的內容,就放在frame buffer裡頭,由我們前面看到的顯示卡2D運算單元來顯示在螢幕上。

這樣的方式,優缺點幾乎和MacOS 9所使用的方式直接相對:有彈性,安全,程式寫作單純,顯示效果/品質提升,但是慢,號用記憶體,花CPU時間(處理頻繁的合成和堆疊)。

2) QUARTZ EXTREME

到目前為止我們都是在講整個Quartz Compositor以及MacOS X Window Server的運作,接下來,我們就要來看MacOS X 10.2 (aka Jaguar) 加入的Quartz Extreme究竟怎麼運作。

對3D繪圖有所了解的讀者一定都知道,3D繪圖是由曲面(surface),多邊形(polygon),材質(texture)等元素組成,這些內容雖然繁多,但是總結來說不脫向量變,形變以及合成幾個動作。在這裡為了讓更多讀者能夠了解,我們還是用簡單的圖解來說明:



首先,針對認何一個我們要描繪的場景(scene),我們一定會有兩個基本的東西:材質(textures)以及脈絡(context)﹣材質獨立於脈絡,脈絡定義材質的使用。接下來,藉由這兩樣東西,我們可以作基本的貼圖,加上光影和陰影,最後作出半透明的合成。(對於熟悉3D的讀者來說,這樣的過程太過簡略,而且也不見得符合實際的步驟,但這樣的安排應該有助於其他讀者的理解)。

這樣的過程是否很熟悉?如果有讀者還想不起來,筆者用一個簡單的圖示應該有助於此:



相信沒有讀者看不出其中的相似性。於是,理所當然的,在MacOS X 10.2 (aka Jaguar)中,Quartz Compositor經過了重新的改寫以及補強,在現在,只要機器和顯示卡能夠支援,Window Server / Quartz Compositor就會變成這樣:



所以基本上來說,Quartz Extreme就是以OpenGL來實作Quartz Compositor,並將其他的螢幕繪製/顯示合成到一個管線(pipeline),這樣的作法會大幅增加顯示的效能(想像沒有硬體加速的3D遊戲和有硬體加速的3D遊戲)。嚴格說來,Quartz Extreme並不只是針對Quartz Compositor作加速﹣更精確來說,Quartz Extreme的2D加速只是咐帶的好處,真正的目的,是一個全新而充滿彈性的繪圖引擎以及開發環境,這個環境讓開發人員有更多的空間選擇適用的函式,融合更多更豐富的效果。

3) 硬體支援

這時有很多讀者會問:那為什麼我的Rage 128不支援?可以玩QUAKE 3的卡跑不動Quartz Extreme?!這是什麼道理?

在這部份來說,筆者可以很明確的提出兩個限制:2x AGP,以及顯示卡指令支援。後者是很容易想像的:ATI Rage 128以及之前的卡,並不支援所有的材質大小,在材質尺寸有限制的情況下,實在難以奢求Quartz Extreme能夠正常工作。

那麼2x AGP的限制從何而來?在前面我們已經曉得,Quartz的整套系統,針對每一個視窗都有獨立的緩衝(buffer),而Quartz Extreme的出現,並沒有改變這一點,也同樣的沒有改變每個視窗都要耗用記憶體這個事實。簡單的計算一下:一個640x480x24bit的視窗,將占去將近800KB的空間,開上二三十個視窗是常有的事情,這樣的計憶體使用量,不能說不大。以3D繪圖來說,繪製用的材質最好都放在VRAM裡頭,但以Quartz的動輒數十MB來說,又似乎不可能,為此,Quartz Extreme只能使用一個折衷的方法:快取(cache)加上高速的直接計憶體存取(DMA)。我們,照例,來看一個圖示:



在圖中我們可以看到,為了增加效能,Quartz Extreme並不會自己實作資料搬移的動作。相反的,Quartz Extreme會呼叫系統的DMA控制器,由其完成資料搬移,DMA控制器的原理會減輕CPU的負擔,讓CPU有時間作其他的事情,而搬到VRAM裡頭的東西,就是視窗快取(Window Cache)。

與3D遊戲所不同的,視窗難免是變動體(觀察一下,螢幕上在更新的東西應該不少)而這些變動都必需傳達到顯示卡,因此在大量操作的情況下,系統的資料搬移將會非常大量,這造成了PCI匯流排的限制。更重要的是,由於PCI匯流排的速度,整個系統匯流排會被堵塞(就像塞車一樣),在沒有資料的情況下,連CPU都會陷入空轉,這也是之前大家會發現PCI顯示卡打開Quartz Extreme的情況下在大量操作時系統會幾近停擺的原因。

4) 限制

除了硬體上的需求外,Quartz Extreme還有其他的限制,這與許多人把Quartz Extreme當成萬靈丹正好相反,對這點的理解不夠也造成了許多抱怨與懷疑。這其中,筆者將挑出兩個最常見的誤解。

第一,Quartz Extreme對於向量繪圖並沒有直接的幫助。筆者會提到相量繪圖,是由於Quartz的另外一部份:Quartz 2D。當初MacOS X採用Quartz結構時,筆者曾說過幾個效能上的必然瓶頸:向量繪圖v.s.點陣繪圖就是其中一個。MacOS X的原生(native)2D API是Quartz 2D,亦即使用貝資曲線(beizer vector)來作為顯示描述語言。MacOS X使用的描述語言基本上就是PDF,換言之,與POSTSCRIPT有很近的血統。這樣作的優缺點筆者就不再多談,但很明顯的是,Quartz Extreme,如果讀者能夠理解筆者前面的說明,與這些是無關的。更進一步來說,Quartz Extreme用來合成的內容,亦即視窗的內容)是用Quartz 2D繪製出來的,如果Quartz 2D畫不快,Quartz Extreme也沒有辦法。當然這並不是說,Quartz Extreme完全不會影響到Quartz 2D的效能(CPU的空閑時間變多了,其他的東西總會多少快一點),但並不會直接有幫助。

第二,Quartz Extreme對於Live Window Resizing也沒有直接的幫助。Live Window Resizing是MacOS X 10.0.0 以來大家最重要的抱怨,許多人都以為這個問題會隨著Quartz Extreme的出現魔術般的解決,很可惜筆者要粉碎這個希望。首先我們要了解Live Window Resizing的慢,因素何在?簡單說來,大家都看到MacOS 9的視窗只有在滑鼠放開時才會更新一次,這樣說什麼也不會慢。相反的,MacOS X上面縮放視窗時,每一點點距離視窗就會被更新一次,所以在使用者去放大/縮小視窗時,一個程式可能被呼叫了幾十次的更新,這個多出來的負擔不可謂不大,而,很顯然的,此處的瓶頸在於視窗「內容」的更新頻率過於頻繁,Quartz Extreme,正如同前面對Quartz 2D無能為力,在這裡也一樣派不上用場。

5) 結語

以上是筆者對於Quartz Extreme的一些淺見和理解,希望對讀者有些幫助。如有疏忽之處,也請大家不吝賜教。

Quartz Extreme,總結來說,是一個很複雜也很前進的作法,其最大的創新,在於將所有的顯示項目匯集到同一個管線(pipeline),讓顯示以及界面的運用有更大的彈性,兼而加速顯示的效能。

至於有些人關心的問題,例如Live Window Resizing,是否沒有解呢?筆者並不這麼認為,這纇的問題是需要時間來作最佳化(optimization)的,例如MacOS X Finder現在使用的快取機制,就是一個很好的例子。最佳化的過程確實漫長,但隨著時間和經驗的累積,以及科技的進步,許多問題應該可以得到相當的緩解。
 楼主| 发表于 2007-7-29 19:09:30 | 显示全部楼层
新增介绍:什么是 Quartz 2-D Extreme

我们从系统如何画图,来理解什么是 Quartz 2-D Extreme:

系统使用 Quartz 2D 来绘制一个窗口的过程是这样的 (OS X 10.0/10.1):

1。窗口中每个控件(包括按钮,文本框,图片等)被计算并绘制到系统内存的缓冲区中(由CPU完成)
2。缓冲区中屏幕可见部分的内容被传到显示卡中绘制(绘制过程由GPU 2D部分绘画完成)
3。窗口中透明部分(如阴影等),通过计算并显示(由CPU完成,因为GPU 2D部分绘画无法完成这部分计算,2D只涉及移动像素等功能)

这种办法是很低效率的(顺便说一下,windows ui就是这样,嘿嘿。。。),所以苹果开发了Quartz Extreme(QE):

系统使用 Quartz Extreme 来绘制一个窗口的过程是这样的 (OS X 10.2 and 10.3):

1。窗口中每个控件(包括按钮,文本框,图片等)被计算并绘制到系统内存的缓冲区中(由CPU完成)
2。缓冲区中的图形传到了GPU中,并且定义成一个贴图。(由GPU完成)
3。窗口由于OpenGL渲染生成,系统半透明,阴影等效果由于GPU计算渲染(由GPU完成)

这样效率大大提升,因为大部分图形工作由GPU负责,我们平时用的Expose和用户切换的3D滚动效果就是这样来的。

在Tiger中,最后一项CPU的工作也也交给了GPU,这个就是Quartz 2D Extreme 了,

系统使用 Quartz 2D Extreme 来绘制一个窗口的过程是这样的 (OS X 10.4+):

1。窗口中每个控件(包括按钮,文本框,图片等)被放置到了OpenGL中一个off screen的context中计算生成,CPU不负责rasterizing绘图工作(由GPU完成)
2。off screen的context图形传到了GPU中,并且定义成一个贴图。因为都是在显示卡中处理,避免了从系统内存往显卡内存传这个过程,速度大大增加。(由GPU完成)
3。窗口由于OpenGL渲染生成,系统半透明,阴影等效果由于GPU计算渲染(由GPU完成)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-5-6 11:26

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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