• 沒有找到結果。

Java的繪圖函式庫

第一章、 緒論

1.3 Java的繪圖函式庫

電腦硬體不斷推陳出新,而繪圖加速卡在最近幾年更是進步神 速,也讓電腦遊戲軟體在開發時充滿了更多的可能性,視覺上的效果 將可以更加地多采多姿。因此,與繪圖加速卡關係密切的繪圖函式 庫,在遊戲軟體的開發上將扮演舉足輕重的角色。

繪圖函式庫目前有兩大主流,OpenGL[28]是業界的開放標準,

其跨平台的特性使其可被使用在不同的作業系統上;而DirectX[10]

雖然只能用在微軟視窗作業系統(Microsoft Windows)上面,但是微軟 視窗作業系統的龐大市佔率,已為其奠定了良好的使用基礎。

Java 的繪圖效能不彰,主要來自虛擬機器(Virtual Machine,以 下簡稱VM)本身的瓶頸[18]。如何突破這個瓶頸,獲得硬體加速的直 接支援,繪圖函式庫將會是關鍵性的因素。而在Java 中負責繪圖部 分的抽象視窗工具組(Abstract Window Toolkit,以下簡稱 AWT)[26]

亦將扮演一個非常重要的角色。

因此,接下來的幾個章節將進一步討論Java 可以使用的各種繪 圖函式庫。首先在1.3.1 節將先介紹 Java 的基本繪圖函式庫,並介 紹其發展過程。而在1.3.2 節將介紹非 Java 基本套件的其他繪圖函 式庫,這些繪圖函式庫因為可以獲得硬體的支援,所以對於繪圖效能 的提升有一定的幫助。最後在1.3.3 節將介紹微軟視窗平台上特別提 供給Java 用的繪圖函式庫,雖然這個繪圖函式庫僅能在微軟的視窗 平台上使用,但是因為可以獲得DirectX 的硬體支援,所以仍然是一 項值得考慮的解決方案。

1.3.1 Java 的基本繪圖函式庫

抽象視窗工具組(Abstract Window Toolkit,以下簡稱 AWT)是一

套在Java 中專門負責開發圖形使用者介面(Graphical User Interface) 的API。基本上,AWT 可以分為兩個部分,一個部分是使用者介面 工具組(UI Toolkit),而另一個部分是繪圖工具組(Graphics Toolkit)。

使用者介面工具組這個部分,包含視窗元件的建立,以及事件的 處理機制。AWT 的重型元件(Heavy-weight Component),是由不同 平台的視窗系統所生成,以提供一致的呈現。之後推出的Swing[6],

基本上仍然是建構在AWT 之上,除了提供更多的元件之外,最重要 的是全部改為自行繪製的輕型元件(Light-weight Component),因此 將十分仰賴AWT 在繪圖工具組這個部分的繪圖效能。

繪圖工具組這個部分,包含基本的影像處理與繪圖功能,屬於 Java 的基本繪圖函式庫,也是影響 Java 繪圖效能最關鍵的部分。JDK 1.2 推出的 Java 2D[9],在與AWT 相容的前提下,完全接管了這個 部分,並提供更強大的影像處理與繪圖功能,如圖1-2。然而為了提 供Java 2D 的眾多新功能,JDK 1.2 不得不採用軟體實作。因此繪圖 效能不但沒有改善,反而更糟。

圖 1-2 : JDK 1.2 版之後推出的 Java 2D。

終於到了JDK 1.4,繪圖效能才又有了突破性的改善,在 Win32 平台上採用DirectX 來獲得硬體支援[24][18]。然而這樣的改善結果卻 依然成效不彰,除了程式必須改寫之外(必須使用 VolatileImage[27]

才行),對於透明圖和不透明圖在繪圖效能上的改善程度也不盡相 同。而JDK 1.5 雖然又增加了可以採用 OpenGL 來獲得硬體支援

[20],但是目前為止其硬體的相容性很差,時常無法啟用,很多時候

就算啟用了卻也沒什麼效果可言。圖1-3 和圖 1-4 分別為 Java 2D 支 援DirectX 和 OpenGL 的圖示說明。

很明顯地,Java 的基本套件在繪圖效能上的改善結果始終不是 很理想,這也是Java 長久以來一直為人所詬病之處。然而 Java 並 不是沒有機會的,下一節將介紹其他非Java 基本套件的繪圖函式 庫,看看這些額外的套件如何改善Java 的繪圖效能。

圖 1-3 : JDK1.4 版之後,Java 2D 採用 DirectX 支援。

圖 1-4 : JDK1.5 版之後,Java 2D 採用 OpenGL 支援。

1.3.2 Java 的其他繪圖函式庫

除了Java 內建的基本套件之外,如圖 1-5 所示,其實透過 Java 的原生介面(Java Native Interface,以下簡稱 JNI)[19],也是有機會 可以穿過VM 直接使用作業系統提供的各種函式庫,這當然也包含了 一般的繪圖函式庫,像是 DirectX 和 OpenGL。雖然這的確有機會可 以提升Java 的繪圖效能,但是 採用此方式唯一的麻煩是必須自行建 立一對一的原生實作,好讓Java 程式可以使用作業系統提供的各種 函式庫。此外也將會因此而喪失Java 跨平台的優勢,不然就是必須 盡可能地在各種平台上完成不同的原生實作來彌補這個缺點。

在JDK 1.2 之後,進入了 Java 2 的時代。這時由於「AWT Native Interface」[26]使用文件的公佈,使得這類解決方案又多了一項實作 方式,各種作業系統提供的繪圖函式庫可以在不影響效能的情況下,

透過Java Native Interface(JNI)直接在 AWT 元件上進行繪圖的動作。

圖 1-5 : 採用 JNI 的其他 Java 繪圖函式庫。

想要透過JNI 自行建立完整的一對一的原生實作,其實並不是件 簡單的事。然而值得慶幸的是,目前這類型的解決方案已經有許多現 成的套件可以使用了,想提升繪圖效能還是有機會的,如表1-4 所列。

簡稱 函式庫名稱 原生支援 贊助單位

SWT Standard Widget Toolkit [4] GDI IBM JOGL Java bindings for OpenGL API [21] OpenGL SUN LWJGL Light-Weight Java Gaming Library [2] OpenGL Source Forge

表 1-4 : Java 的其他繪圖函式庫。

1.3.3 微軟視窗平台上的繪圖函式庫

除了Sun 推出的 Java 虛擬機器之外,另外特別值得一提的就是 微軟的Java 虛擬機器(Microsoft Java Virtual Machine,以下簡稱 MSVM)。雖然 MSVM 僅支援 JDK 1.1,但是因為其內建於微軟的瀏 覽器Internet Explorer(IE),所以也讓它成為一般使用者最容易接觸 到的Java 虛擬機器。

此外,微軟為了讓MSVM 可以跟作業系統有更緊密的結合,以 便開發更多更有價值的應用程式,特別推出了一整套的解決方案,統 稱為Microsoft SDK for Java[11]。如圖1-6 所示,其中的 Microsoft Language Extension 更提供了可以直接使用 DirectX 的 API,這一點 對於Java 在繪圖效能的改善上有著莫大的助益。雖然這將會破壞 Java 跨平台的特性,但是因為微軟視窗作業系統擁有龐大的市佔 率,亦使MSVM 在繪圖效能改善上的可能性有著不可或缺的影響力。

圖 1-6 : MSVM 上可以使用 DirectX 的方式。

相關文件