快快樂樂學遊戲Threading程式設計

這是我在近期內對於 Threading 主題的學習整理文。如果你對於多執行緒程式設計沒有半點概念的話,建議可以先從我之前寫的「多核多緒多樂趣」開始閱讀,然後再視個人需求取用以下各項資源。

所謂的「多執行緒」程式設計,或者可簡稱為「多緒」程式設計,在英文中有許多相關的專業技術名詞,例如 Threading、Multithread、Concurrency、Parallel、Multicore 與 Multiprocessor 等等,在搜尋資料時可以嘗試不同的關鍵字,往往可以找到不少意料之外的好東西。而其中最常見的總括性簡稱,應該就是 Threading 了。

基礎定義

既然要學習 Threading 程式設計的知識,首先要瞭解的當然是 Threading 的基礎概念:

  • Thread:看看 Wikipedia 裡的定義,至少把最前頭那段 Thread 的基本定義,以及 Thread 與 Process 的不同之處搞懂。簡單來說,執行緒是用來執行電腦程式的執行環境;而多執行緒,就是能夠使程式系統同時執行多個不同程式碼區段的一種技術。
  • Thread Safety:雖然使用 Threading 技術能夠提升程式系統的執行效能,但伴隨而來的則是麻煩又難解的 Thread Safety 議題。大致上,我們可以使用 Re-entrancy、Mutual exclusion、Thread-local storage 以及 Atomic operations 這四種方法來達成安全使用多執行緒技術的目標。

Continue reading “快快樂樂學遊戲Threading程式設計”

登泰山而小天下:Boost C++ Libraries 初體驗

說來有些慚愧,一直以 C++ 語言做為謀生工具的我,在使用了多年的 C++ 程式語言之後,最近終於與聞名遐邇的開源專案 Boost C++ Libraries(簡稱為 Boost)進行了第一次的親密接觸。在本文裡,將參照 Boost 官網的「Getting Started on Windows」文章,於 Windows 作業系統以及 Visual Studio 2005 程式編譯器的環境下,詳細介紹安裝及建置 Boost 的步驟,並且在最後使用 Boost.Thread 函式庫做為測試範例。

從前就常聽到其他人談論著 Boost 的優點,但是只要知道其中由上千個標頭檔以及數十個函式庫所組成,而且還需要以繁複的步驟手動建立函式庫的 .lib 檔案,很容易就會使初學者望而卻步。對於用慣了程式整合開發環境以及現成函式庫的我來說,Boost 簡直就像是一座美麗動人但又戒備森嚴的堡壘般令人不敢輕易接近。多年以後的現在,總算是鼓起了勇氣重新面對 Boost。花了些時間閱讀文件,然後按照指示一步步完成安裝建置之後,發現原來這些步驟比起從前已經簡化許多,函式庫的使用也不如想像中的困難!

One of the reasons for boost’s success has been the cross-pollination of ideas between diverse library projects.

Boost 是由一群功能獨立的函式庫所組合而成的集合體,其中涵蓋了許多熱門而經常使用的函式庫,以及比較冷門的特殊功能作用函式庫。所有的函式庫都包含在名為 boost 的 namespace 中,不僅能夠使各函式庫維持一致的使用風格,同時也得以避免命名衝突的問題。如官網中的 FAQ 所述,Boost 的成功正是由於不同功能函式庫之間的「交叉授粉」(cross-pollination) 作用所致;雖然其中多數函式庫都能夠分開獨立使用,但正是由於函式庫之間相互支援的功能以及介面,才使得 Boost 的開發者社群與使用者社群能夠蓬勃發展且欣欣向榮。

Continue reading “登泰山而小天下:Boost C++ Libraries 初體驗”

初探Nintendo DS程式開發與設計(四):做個拼貼藝術大師

由之前一系列的三篇文章中,已經一步步地瞭解了如何在 NDS 平台上使用 Framebuffer 背景模式、Bitmap 背景模式,以及 Sprite 物件功能,接著本篇將再次深入與遊戲製作息息相關的背景顯示功能,介紹在真實的遊戲程式應用中,更加實用的圖塊背景 (Tiled Background) 模式

前情提要

由於硬體架構上的先天限制,在 NDS 平台中,沒有如同個人電腦平台上的全彩 (32 bits) 或高彩 (24 bits) 顯示模式可以使用;在這個小小的掌上世界中,所有的繪圖物件只能夠使用 16 bits、8 bits 或 4 bits 的色彩顯示模式。而如前篇文章的內容所提,Sprite 物件能夠使用 16 色 (4 bits) 與 256 色 (8 bits) 兩種模式,對於背景圖件來說亦然如此。在 Sprite 的功能中,可以選擇使用 OBJCOLOR_16 或 OBJCOLOR_256 這兩項色彩模式,而在背景圖件中,也有相對應於 16 色與 256 色模式的 BG_COLOR_16 與 BG_COLOR_256 定義。

瞭解了色彩模式的種類之後,就可以開始進入圖塊 (Tile) 的世界了。很久很久以前,在那個電腦記憶體仍然十分珍貴而稀少的年代裡,多數的家用遊樂器主機,都只配備著非常有限的記憶體容量。而對於掌上型主機來說,記憶體的限制則更為顯著。因此,我們無法使用多張高解析度的點陣圖 (Bitmap) 做為遊戲中的背景圖片,所以在 NDS 上存在著一種特別的繪圖顯示模式,能夠以一組相同大小的圖塊,拼貼組合成為完整的遊戲背景圖片。因此,遊戲開發者就可以利用類似磁磚拼貼的方式,由有限數量的小型圖塊,組合出變化多端的大型圖片。

Continue reading “初探Nintendo DS程式開發與設計(四):做個拼貼藝術大師”

初探Nintendo DS程式開發與設計(三):二維世界小精靈

延續前篇文章中所介紹的 Bitmap 背景圖件顯示功能後,本篇開始進入 2D 圖件 (Sprite) 的二維世界。所謂的 Sprite,原意是指「調皮搗蛋的小精靈」,但是在電腦繪圖與遊戲程式的領域中,Sprite 一詞則被用來當作二維繪圖物件的代名詞:

Sprite is the term used to describe a 2D graphics with a number of related functions.

nds-dev-sprite從前,在那個只有 X 軸與 Y 軸的平面世界中,Sprite 物件就是一切事物的根基,能夠用來表示角色人物、怪物敵人以及武器裝備等許多不同的遊戲物件。Sprite 可以只是一張單純的靜態圖片,也可以由數張圖片組合成為動畫的形式。簡單來講,Sprite 不過是一張可以移動與旋轉的 2D 貼圖罷了。

以 DirectX 為例,在 D3D 中已經包含了 Sprite 的物件功能,能夠使用 LPD3DXSPRITE 與 D3DXSprite() 輕易地創建出 Sprite 物件。即使目前許多平台上的遊戲,都已經趨向全 3D 型態的呈現方式,但是如果能夠應用得宜的話,傳統的 Sprite 物件繪圖模式仍然有很多的可能性存在。例如著名的線上遊戲《仙境傳說》,就是以 2D Sprite 人物,搭配 3D 型態場景的絕佳實例。

如果之前有接觸過 GBA 程式開發與設計知識的讀者,應該能夠很容易發現 NDS 平台與 GBA 平台的硬體架構與核心功能,其實擁有許多的相同之處。任天堂公司保留了原本設計良好的 GBA 架構,然後更進一步延伸,加入了 3D 繪圖、觸控操作、雙處理器引擎等等進階的硬體架構與功能。但是在 2D 繪圖的處理層面,仍然沿襲 GBA 平台的各種設定以及使用方法。而 Sprite 的許多定義與操作行為,也都是由 GBA 時代流傳下來的概念,因此在 NDS 平台上,Sprite 同樣佔了舉足輕重的關鍵地位。

Continue reading “初探Nintendo DS程式開發與設計(三):二維世界小精靈”

向食人魔怪說嗨:與OGRE的第一類接觸

OGRE最近花費了大把的時間,努力地學習如何與 OGRE 這隻聲名遠播的巨獸成為好麻吉。至目前為止,總算是能夠稱得上稍微和它混熟了一點。關於 OGRE,這裡提出幾點我的學習筆記、目前觀察到的個性特質,以及與它相處的心得感想。

首先,對於稍具經驗的程式設計者來說,見到 OGRE 的第一眼印象,應該莫過於各種設計模式 (Design Pattern) 的廣泛使用了。在 OGRE 的架構設計與系統實作層面中,使用了 Abstract FactoryFactory MethodSingletonIteratorObserver 以及 Manager 等等許多著名的設計模式。說實在的,我還是頭一次看到這麼多不同種類的設計模式,能夠同時應用在一個遊戲繪圖引擎之中,正好能夠與以前所學的理論知識相互印證,學習起來非常爽快也很感動,真是令我大開眼界、大呼過癮!

而其中,最顯而易見的設計模式就是 SingletonManager 的結合使用。OGRE 利用這兩項模式的組合,製造出了一位一位各有擅場的「專業經理人」,使各個子系統所負的權責,都能夠劃分的非常清楚仔細。另外,利用 Observer 的概念,讓使用者能夠繼承 FrameListener 類別,自行定義進行繪圖程序前後的相關處理程序,也是一個非常優秀的設計模式應用實例。

回想自己當初剛進入業界時,在沒有任何人使用這些設計模式的情況下,額外看了許多書籍網站的資料,最後終於利用 Singleton 與 Manager 模式實作出幾項遊戲專案的子系統組件。結果深入認識了 OGRE 以後,才發現原來這些觀念已經如此廣泛地運用在遊戲引擎的設計架構之中。正所謂「他山之石,可以攻錯」,對於程式設計者來說,吸收新知以及學習別人的長處,的確是十分關鍵而不可或缺的能力啊。

Continue reading “向食人魔怪說嗨:與OGRE的第一類接觸”

初探Nintendo DS程式開發與設計(二)

nds-dev-bitmap自從年代久遠的「初探Nintendo DS程式開發與設計(一)」問世以後,經過了漫長的兩個月等待,新的續篇終於不負眾望地(?)火熱出爐囉!這篇文章將進入 Nintendo DS 的內心世界,深入探索它在樸實外表下所隱藏的強大能力。然後,同樣地以一個簡單的範例介紹基礎的背景圖件顯示功能。

首先要瞭解的是 DS 的硬體架構。

DS 是一個擁有雙中央處理器 (CPU) 的系統,兩個處理器分別是 ARM 9 以及 ARM 7;ARM 9 是一個 32-bits 架構 66 MHhz 速度的處理器,而 ARM 7 是一個 32-bits 架構 33 MHhz 速度的處理器。DS 擁有 4 MB 的主記憶體容量,總計 656 KB 的顯示記憶體容量,以及數個大小不等的快取記憶體;詳細的內容配置,請參照這張 DS 的記憶體架構圖。除了核心架構以外,當然還有音效硬體、麥克風、觸控螢幕、主機按鍵、GBA 卡匣槽,以及 Wi-Fi 網路的支援能力。

不同於 PC 平台上動輒成千上百的記憶體容量,整個 DS 的主記憶體只有 4 MB 的大小,而相當重要的顯示記憶體更是只有 656 KB 的容量;因此,在 DS 上對於任何資源的配置行為,都需要精打細算地評估考量。ARM 9 與 ARM 7 都能夠自由存取主記憶體,而主記憶體通常會用來存放 ARM 9 所使用的遊戲執行檔,以及與遊戲相關的實體檔案。至於 ARM 7 的執行檔,雖然也能夠放在主記憶體中,但是為了效能上的考量,devkitPro 預設的行為會將執行檔放在快取記憶體 IWRAM 之中。另外,DS 的觸控螢幕輸入功能,是交由 ARM 7 所處理的;在 libnds 的預設執行檔中,ARM 7 會在每次主迴圈更新時,讀取觸控螢幕的相關資料,並且將這些資料存入 ARM 9 也能夠讀取的地方。

Continue reading “初探Nintendo DS程式開發與設計(二)”

多核多緒多樂趣

「多核心處理器有前途嗎?」幾年前,或許只是單純的疑問句,而到了今時今日,無庸置疑地已經成為了肯定句。

有沒有注意到,曾經每年都在急速成長的 CPU 處理速度,已經停留在 2 至 3G MHz 很久的一段時間了呢?在個人電腦的硬體配備中,已經由追求 CPU 的速度提升,轉向追求核心數量的增加。主流的 CPU 規格也逐漸由雙核心進步到四核心、六核心,甚至是未來的八核心中央處理器。「多核心」聽起來很酷,而這個所謂的多核心處理器的意義何在?

「Programming for Parallelism」中,共有 8 段配上中文字幕的影片,由 Intel 公司的 James Reinders 由淺至深地簡介了多核心硬體發展的必要性,以及相關程式應用技術的入門概念。其中在第一段的影片內容中,提到關於提升處理器時鐘頻率的作法,有幾項很關鍵的問題點:

  • 繼續往上提升處理器的時鐘頻率有什麼問題?功率是我們最常聽見的說法。提高處理器的時鐘頻率,對於執行速度的提升會越來越不明顯;也許性能提升了 13%,但是功率的卻多耗損了 73%。所以如果我們繼續提升處理器的時鐘頻率,一來電費不划算,二來使用 CPU 煎牛排再也不是夢想。
  • 另一個問題在於記憶體。過去幾年間,CPU 很快樂的以倍速飛快地成長著,然而在現實世界的硬體市場中,記憶體的時鐘頻率已經遠遠地跟不上處理器時鐘頻率的提升。就算處理器的動作再快,也得從記憶體拿取資料,並且將計算完畢的資料恭恭敬敬地交回給記憶體才行,所以在記憶體速度跟不上的情況下,處理器運算速度再快也只能空轉等待。
  • 還有一個問題點在於可平行處理的指令集。能夠進行平行處理的指令集,已經被開發利用得差不多了,接下來即使不斷提升處理器的速度,也不能保證得到更好更快的執行效能,而只是徒增更多 CPU 閒置發呆的時間。

Continue reading “多核多緒多樂趣”

初探Nintendo DS程式開發與設計(一)

Nintendo Dual Screen是的,你沒有看錯,本篇文章的主題是「NDS 程式設計」

由任天堂公司所開發的 Nintendo Dual Screen 攜帶型掌上遊樂器,前幾年甫一上市就席捲了全世界的遊戲市場,而在 NDS 平台上的程式設計與開發,也已經是行之有年並且十分活躍的社群活動。一開始是由 GBA 平台,開啟了業餘愛好者在 Console 平台上自製程式的可能性,接著在效能強大的 NDS 掌上型遊樂器問世之後,很快地就有幾位能力高強的程式設計者,開發出能夠製作 NDS 程式的函式庫與工具

我自己原來就非常喜歡玩 NDS 上的各種遊戲,在機緣巧合之下,最近剛好接觸到 NDS 程式開發的相關知識,覺得實在是非常新奇有趣又好玩!所以往後在這個新增的「學習筆記」分類中,我將會分享自己在學習過程中所獲得的一些心得與經驗;包括從門外漢一步步踏入這個新領域的過程中,所需建立的概念以及所需閱讀的文章,並且由淺入深地詳細解釋每個必要步驟,希望能夠對於有興趣學習 NDS 程式設計的讀者有一點幫助。如果其中內容有所錯誤或疏漏之處,也請不吝指正。

在搜尋引擎中,鍵入 NDS 程式開發或 NDS 程式設計的相關字句,立即就能夠找到許多相關於 NDS 程式開發的網站教學,然而,對於一個完全沒有 Console 平台程式寫作經驗的人來說,應該要從哪裡入門比較合適呢?在本篇文章中,將使用 libnds 函式庫與 devkitPro 開發工具,加上 PAlib 的環境設定為輔,在 Windows 平台下,初探 NDS 程式設計領域中 Frame Buffer 的使用以及 Input System 的操作,並提供完整的程式碼範例下載。

Continue reading “初探Nintendo DS程式開發與設計(一)”