首頁
中文書目錄
原文書目錄
 站內快速搜尋
資源中心
Book Series
Special Interest













■好消息,歐萊禮書籍已重新鋪貨至各大書局及網路書店,歡迎讀者選購       ■歡迎各院校採用歐萊禮書籍,學校團購請洽校園服務團隊

[技術短文]

在 2D 與 3D 之間作抉擇


GUI 是一個軟體的門面,我向來是一個講究軟體門面的人,軟體不只要功能強,也要好用好看,才不會讓使用者不知從何下手,或者哈欠連連。「好用好看」就是 GUI 設計的最高指導原則。設計軟體時,我幾乎都是先從使用者的角度來思索 GUI,繼之才設計整體程式架構,而我寫軟體的過程,有泰半的時間是花在 GUI 設計上。我以前一直「誤認為」自己這樣的作法是本末倒置,所以「羞於啟齒」,還好最近出版的 《User-Centered Design: An Integrated Approach》書中的作法顯然是站在我這邊,還我清白,讓我有說出事實的本錢。

提到 Java GUI 程式設計,你一定會直接想到 Swing。Java 程式員都用過 Swing,但能把 Swing 用得很順手的人恐怕比例不高,例如:JTextPane、JEditorPane... 等元件就複雜得讓許多無法順心駕馭。在 Swing 都搞不定的情況下,大家不可能有能力去深入追求更高水準的 GUI 程式設計,所以能深入學習並使用 Java 2D 和 Java 3D API 的程式員就更少了。

對於一個追求高品質 GUI 的程式員而言,Java 2D 是一定要會的基本功夫。我在《Java 2D Graphics》的書評中也說過,許多時候,Swing 元件常常無法完全滿足我們的需求,這時候必須自己用 Java 2D API 來完成 Swing 不具備的功能。如果你是一個對 GUI 品質要求更高的人,而 2D 效果已經不能滿足你,那麼 3D 效果很值得你嘗試看看,這樣的情況下,你直覺想到的 API 是 Java 3D。

前一陣子,我花了很多時間使用 Java 3D API,嘗試著設計出全新的 3D 介面,讓我的程式更酷更炫,我這樣的想法來自於 Jon Barrilleaux 所著的《3D User Interfaces with Java 3D》一書(Manning 出版),他提出了使用 Java 3D 設計一個 3D 版 Swing 的點子。原本我還認為這個點子挺新鮮的,準備好好實施,但是最後我認清事實,放棄不用 Java 3D,而打算改用 Java 2D 來設計出 3D 效果,因為:
  1. Java 3D 的效率仍然需要假以時日才能具備實用的價值。而 Java 2D 的效率在 Java 1.4 把 rendering pipeline 最佳化之後,已經大幅度改進了。只要程式技巧得當,一般來說,使用 Java 2D 效率很不錯。
  2. Java 3D 是 Optional Package,必須額外安裝,對於 end-user 較不方便。甚至有的平台沒有 Java 3D 的 implementation,所以使用 Java 3D 可能會造成程式在某些平台不能執行。而 Java 2D 是 Java 的 Core API,任何 JRE 都必須提供,所以不會有此問題。
  3. Java 3D 和既有的 Swing 無法搭配得很好,因為 Java 3D 的 canvas 不是 light-weight component。而 Java 2D 是 Swing 底層的 API,所以和 Swing 可以完全沒有隔閡。
  4. 架構 3D 圖形時無法對於投影面(Projection Plate)進行精細的安排,因為無法取得投影面之處視覺物件的度量(metrics),這會造成安排畫面時很大的困擾,這點也是我最大的困擾。Java 2D 則完全沒有此問題。
  5. 使用 Java 3D 在挑選物件(Picking Object)時不甚方便,且效率比較差。Java 2D 直接攫取滑鼠訊息,更方便、效率更好。
基於上述的原因,我覺得 Java 2D 是更好的選擇,完全沒有上述三個缺點。當然,Java 2D 並不是為了 3D 而設計的,所以使用 Java 2D 來設計 3D GUI 也會產生一些問題:
  1. 以 Java 2D API 模擬 3D 效果,需要寫更多程式。
  2. 以 Java 2D API 模擬 3D 效果,不若 Java 3D 來得逼真。
對於大部分的程式員來說,上述這兩點通常不會是太大的困擾,因為:
  1. 可以使用 Vincent J. Hardy 所提供的 GLF(Graphics Layer Framework)來降低使用 2D 模擬 3D 的難度。GLF 非常好用,不但可以模擬有限度的 3D,更可有各種奇妙的視覺效果。
  2. 除非我們的程式需要虛擬實境般嚴格的 3D 效果,否則使用 Java 2D 來模擬 3D 已經夠用。我自己的經驗是,即使是想繪出 3D 統計柱狀圖,也最好用 2D API 來設計,不要使用 3D API,否則視覺效果沒辦法詳細控制。
  3. 簡單的 3D 效果使用 Java 2D 來模擬會比大費周章地使用 Java 3D 效率更好。
使用 GLF 進行太多層次(layer)的套疊(stack-up),很可能會讓速度慢得不能忍受,你必須善用 Java 1.4 新提供了 2D 硬體加速功能(VolatileImage)以及善用 Double Buffering 技巧,就可以使得速度加快。

想建立有立體層次感的 Java GUI 程式,對於 2D/3D API 之間的選擇,我給你的建議是:
  • 點綴式 3D 最好使用 Java 2D + GLF 即可。殺雞(2D)用牛刀(3D)絕非好事。
  • 虛擬實境等軟體才使用 Java 3D 開發。
  • Java 2D 和 3D 之間能混合使用的機會不多,別想魚與熊掌兼得。
善用 Java 2D + GLF,你也可以為你的 GUI 整修門面,煥然一新。


本文作者:蔡學鏞
張貼日期:03/29/2002

| 首頁 | 聯絡我們 |
© 2009, O'Reilly Media, Inc. Taiwan Branch