天天看點

遊戲開發-技術

 一、核心程式設計   二、多媒體 三、網際網路   四、資料庫系統  

 首先,基本的資料結構、算法,資料流、線程、面向對象設計概念,模式等。

遊戲軟體本質上是一個實時軟體。玩家透過軟體,與機器或其它玩家互動。它需要眩目的聲光效果、流暢的使用者輸入、操作機制、網絡資源等,這些項目的實作,都是與硬體高度相依的。是以,在底層技術的開發上,熟悉作業系統和開發環境比程式設計語言更重要。

 某些基礎層次的技術,例如:遊戲ai常用的決策樹、有限狀态機、路徑搜尋等算法,2d遊戲使用的平面貼圖、矩陣、圖塊表、斜向視角、置換頁滾動條、調色盤、點畫、混色…等種種技術或特效,由于并不特别困難,且非常直覺;因而往往造成程式設計人員的錯覺,認為很容易就可以徹底掌握遊戲所有的底層技術。

對開發人員而言,并不需要完全通曉所有技術底層的來龍去脈;反而,了解遊戲軟體的基本架構,何種狀況何種需求下,應該使用哪些慣用技術,以及如何使用該技術,比技術的本身如何研發更為

遊戲軟體開發的方式,有經驗者通常會設計專屬的工具,例如:場景、劇本、角色、道具編輯器…等,再根據每個項目的特色,例如:戰鬥系統、階級系統、關卡系統、資源管理系統…等,做細部的修改、擴充、調整。(在網絡遊戲中,重要的運算工作,則會轉移到伺服器處理。)有時,為了彈性和靈活性,遊戲的運算規則,不會直接寫在程式代碼内,而是獨立出來,以scripting的方式控管。

将遊戲開發工具化,有兩個主要的好處:首先是便于程式設計人員、企劃人員、美術人員的分工和整合;此外,亦很重要的是,這種方式有助于量産。也因為如此,在遊戲界,主要的智慧資産通常不是程式設計人員,而是企劃人員。好的遊戲不僅是聲光效果出色,其内容的豐富性、創意、整體的平衡度都必須達到一定的水準。

遊戲軟體的設計,基本上相當符合面向對象/子產品化的精神;它将幾個主要的工具組合起來,每個項目、版本的更新調整,實際上拆解成每個工具各自的修正。是以,開發遊戲軟體最大的挑戰,不在于某一方面的技術,而在于 “如何用技術表達遊戲性的概念”,也就是如何将一個遊戲項目拆解成獨立的工具,再巧妙結合起來。

二、多媒體的部份 

 既然是遊戲軟體,前台的影音效果、操作界面、2d、3d成像技術,這些都是不可或缺的,甚至可以說這是遊戲軟體技術中最重要的一部份。底層技術方面,目前3d 的架構主流是directx和opengl/open inventor,前者是在windows上運作,後者是可跨平台的。    

3d技術不僅應用在遊戲界,它同時也是許多尖端工業、商業科技的關鍵技術。其基本原理,是将要顯示的畫面,以三角形頂點編碼成資料流,透過3d管線作業,決定可視區域、分辨率等級、幾何轉換及光源處理(trasnform & lighting; t&l)、材質、混色……的過程,最終成為顯示的象素。在現今的3d加速卡上,許多工作是由硬體來處理的;為了強化細部控制的彈性,近年來發展出一種可程式設計化的技術,也就是“着色語言”(shading language)。另一方面,基于遊戲      型态和内容的變化,亦發展出各種适用于封閉或開闊的場景、建築,角色單元、粒子系統、有機體的繪制、動畫…等特殊的算法和優化技術。此外,3d貼圖、陰影、特效,攝影技術莫不牽涉複雜的數學運算。      

相較于絕 大多數的商業應用軟體而言,遊戲所需的軟體技術是最廣泛最複雜的,光是要能夠使用遊戲引擎開發出完整的遊戲,就不是很容易的了。此處強調的重點是“術業有專攻”,遊戲公司本身不可能去研發所有必須的軟體技術,是以對遊戲制作人員而 言,不論是否自行研發,“知道怎麼運用現行技術做遊戲”比“知道怎麼開發底層技術”更重要。同樣用做餅的例子來說,當然,懂得磨面粉,甚至很會磨,這很好,絕對有幫助!但是,遊戲開發的技術關鍵在于 “怎麼做出好吃的餅”,而非 “怎麼磨出好的面粉”。                      

  三、網際網路的部份

網絡遊戲的開發當然不用去實作底層的tcp/ip,而是直接使用具有network功能的函數/類庫即可。根據遊戲型态的特性,當流暢性的需要較高,而安全性的顧慮相對下降時(例如動作類、射擊類、小規模的實時戰略遊戲等),有時也會應用到udp 。        

網絡遊戲server/client的基本運作方式是:運算由伺服器處理,用戶端發出訊息請求,接到伺服器響應(或收到其主動通知)後,作接口顯示的更新。為了處理網絡傳輸的延遲,在顯示上會利用種種平滑、預測的計算,求得較順暢的表現;更常見的做法則是把不重要的資料和運算,直接在前台處理,但這種設計可能會導緻不公正的結果。是以,如何在流暢性和安全/公平性之間取得平衡,也是在規劃時的一個不容輕忽的重點。

多人聯機網絡遊戲目前的瓶頸在網絡i/o的部份,因為網絡遊戲的聯機型态,和許多其它網絡應用服務,例如:ftp, web applications等不同,它的特性是高聯機數 (動辄數千上 萬)、高頻率、低流量。但i/o處理的部份,屬于作業系統層級,是以網絡實作的部份,往往和作業系統綁在一起,造成開發和移植的困難。 例如:在windows上最适合開發網絡遊戲的i/o模型是i/o completion port模型,在unix系列,則是asynchronous i/o模型;但目前在各平台上廣泛使用的socket api,并不直接支援對應的模型。當然,解決的方式有很多種,包括自行研發底層技術在内。(例如:筆者選擇的是使用ace 架構,它是一個成熟的跨平台的ipc架構,因而省去了許多麻煩。)

網絡遊戲本質上是一個分布式系統,這不僅僅針對伺服器/用戶端而言。為了要容納更多的玩家同時上線,在大規模的網絡遊戲中,伺服器不可能靠單一機器運作,采用多層(multitier)伺服器架構是必然的,是以在比較複雜的系統中也可能必須解決伺服器群組内的行程間同步問題。    

  四、資料庫系統的部份

最廣泛的還是關系型資料庫系統 (rdbms),如:oracle、ms-sql、mysql、postgresql 等。  資料庫系統存取的性能,在某些遊戲上也成為背景性能的瓶頸;這也是某些遊戲項目使用自行開發的資料庫的原因。因為資料庫系統并非專門為遊戲所設計,是以它的普通的blocking i/o方式比較不适合遊戲的需求,其每秒鐘的查詢操作/事務次數遠低于網絡 i/o動作的次數。不過,這個問題可以很容易透過軟體的技術解決,例如:使用thread pool 或異步的i/o模型存取資料庫,或者采用multitier 的伺服器架構,使用伺服器叢集等。另外,當in-memory database 的技術成熟之後,也可以降低此部份的開發難度。(32位機器的記憶體尋址隻到4gb,是以這個技術的普及應會在64 位的機器上)。比較理想的作法還是應該使用正式的資料庫系統,再配合軟體技術解決性能的問題。

遊戲程式員并不需要完全了解資料庫系統的每一部份,隻要知道如何與資料庫建立聯機、基本操作、資料表設計、索引建立、正規化、s q l 語言、交易或預儲程式等。總之,開發遊戲最重要的,是 “運用适當的工具”。

大多數遊戲軟體偏好使用的是 “成熟的技術”而非 “尖端的技術”。但對新的技術和觀念,還是應該抱持積極接觸、思考的态度,不一定要學會它,但至少了解新的技術和觀念,适合用來做什麼,可以怎樣運用。

技術以外:

不論你是否相信。當你在這個産業愈久,觀察的愈多,你會發現,在遊戲界,程式設計技術以外的“能力”,有時甚至比“技術”本身更重要! (其實絕大多數的工作本就如此,在遊戲界也不例外)最重要的一點,筆者認為,是團隊工作的配合度和能力。

 遊戲開發的工作,就像廚師,最終的目的是做出好吃的菜色(不是種菜也不是磨面粉),不是說技術不重要,它是根本。但不應把目光局限在技術上。一個遊戲成功的因素很多,少了任何一點 (包括運氣),就有可能會失敗。技術可以讓程式設計人員加分,但不要因為技術的加分,反而在其它方面産生扣分的負 作用。多觀摩成功者/産品的經驗,學習其中的思維觀點、設計規劃的理念、眼界和格局,将技術實踐為有價值、創新的産 品,才是成功之道。