某個3d遊戲的總體設計框架

方案
  1. 技術方案
  (1) 系統概要
  SI Engine是基於Direct9c和.Net體系結構的用於PC機實時圖形應用和遊戲的開發平臺。該平臺包括兩個主要部分。一是實時圖形應用的開發製作系統,一是支持實時圖形運行的虛擬機。SI Engine的設計以追求圖形應用的效果和效率爲主要的目標。以系統的通用性、開放性、易用性爲次要目標。力求做一個滿足製作高效的、逼真的實時圖形應用要求的通用的三維實時圖形開發平臺。

  兩部分系統的協同模式如下:
  開發製作系統通過製作者的交互編輯來定義實時圖形應用的交互腳本和資源文件,並將這些生成的腳本和資源彙總成遊戲和圖形應用的關卡文件。供虛擬機解析和調用。

  關卡文件是以命令數據流的形式組織的,關卡文件可以解析成一組時序的命令塊以及跟在命令塊後面的用於執行命令所需要的數據塊組成。

  虛擬機解析關卡文件,並執行關卡文件中的命令來完成建立圖形場景,建立交互界面,編譯交互腳本,啓動場景交互等工作。以生成並運行關卡文件中定義的圖形應用。如圖:

sfss

  關卡文件實際上描述一個遊戲的一個關卡。通常一個遊戲有很多的關卡。

  SI Engine是一個具有革命性的平臺,他的創新體現在繪圖上是優異的場景簡化和渲染管理體系結構、對新渲染算法的充分支持、以及可自擴展渲染算法的體系結構。體現在人工智能和物理特效上是其總結了遊戲中人工智能和物理運算的常用情況並提供了相應的API。體現在網絡上是提供了遊戲網絡服務的集羣負載平衡體系結構。體現在音頻和視頻上是其支持了空間音效、文語轉化、紋理視頻、視音頻即時通信。體現在通用性上是其跳出了遊戲引擎必須針對特定類型遊戲設計的框框使其應用範圍幾乎覆蓋目前所有類型的遊戲和實時圖形應用。體現在易用性上是其提出了敏捷的智能的可視化的設計遊戲軟件的概念並提供了可視化的製作平臺。體現在開放性上是其支持動態可擴展類的腳本體系結構允許通過腳本修改引擎的原始設計擴展引擎功能。

  (2) 引擎內核虛擬機體系結構
  SI Engine內核包括以下幾個部分:
  關卡解析
  線程管理
  對象管理
  腳本引擎
  界面交互
  圖形繪製
  物理運算
  音頻解碼
  視頻解碼
  人工智能
  網絡通信

  A. 關卡解析:
  負責從關卡文件中,獲取命令和數據。並執行命令和數據以創建遊戲場景。
  關卡解析的體系結構類似於一個自動機,自動機包括一個讀取頭用來讀取一次一個數據塊或命令塊。一個數據隊列保存讀取的數據塊和一個命令隊列保存讀取的命令塊。一個內部狀態機根據命令堆棧頂的命令塊中的命令代碼做內部的狀態轉換並執行命令。自動機的狀態圖如下:

sfdfdf
  B. 線程管理:
  負責運行線程、解析線程、網絡線程、繪圖線程,交互線程、音頻線程、視頻線程、用戶後臺線程的同步和管理。
  C. 對象管理:
  負責管理內存對象和資源。並用樹狀結構索引。以方便腳本對內存對象進行修改和調用。提供訪問,檢索,管理,對象和資源的函數和接口。
  D. 腳本引擎:
  是一個基於.Net運行時編譯技術的腳本解析系統。系統實現腳本的編譯和執行。腳本引擎接受用C#語言書寫的腳本。將其編譯成動態庫文件。爲了快速的執行腳本,已經編譯的腳本動態庫可以直接的載入並執行。
  E. 界面交互:
  界面交互系統由GUI交互系統,場景事件系統,物理事件系統,時鐘事件系統,硬件交互系統、活動響映系統、幀同步事件系統,音視頻事件系統,網絡事件系統,線程信號燈響應系統組成。

  其中GUI交互系統由大量的2D圖形控件和控件對於系統事件傳遞和處理的代碼組成。GUI系統從Windows消息循環中獲取消息,並將系統消息分發給特定圖形控件,調用由腳本定義的消息響應代碼處理消息來實現界面的交互。由於常規的Windows基於GDI的圖形控件在3D窗口中顯示和處理有效率和顯示錯誤的問題。所以系統用Direct3D的繪製技術仿照常規控件的響應方式和外觀重寫高速的基於3D圖形技術的控件。並定義一套控件結構以讓用戶可以自由的擴展控件功能和自定義控件。

  場景事件系統響應場景物體的鼠標拾取拖放、物體的碰撞檢測、物體位置的改變、攝相機改變事件。場景事件系統同場景相關,他根據場景待檢測事件表,來判斷需要檢測那些場景事件,和在什麼時候檢測場景事件。用戶可以通過交互腳本來添加和修改場景事件待檢測事件表。並設定在什麼時間或多少間隔幀檢測場景事件。

  物理事件系統同場景事件系統一樣,檢測設定的物理事件,如物理對象的速度改變,加速度改變,受力改變,動能改變,動量改變,質量改變,物理碰撞,物理屬性改變等等事件。

  時鐘事件系統處理系統時鐘事件。系統根據設定的事件時序表的設置在系統特定時刻發送特定的時間事件。
  硬件交互系統:處理非鼠標和鍵盤的硬件事件,如遊戲控制器事件,物理計算卡事件,3D眼鏡事件等等。
  活動響應系統負責管理自定義活動的響應。所謂活動是指的一個用戶定義的行爲和事件響應自動機線程,包括自定義的一組狀態,每個狀態要響應或發出什麼事件或發生某種對象數據操作,以及狀態之間的轉化條件和線程的停機條件。比如:用戶定義在用戶按下左鍵的時候從初始狀態激發活動線程x, 活動線程x讓角色A開始揮刀動畫,如果在動畫過程中發生刀和角色B的碰撞那麼,角色B執行痛苦動畫,角色B的生命力降低,向角色B發送受傷消息,活動線程x本次激發結束返回初試狀態。活動響應系統檢索自定義活動表,在特定事件激發下開啓特定活動的執行線程。
  幀同步事件響應系統負責響應繪圖系統在繪製特定序號或週期幀時候發出的事件。
  音視頻事件響應系統負責響應音頻和視頻系統的事件,如緩衝區中音視頻數據播放到特定位置,音視頻時間同步事件等等。
  網絡事件系統響應和處理網絡上接受到的事件。
  線程信號燈響應系統處理線程間的信號燈事件。

  F. 圖形繪製:
  圖形繪製是引擎的核心繫統。介於繪製高質量三維圖形場景所產生的:數據量大、數據吞吐頻繁、硬件資源佔用大、渲染算法複雜多樣。圖形繪製系統需要建立合理的渲染管理系統對場景數據進行合理而高效的規劃、管理、裁減。建立合理的內存管理機制以應付海量數據的調度和存儲。建立合理的設備分配機制對CPU,GPU等硬件設備進行合理的分配。也要求在保證質量的情況選用盡量高效的渲染算法。並需要針對渲染算法多樣性的特點解決各種渲染算法之間兼容性的難題,同時不同的渲染算法對於系統硬件的處理能力和功能的要求也各不相同,而且基於國內外用戶現實的硬件多樣性環境,要求系統能夠測試目標用戶平臺的功能配置並針對不同的平臺配置選用不同質量的渲染算法。並且開發圖形運用通常需要對系統進行多次的調試和有針對性的優化所以一個調試和基準測試工具也必不可少。
  基於以上需求,引擎圖形繪製系統的主要工作分爲:
  場景管理
  資源管理
  渲染管理
  動畫播放
  調試和基準測試幾個部分。

  1) 場景管理系統:
  場景管理是遊戲引擎圖形渲染的核心,他的目標是:在保證不明顯降低場景的顯示輸出質量的情況下儘量簡化場景物體的表示和他們的着色屬性以減小渲染場景的算法時間和空間複雜度,並同時減少繪製場景物體所佔用的設備資源和處理時間。

  衡量場景的顯示輸出質量通常需要一個基準,目前這個基準可以取未經簡化的場景的渲染輸出圖片同簡化了的場景的渲染輸出圖片之間的相素色差。表示爲:Delta(x,y)=Image未簡化場景(x,y)-Image簡化後場景(x,y)
而可以取對整個輸出圖象的每個像素差的平方和或絕對值和作爲衡量簡化算法對圖象質量影響程度的指標。表示爲
質量損失程度=∑|Delta(x,y)| 或質量損失程度=∑(Delta(x,y))^2爲了計算的簡化通常取前一個爲衡量標準。

  根據認知心理學的理論我們可以注意到對於輸出場景圖片,遊戲玩家的感興趣區域常常有一個集中區域。而對於玩家注意力集中區域外的場景輸出對玩家遊戲真實感的影響不是很大。所以這個指標可以用區域注意力影響函數修改爲:

  質量損失程度=∑|Delta(x,y)*w(x,y)| 其中w(x,y)爲輸出圖片中每個位置的精細程度對於玩家視覺感受的影響程度權值。我們可以推理在實際的顯示輸出情況下屏幕中心的顯示精細程度對玩家視覺感受的影響大於屏幕邊角的影響,所以w(x,y)可以通常可以視爲一個以圖象中心爲中心的2D高斯分佈函數。

  這樣經過對遊戲玩家體驗的實驗,如果我們可以確定在一定遊戲圖象質量的損失程度範圍內對遊戲玩家的心理影響不大,那麼我們可以以這個損失範圍爲基準選擇場景簡化算法。

  遊戲場景的有損簡化算法很多都基於上述的理論。其中有MIP貼圖算法、有損幾何壓縮算法、LOD算法,法線貼圖壓縮算法等等。
  同時我們還可以注意到一些遊戲場景的組成元素或場景物體,由於其處於可視範圍之外或被遮擋等原因對於最終的場景圖片的渲染沒有貢獻,可以被動態的剔除掉。而剔除掉這些對場景顯示沒有貢獻的場景元素可以加快渲染和繪製場景的速度。基於這樣理論的算法就是質量無損的場景簡化算法。這些算法通常有視域剪裁算法、閉合測試算法等等。所謂視域裁減算法就是要根據可視區域的位置和大小裁減掉不在可視區域內的物體的繪製。所謂閉合測試算法就是要根據場景元素和物體的遮擋關係,剔出被遮擋的場景元素的繪製。有一些裁減算法往往同時做了視域裁減和閉合測試,如門裁減所以這一類算法統稱爲裁減算法。

  還有一類場景簡化算法基於這樣的一個共識:顯示設備處理場景元素的不同排列方式和不同拓撲結構的效率不同以及顯示設備對於用不同數據大小表示的場景數據的處理速度不同。由此產生了一組算法,他們針對顯示設備的處理效率對場景元素的拓撲結構和排列順序進行優化。在保證於元場景同構的情況下加快場景的繪製。通常這類的算法有:無損幾何壓縮、二叉樹算法等等。

  衡量場景管理算法不能光依靠場景質量損失這樣一個指標,因爲場景簡化的目的是要加快實時渲染的效率,所以必須考慮其性能指標。
  任何場景管理算法都需要佔用一定的設備時間來完成場景簡化的任務,所以對最終渲染效率的影響除了與場景元素的簡化能力有關外還於場景管理算法的效率和頻繁程度有關。衡量場景算法的效率可以通過指標:
  場景管理效率=(未簡化場景的每幀圖形渲染時間)/(場景算法執行時間/調用場景簡化算法的平均幀間隔+簡化後場景的平均每幀圖形的渲染時間)

  只有在保證質量損失小於可以接受的損失範圍下並且場景管理效率大於1的場景簡化算法纔是有意義的。同時保證圖形質量情況下場景管理的效率要越大越好。

  同時由認知心理學可以知道只有當動畫的幀速率>=30幀/秒,動畫纔會被視爲連續的。這給出了場景簡化算法處理時間的底線也就是:
(場景算法執行時間/調用場景簡化算法的平均幀間隔+簡化後場景的平均每幀圖形的渲染時間)<=1/30秒
上面的理論爲SI引擎的場景管理指明瞭方向。

  借鑑很多第一人稱漫遊3D遊戲引擎我們可以知道:遊戲場景通常分爲室類場景、室外場景兩種情況。

  室內場景的特點是攝相機被包圍在一個個房間內(不光第一人稱遊戲很多第三人稱遊戲的室內場景也可以看做這樣的情況),房間於房間之間通過門窗來連通。在一個房間裏面的只有視線能穿過打開的門或窗纔可以看到其他房間裏面的場景物體。在這種情況下誕生了一種算法叫做門裁剪。

  門裁剪就是將室內場景看成由一個個封閉區域組成的,封閉區域與封閉區域之間通過門連通。如果攝相機在一個封閉區域(房間)內,首先根據攝象機的視錐體裁減掉不在視錐體範圍內的所有物體。然後用同攝相機所在封閉區域相連的門來裁減攝象機的視錐體排除掉該門相連的封閉區域內所有不同門裁減後視錐體相交的物體。然後繼續用裁減後的視錐體和新探測到的與門相連區域的門來繼續裁減視錐體直到沒有新的裁減視錐體產生。這樣經過裁剪後必然只有未被裁減的物體對屏幕圖象有貢獻。而被遮擋的物體和視覺區域外的物體都被裁減掉了,這大大的加快了室內場景的繪製。

  室外場景其實也可以分爲兩大類,一類是城市場景一類是野外場景。城市場景就是一些有很多房屋的場景,可以通過房屋的門窗看到房屋內部,並且沒有太大的地形起伏和植被。這樣的場景同室內場景的處理方法沒有太大的區別。可以將城市想象成一個大的房間,而這樣的大房間通過房屋的門窗同一些小房間相連接。本質方法還是採用門裁減,只是相對於室內場景而言,房間是一個個凸殼而城市場景本質上是一寫非凸的殼包裹的。

  野外場景通常有很多植被,地形的起伏變化很大,基本上沒有太多的遮擋發生,視覺區域也比較的廣闊。所以野外場景的繪製更多的是依靠質量有損的場景簡化算法。常用的是LOD(層次細節簡化),所謂LOD就是說對於場景中需要精細的部分用更多的面片來表示而不需要精細的部分用少量面片來近似。這可以剔除大量的場景面片。

  野外場景的算法有地形算法和植被算法、水面算法、大氣算法等等。

  地形算法的目的是要簡化地形的顯示。主要基於兩種原因一是繪製地形需要大量的面片,大量面片的渲染要佔用大量的處理時間,一是對於地表的特性不同需要大量的不同的貼圖,而貼圖要佔用大量的存儲空間。所以需要兩類方法來簡化。

  一類簡化地形渲染的面片數量,通常地形面片的簡化根據其對屏幕圖象質量的貢獻可以如下劃分,同攝相機距離遠的地形面片投影到屏幕上佔用的像素區域小隻需要少量的面片來表示。另外地形起伏小的區域,由於本身就沒有精細的變化可以用少量的面片來表示。這就產生了地形的LOD算法。通常地形的LOD算法有:二叉三角形樹、地形幾何貼圖、ROAM、塊LOD算法。

  一類簡化地形的貼圖,由於地形面片的數量巨大,而覆蓋的區域廣,其貼圖數量非常驚人,所以導致地形貼圖的空間複雜程度高。簡化地形貼圖就是要用少量貼圖來表現地形的地貌特點。通常的方法是爲每個地形面片賦予一個索引到地形貼圖的序號,大量的地形面片重複使用少量的地形貼圖,爲保證地形貼圖的連續性過度,不同貼圖面片相連的區域用紋理混合的方式把採樣到的不同的貼圖數據進行加權平均。爲保證地形貼圖的隨機性,可以採用生成貼圖的辦法通過幾個參數、幾個原始貼圖和隨機數來產生貼圖應用於不同的地形面片。

  地形植被的繪製同樣面臨面片數量巨大的難題,想象一下繪製草地,一個草地上有那麼多的草,即使每個草用少量的面片來表示也需要天文數字般的面片來表現,這在實時渲染裏面是不可能完成的任務。通常繪製草將運用一種類似於繪製毛髮的算法。就是在草地的地形面片的每個邊上生長出一個矩形面片(兩個三角形面片),然後將草的貼圖貼在該面片上,同時在地形面片上空分層覆蓋幾個面片,然後在面片上貼上草的分層截面貼圖。這可以讓繪製草成爲可能。另一方面草地的渲染也遵循LOD的規則,就是對於遠處的草地只用覆蓋在地形面片上的一個貼圖來表現,而近處的草地才用從地形面片的邊上垂直生長出面片並貼上貼圖和在地形面片上覆蓋多層草的分層截面貼圖的形式來表現。

  除了繪製草外,繪製樹也是一個難題,繪製樹不能應用繪製草的方法,因爲樹的體積比較大,同時樹葉的數量也非常的巨大,而且從各個方向觀察有不同的視覺效果。繪製樹需要運用告示牌的技術,告示牌就是一個面片上貼上一個貼圖。目前有一些運用告示牌的技術來表現樹的方法,一種方法就是直接在一個與人視線垂直的告示牌上渲染樹的貼圖,這種方法是最節省但最不精細的算法,通常當人的視線同地面的法線夾角很小的時候會看到樹被放倒了,一種叫正交IBR方法,就是產生一組以樹爲中心的平面族,每個平面上繪製樹在該平面方向上投影的貼圖。這種方法對於距離視點距離比較遠的樹能夠很好的表現但是當視點很近的時候,會感覺到明顯的失真,樹像幾張相互垂直的紙。但是其需要的面片數量很少只要幾個面片就可以表現一棵樹。另外一種算法是著名的Speed Tree算法就是樹的枝條用真實的面片網格來構建而枝條上附着的很多片樹葉用始終與人視線垂直的告示牌上渲染樹葉羣的貼圖來表現。這種方法可以很逼真的表現樹,即使視角垂直地面或者距離很近的情況下所表現的樹也非常真實,缺點是當視線方向頻繁變動的時候會感覺到樹葉的頻繁變動和失真。最高質量的算法就是完整的用三角形面片來表現樹和樹葉,但無疑這是非常消耗時間的。由於這些算法的優缺點SI Engine將採用多種方法來表現樹,選擇算法的依據是距離的遠近和樹本身的複雜程度。如果樹不復雜那麼對於距離非常近的樹木,如視點在樹冠下將採用樹的完全三角形繪製方法也就是不簡化,然後距離遠一點如距離視點有幾米的距離那麼採用Speed Tree算法,再遠一點那麼用LOD算法簡化樹幹的面片數量,距離在中等遠的程度如500米外採用正交方法,如果距離非常遠一公里外那麼採用一個告示排來表現樹。如果樹本身非常複雜那麼即使在樹冠下面那麼也採用Speed Tree算法。
  
  水面同地形一樣他是起伏的,並且他有隨時間變化的特點。但是他的起伏變化比地面變化平滑,沒有尖銳的棱角(巨浪除外)。同時水面是透明的他有反射和折射的特點。繪製水面的起伏通常只需要變化他的法線方向,讓他反射和折射的景物發生變化就可以產生很好的結果。所以SI Engine繪製水面採用如下的方法,一是對於一般的起伏平緩的水面可以直接用過程性的法線貼圖和函數生成的法線貼圖在繪製用一個平面表示的水面的着色過程中用變化的法線去擾動反射貼圖和折射貼圖就可以了。對於瀑布,巨浪等等的水面則需要針對性的構造多層的面片網格並用地形算法來根據距離遠近簡化面片表示,並在繪製過程中運用過程性貼圖和反射折射環境貼圖來渲染。還有就是水面排擊岸邊的效果可以用兩層水面和他們不同的過程貼圖來表現。

  野外的大氣效果如天空,陽光和雨,雲彩,可以通過構造一個天空包圍球並在上面進行過程性貼圖來實現,由於不出現場景簡化可以歸類於一般物體的渲染。

  爲了同室內處理部分的數據結構同構和處理室內和室外過度的情形,野外數據也被劃分到一個封閉區域中。他通過通向室內的門同室內場景相連。對於通過門看到的室內場景同樣使用門裁減方法。

  以上所說的只是根據場景特點採用的渲染簡化算法。遊戲中面對的場景並不僅僅只有以上所說的這些,還有很多的場景物體,他們相互遮擋,利用他們的遮擋關係還可以剔除掉一些場景物體。

  SI Engine將利用八叉樹來管理一個區域內的場景物體,通過八叉空間劃分樹來幫助場景裁減以提高裁減算法的效率。同時將採用硬件支持的閉合測試來剔除大部分被遮擋的場景物體。硬件支持的閉合測試就是:用物體層次包圍球和包圍盒來代替物體,進行嘗試性渲染,如果嘗試性渲染過程中沒有影響Z緩存的數據就說明物體是被已經繪製的物體所遮擋的可以剔除掉。否則就繪製物體本身。通過八叉樹的空間排序性我們可以按距離視點遠近和物體大小,先繪製近處的大物體,然後在繪製後續物體前先用物體的包圍盒進行上述的遮擋測試,如果測試通過就繪製物體否則就忽略掉物體的繪製。由於包圍盒的面片數量比較少,所以能夠很大的剔除掉被遮擋物體的繪製,而增加的測試代價可以忽略不計。

  同時場景數據的表示方法對於顯卡處理時間和顯存的消耗是不同的,比如一個三角形網格其中有很多共用的三角型頂點,那麼這些共用的頂點如果用三角形條帶和索引表來表示就只需要一個頂點數據和一個索引來表現,但是如果將網格分割爲一系列三角型的列表來表示則會出現很多重複的頂點索引,而如果不用索引方式來表示頂點,那麼就會額外的出現很多重複的頂點數據。所以加快圖形渲染的另一種方法就是進行幾何壓縮,把三角形網格中的三角形儘量的分配到少樹的幾個三角形條帶中。並用索引來表示三角形的頂點的數據在三角形頂點表中什麼位置。這個簡化過程不出現在實時調用的場景管理中而是在場景編輯器生成關卡文件前完成,SI Engine的場景管理實際上只管理已經經過預處理和幾何壓縮後的三角形數據。

  終上所訴,SI引擎採用下面的場景管理結構: 
sss

  備註:SI Engine不特定使用一種地形算法,因爲地形算法的實用領域各有不同,ROAM算法表現的地形較爲連續能保證地形質量,但是頻繁調用ROAM會失去高效性,所以對於中小地形場景比較適合ROAM算法。而塊LOD雖然地形的跳變比較明顯,但是比ROAM快速適合大型地形場景,可以使用於軍事防真和3DGIS等等圖形應用。爲了不失去遊戲引擎的通用性,SI Engine設計多種算法的地形類,根據設計者用途和設計特點在製作平臺中指定地形的採用那種算法,地形的算法類別信息傳遞到虛擬機中有虛擬機建立特定地形對象來進行地形場景管理。SI Engine具體實現ROAM地形類、塊LOD地形類、地形幾何MIP貼圖地形類。具體算法可以寫幾本書了故這裏不着描述。

  2) 資源管理系統:
  所謂資源管理就是要在系統需要時候合理的分配計算機系統中的硬件資源如內存、顯存等,處理系統對資源的爭用,以及在不需要時候合理的釋放硬件資源.而SI Engine遊戲虛擬機的資源管理主要是要處理好場景元素的頂點緩衝區、圖元緩衝區、紋理緩衝區在內存和顯存中的分配。將頻繁使用的緩衝區分配到顯存上,將不頻繁使用的緩衝區分配到內存上,在減少顯卡設備總線的數據傳輸的同時,保證系統高效和穩定的運行。

  SI Engine針對遊戲系統的特點以及結合Direct9c API對緩衝區管理的規定,將在場景元素對象上綁定場景元素需要使用到的緩衝區指針。而所有的緩衝區實行基於優先級的集中管理。最初系統爲場景圖元的每個元素的緩衝區設定一個初始的優先級別,在繪製一幀時,繪圖需要使用某個緩衝區的時候,將增加緩衝區優先級的讀數,相反如果在繪製一幀時緩衝區沒有被使用到將降低緩衝區優先級的讀數。當緩衝區優先級的讀數增長到一定數值時,並且緩衝區的大小小於規定數值時候,將按照優先級排序,選擇優先級靠前的緩衝區並根據緩衝區大小和顯存地佔用量把緩衝區直接分配到顯存上。被分配到顯存中的緩衝區如果在繪製一幀時候沒有被使用到,那麼將直接將緩衝區優先級降低很大一個數值,並遷移到內存中。長期沒有使用的分配到內存的緩衝區將被操作系統按自己的方式兌換到硬盤的分頁文件中。
SI Engine設計了一個資源管理對象來管理所有的資源,資源對象裏面保留了所有的緩衝區對象指針。在設備重啓、設備丟失、缺頁、緩衝區分配失敗等等事件發生時候,自動的更新緩衝區的分配和處理設備異常。

  3) 渲染管理系統:
  我們知道要將場景圖元送入顯示硬件並調用Direct9c接口進行繪製需要首先設定設備的狀態參數然後調用繪製函數進行圖元繪製。設備狀態參數包括設定變換矩陣、渲染目標緩衝區、深度和模版緩衝區、紋理、VS/PS程序等以及他們的協同控制參數和設備工作參數等等。而圖元繪製是在這些狀態參數的系統控制下,將頂點、圖元、紋理像素等送入設備按規定的設備設置和如下圖所示的順序進行處理。

  所有設備狀態參數和場景數據構成一個完全指導單步渲染過程的渲染作業。通常一個場景由很多的場景圖元和繪圖資源構成,而一個場景圖元由很多不同的組成部分構成,每個獨立的部分對應不同的繪圖資源,通常不能夠在有限的設備狀態和設備存儲中設定一個圖元的所有繪圖資源(比如目前設備的極限是在單步的繪圖中設定小於8個的紋理貼圖),並且一些渲染算法要求按順序的多次設定互斥的設備參數來繪製場景圖元的一個組成部分(如繪製透明體需要先設定透明度測試讓設備過濾所有的透明面片來首先繪製所有不透明面片,然後設定透明度測試過濾所有不透明面片,並設定顏色混合來繪製所有不透明面片。由於需要在兩個不同的設備狀態集上對同一組面片數據工作兩次所以必須分兩步完成)。這就使場景的繪製過程通常不是一個單步的渲染作業,而是一個按順序進行處理的渲染作業的工作隊列構成的一個渲染工作集。場景的渲染過程可抽象的表示爲:

jky
  由於很多情況下後續作業需要前面的作業提供一些產品數據添加到繪圖資源裏才能讓後續作業正確的完成,所以場景渲染工作集中的作業的前後相繼順序通常不能夠任意的改變。必須按規定的順序來完成,如果作業的處理順序被改變通常會讓場景的顯示失真和出現錯誤的結果。
在圖形系統裏,從單個圖元的角度來審視繪製過程可以發現,對於一個圖元的繪製,我們需要指定圖元顯示需要實現那些特效(有什麼形式的陰影,是否折射和反射等等)。而每一種特效需要讓設備按順序做那些渲染作業。通常實現同樣的特效對於不同的場景圖元在作業中設備狀態的設置和作業的順序上並沒有不同,只是針對不同的繪圖資源而已,實現一種特效的工作集中共同的作業順序和作業中設備狀態參數的設置就構成了固定的特效的渲染算法。對單個圖元而言我們只要告訴了它要使用那幾種特效算法,和每種算法的作業要用到他那些繪圖資源,它應該就知道了如何去表現自己的全部信息。

  但是從整個場景繪製的角度來看則不然。從單個圖元的每一個特效的算法中我們可以抽取出一個工作集這個工作集能夠正確的繪製一個圖元的一個效果。但是正如畫一幅水彩畫我們先畫樹還是先畫樹下的人,先用紅色畫還是先用黑色畫將得到不同的圖象一樣,多個圖元的繪製順序和不同特效的繪製順序將導致繪圖系統得到不同的圖象。所以在繪製整個場景的過程中必須將從繪製單個圖元的工作集中的作業拉出來進行正確的排序和組合才能構成繪製場景的正確的工作集。另外由於頻繁的設置設備參數和裝卸繪圖資源更加的耗費設備的處理時間,所以對於能得到同樣繪圖結果的兩個不同組合的工作集其效率也是不同的。

  如何實現不同渲染算法的工作集的優化組合在保證正確渲染出場景的情況下能夠讓渲染得幀速率最優就是渲染管理的目標.優化渲染得效率的方法只有一種有效的途徑就是沒有前後相互關係的渲染作業按資源聚合。以減少資源到顯示處理設備的頻繁調度。

  在SI Engine中渲染管理按如下的方式實現:系統實現渲染器類.由渲染器類來集中管理渲染工作集或實現某種渲染算法的單步渲染作業。並保存渲染算法中和不同渲染算法間的渲染作業的前後相繼邏輯。從這一點看這有別於其他的遊戲引擎。其他的遊戲引擎通常渲染的過程是固定的,它抽取出有限的幾種特效的渲染算法,並將他們排列成一固定的工作過程。按固定的路線來渲染場景特效。而SI Engine的渲染體系結構在支持固定的渲染算法的情況下還允許添加自定義的渲染算法,以及允許優化渲染過程以提供靈活性和高效性。

  渲染器基類的體系結構如圖:
dfhg

  一個渲染器對象包括了一個渲染作業或一個渲染工作集的全部信息。在渲染器類的框架下,我們就可以實現智能的渲染作業排序和調度了。我們實現渲染排序基於以下的邏輯。

  首先如果根渲染器類別是人自定義了渲染作業順序的渲染器,那麼該渲染器中子渲染器的順序不能改變,也就是處理人自定義固定的渲染過程的情況,不需要實現渲染器排序了。

  如果不是人自定義的固定渲染器那麼如果A渲染器的產品是B渲染器的資源,那麼A必須先於B處理也就是A必須排在B前。這是最上層的邏輯。

  然後如果A渲染器的產品和B渲染器的產品存在重合,也就是AB渲染器影響相同的目標表面或資源那麼AB渲染器的順序按渲染器對象中的前置渲染器類別規定的先後順序進行排序。

  在做了前兩種渲染器排序後,對渲染器中的資源表進行歸併。使資源表中不出現重複的資源。

  然後對於以上排序中沒有決定先後次序的渲染器按資源進行排序。也就是如果A和B沒有渲染邏輯上的前後關係、A渲染器的有資源a、b、c而B渲染器有資源a、d、c、那麼將A渲染器的資源排列成b、a、c資源B排成a、c、b並讓處理A渲染器後直接處理渲染器B可以看到由於處理的資源在相鄰渲染器中排列順序鄰近所以在A渲染器工作後B渲染器不再需要調入a、c資源可以大大的節省資源調度的時間。資源排序就按照這種邏輯進行。

  作完資源排序後還可以按照把連資源也沒有前後相繼關係的渲染器按照狀態參數設置表進行聚類。也就是狀態參數設置相近的的渲染器集中到一起。這樣可以節省渲染狀態設置的時間和頻度。(其實資源排序和狀態參數設置排序都是節約處理時間的手段,只是考慮遊戲場景的資源通常都是少數的幾種在不同渲染器中重複現象比較多而資源調度更加消耗時間所以將資源排序放在渲染狀態參數排序前通常能夠更加有效的節約時間)

  SI Engine的是一個可擴展渲染算法的引擎,在製作平臺中將設計專用的自定義渲染器編輯器來添加特定渲染算法的渲染器和渲染器集合。自定義的渲染器隨工程文件中腳本傳遞給虛擬機,以添加虛擬機的渲染特效。同時由於設備的支持能力不一樣,有些高端設備能夠支持質量很高的渲染特效,而低端設備只能支持質量較低的渲染特效。所以在製作平臺中會爲場景物體指定幾個不同的渲染特效配置,場景物體對象信息中有一個包括若干個渲染配置對象的列表,每個渲染配置對象指定一組設備能力要求信息和一組渲染器列表構成的渲染工作集合。這些信息傳遞給虛擬機後,虛擬機檢測設備配置根據設備能力選擇設備能夠支持的的渲染配置,並從這些渲染配置的渲染器集合中獲取渲染工作集。而具體選擇哪個渲染配置來渲染場景物體,取決於遊戲玩家的配置文件。通常用引擎開發出的遊戲出廠時候指定最低配置作爲玩家的默認配置以保證遊戲能夠順利的執行。遊戲配置文件記錄了幾種相似的特效算法的描述(也就是遊戲設計者給場景物體的一組渲染器指定的類別名稱)如果讓一個場景物體選擇時優先應該採用的一個。遊戲虛擬機加載關卡文件和渲染配置文件因爲設備能力不支持失敗後,恢復上一次的默認設置,並按默認設置加載。

  SI Engine的製作平臺除了能夠編輯自定義的渲染器外,還允許利用渲染流程編輯器進行渲染流程的自定義,渲染流程編輯器允許編輯生成的或新建立的渲染工作集。改變渲染工作集合中作業的處理順序或者在渲染工作集中添加或刪除渲染作業的渲染器。指定那些設備能力配置下使用那種渲染流程。渲染流程編輯器修改後的渲染工作集被作爲最終的渲染工作集傳遞給虛擬機用於管理渲染的過程。

  注意:從渲染器的結構我們可以知道渲染器可以包括順序的子渲染器件,也就是說,最終的渲染工作集可以被一個根渲染器通過多層的樹狀結構來體現,而渲染的順序是在根渲染器表現渲染樹中採取先根遍歷的方式得到的順序。

  SI Engine 默認渲染流程採用如下的渲染器樹實現(有些渲染器由於處理器速度限制在遊戲設計中默認被參數屏蔽掉,可以根據需要打開,圖中蘭色包圍的部分被默認屏蔽掉,直接將其下層渲染器按順序掛接到其上層渲染器,並且如果下層指向相同的渲染器時候,相同的將不被重複處理)



  4) 動畫播放系統:

  3D遊戲引擎中動畫播放的實質實際上是在在特定時刻改變場景物體變換矩陣、改變VS/PS中參數以及改變紋理和材質實現的。
  具體可劃分爲:場景圖元動畫、攝像機動畫、紋理材質動畫。

  紋理和材質動畫是按時間改變一個場景物體面片上紋理和材質實現的。如過程性紋理、視頻紋理和時變紋理。對於紋理材質動畫我們可以給場景物體賦予多列紋理和材質隊列或建立一個視頻紋理,在開啓某個動畫時指定某個文理材質隊列爲活動的隊列,探測時間事件,並在時刻到來時候移動活動紋理材質隊列中的當前指針,讓指針所指向的紋理和材質作爲當前紋理材質或根據具體時刻在當前紋理材質和隊列中下一個紋理材質間混合。具體方法取決於渲染器的設計。

  攝像機動畫是在移動攝像機的情況下對場景的投影矩陣和視區變換矩陣進行改變引起的動畫。通常交互式改變攝像機的時候就會發生該動畫,這時候不需要進行額外的處理,只要保證攝像機類的參數同這些矩陣同步就行了。如果在某個時刻需要由系統根據具體路線而不是玩家控制來時變的改變攝像機位置方向,這個時候讓攝像機處理時間事件,並根據時間來設置其參數就可以實現這種情況下的動畫。

  場景圖元動畫是場景圖元的位置和方向的改變引起的動畫。通常分爲:變形動畫、骨骼動畫、變換動畫、替換動畫。
  變形動畫是場景物體的頂點按固定的軌跡變化位置和法線方向產生的。這種動畫要求場景物體記錄頂點的多個位置和法線方向,在動畫開始後頂點的位置和法線方向根據時刻在兩個相鄰位置數據和法線數據間插值得到。這可以通過特定的VS程序實現。

  變換動畫是按時間改變場景物體的變化矩陣實現。可以爲場景物體的指定一組(物體只有一種動作)或多組世界(物體有多種動畫)矩陣。在開啓某個動畫的時候指定一組矩陣活動,並根據時間事件在活動的一組矩陣中的兩個相鄰矩陣中插值來決定當前時刻的世界矩陣,通過這種方式實現動畫。

  骨骼動畫是變換動畫的一種進化形式。實現骨骼動畫的場景物體由皮膚和骨骼組成。皮膚就是面片網格,而骨骼對應於面片頂點的世界變換矩陣。一個頂點可以有多個世界矩形,頂點的位置由多個世界矩陣變換出的多個頂點位置來根據各個矩陣影響頂點位置的權重來插值得到。這種動畫的好處是對於動物等等由皮膚和關節構成的物體,關節轉動時候,由於關節兩邊的皮膚由於位置不同需要用兩個矩陣來分別變換,但是如果用傳統變換動畫的話關節處的皮膚會出現斷裂。爲了防止斷裂,關節處皮膚的頂點應該根據兩個矩陣變換出的位置插值得到。SI Engine設計一個骨骼動畫場景物體對象來表示存在骨骼動畫的場景物體,該對象存儲一個面片表和多個變換矩陣,以及面片上頂點在各個矩陣中的權重。用特定渲染器的VS根據矩陣和權重來渲染場景物體。在動畫發生是後,骨骼動畫對象的一個或多個世界變換矩陣隨着時間事件發生改變。渲染出的物體就產生了動畫。

  替換動畫要求場景物體對象存儲一個對象的不同網格表示,在動畫發生後,隨時間事件渲染不同的網格來顯示場景物體,就實現了替換動畫。由於這種動畫相鄰變化的差異比較大,爲了動畫的連續性,可以在渲染兩個不同表示之間插入一些中間幀,中間幀採用兩個表示的渲染結果進行顏色混合得到。就可以提高這種動畫的連續性。

  5) 調試和基準測試系統:
  基準測試系統利用Direct9c的功能,允許程序獲取或輸出當前的顯示幀速率、設備處理的每一階段的數據吞吐率、每一階段的設備處理延遲、算法的處理時間、硬件的支持能力、顯存和內存的佔用率等等數據。用於尋找到系統瓶頸以便修改場景圖元的屬性和改變渲染的算法。調試系統則允許用一組控制檯命令來在圖形渲染得每一個環節插入斷點,跟蹤設備事件。以及察看系統數據的變化和設備狀態等。

  G. 物理運算:
  SI Engine的物理運算主要是爲場景物體對象規定對應的虛擬物理對象,並在虛擬物理對象中管理場景物體的物理力學屬性如:位置矢量,受力矢量、動能矢量、動量矢量等等。並設計虛擬的力場物理對象如:重力場對象、阻力場對象等等。所有的虛擬物體對象都抽象爲質點。根據力學計算虛擬物理對象物理屬性。同時設計一系列的探測器對象來檢測虛擬物理對象的物理屬性改變,並引發物理事件調用該事件的處理腳本來處理(物理事件的處理腳本是用戶設計遊戲時候加入的,通常可以根據改變的物理屬性來設置場景物體的位置)。同時物理運算部分還設計碰撞檢測器對象來探測場景物體的碰撞併發送碰撞事件,調用場景物體碰撞處理腳本。碰撞檢測器對象利用場景管理中的八叉樹來進行碰撞檢測,這可以節約大量的檢測處理時間。

  H. 音頻播放:
  SI Engine的音頻部分主要是利用Direct Sound的API來實現音頻的解碼和播放。音頻播放主要是要作到:波形數據緩衝區的分配和管理、音頻事件的處理、音響的特效。在三維場景中的音頻問題不單是簡單的播放音樂和音頻,還應該考慮到聲音的空間效應,也就是說音效受發聲源的空間位置,音響的傳播方向,音響的傳播距離,音響的音響範圍等屬性影響。並且音響還有多普勒、衰減等效應。Direct Sound提供了這些效應的API。

  SI Engine的音頻部分將音頻分成了幾種形式:
  1) 無空間屬性的波形音頻:這種音頻用普通音頻類產生的對象來管理,普通音頻類負責加載一組音頻波形數據,並分配音頻緩衝區以及在播放函數被調用時候播放音頻數據。音頻數據通常存在於文件流中,加載數據不能夠一次性的加載流中的全部數據,而是隻預加載一部分,在播放開始後一邊播放一邊從流中加載音頻數據。多個音頻對象可以共用一個流,所以普通音頻對象要保留其在流中的起止位置。

  2) 無空間屬性的背景音樂:這種音頻用普通音樂對象來管理,音樂音頻區別于波形音頻的是他是記錄的樂曲是音符的組合,多數用的是MIDI格式,系統用波表設備或軟波表來播放音樂。同樣普通音樂對象,需要管理音頻緩衝區,需要在播放時候預讀音樂數據。

  3) 無空間屬性的音樂和波形音頻同步複合音頻:這種音頻就是像歌曲一樣既有用音符表現的音樂又有語音的波形數據,並且還必須在兩種數據間同步。用一般音樂音頻同步對象來管理。一般音頻音樂同步對象分配波形音頻緩衝區、音樂緩衝區和同步點表,處理音頻和音樂間的同步播放和流的同步讀取。

  4) 空間音頻(由於Direct Sound的功能限制不支持空間的音樂,所以空間的音樂也利用軟波表中的音符波形數據將音樂也轉化爲波形音頻處理):這種音頻數據用空間音頻對象管理,空間音頻對象除了實現普通波形音頻的播放外,還指定音頻的位置,方向,範圍,衰減係數等等空間屬性,利用Direct Sound的空間音頻功能實現播放。同時由於音頻的空間屬性,需要在攝像機位置改變後裁減空間音頻對象,在開始對象的音頻播放時候只播放空間音頻影響範圍包含攝像機位置的音頻數據。

  5) 文語轉換音頻(Text To Speech):文語轉換是通過MS的TTS引擎,將輸入的文字轉換爲語音。這可以提供給遊戲設計者用於實現遊戲對白,但這種方式比直接的音頻節約存儲。SI Engine通過一個TTS類封裝了MS的TTS引擎調用。甚至SI Engine的TTS類提供了一個發音到嘴形輸出的API可以用於驅動玩家對話動畫.

  I. 視頻播放:
  SI Engine的遊戲虛擬機是工作在三維圖形模式下的,所以視頻的播放表面是在場景三角形面片的紋理表面上。SI Engine不設計視頻解碼部分的函數,而是直接利用DirectShow的功能根據視頻文件屬性來自動組裝的Filter Graph來解碼視頻文件流。只是Filter Graph的Render Filter是一個將解碼後的圖象數據渲染到紋理表面的Filter.所以設計視頻紋理類來管理視頻播放。當視頻播放開始後,沒有被場景資源管理掛起視頻紋理類隨時間消息將視頻文件流中的數據解碼到紋理對象的表面上。如果視頻紋理是場景可見區域外的某個物體上的紋理,那麼由於該場景物體長期被裁減掉,其資源的優先級別比較低所以有很大的可能性紋理資源會被掛起這個時候視頻紋理類就不會調用視頻解碼功能空耗處理時間了。但是由於SI Engine爲保證遊戲的連續性,它的資源管理並不確保不在場景可見區域外的紋理都是被掛起的,所以遊戲視頻雖然在場景可見區域外但是同場景可見區域接近,時不時因爲攝像機位置的改變會被場景使用,這個時候存在着不在場景內的視頻紋理同樣被解碼到紋理表面的情況。這種情況在考慮遊戲連續性的情況下無可避免。視頻紋理類不單可以用於場景物體表面貼圖還可以用於GUI系統中的特定視頻控件中以用於遊戲片頭視頻的播放。

  爲保證遊戲中玩家間即時視頻通信的實現,SI Engine提供一對控件。一個控件利用DirectShow功能將綁定到攝像頭的圖象採集Filter作爲源Filter,壓縮視頻到MPEG4網絡傳輸格式的Filter作爲視頻變換Filter一個將數據發送到點到點目的通信端的Filter作爲Render Filter以實現玩家視頻的採集和發送。另一個控件將接受網絡視頻數據的Filter作爲源Filter,網絡MPEG4流解碼Filter作爲變換Filter而渲染到紋理的Filter作爲目的Filter,並將渲染到紋理Filter的目標紋理繪製到一個2D GUI控件上。實現玩家即時通信視頻的接收控件。這一對控件供遊戲設計者選用製作遊戲中的視頻通信。

  J. 人工智能:
  由於遊戲的人工智能非常複雜和多樣,SI Engine不可能設計出支持所有類型的遊戲的人工智能製作器件,人工智能對於遊戲開發者而言還是需要在腳本中去定義,但爲了節約開發人工智能的複雜度,SI Engine的人工智能部分爲遊戲開發者提供人工智能的一些常用函數、類和接口的API,供開發者編輯事件處理腳本的時候調用。

  人工智能部分設計如下的幾種人工智能API:
   反應式推理API:是由用戶根據SI Engine的產生式腳本的書寫規則,定義用字符串表示的產生式列表,輸入到反應式推理類裏面,在給定條件列表時候利用該推理類檢測是否有規定結果的推論產生。

  狀態機API:包括確定性狀態機和非確定性狀態機,用戶可以利用製作平臺的狀態機產生器,通過繪圖自動生成狀態機類的腳本。用於在用戶自定義的事件處理腳本中調用。用戶調用狀態機類,需要用戶向狀態機對象輸入一組狀態機能識別的條件字符串用於驅動狀態機改變,狀態機輸出當前的狀態。

  感知器和BP神經網絡API:用戶可以在通過在製作平臺的神經網絡定義器裏面繪製神經網絡和接點初試權值,並用一組輸入向量到一組輸出向量來訓練該神經網。並生成神經網絡類的腳本,用戶在事件處理腳本中可以調用神經網絡對象通過輸入一組參數向量來獲得結果向量。並根據結果向量來通過邏輯判斷來執行一些行爲,用戶腳本可根據行爲的結果來測量是否被誤判斷,並推測該輸入向量實際應該有什麼輸出向量,然後將該推測輸入到原始神經網絡來持續訓練該神經網絡對象。以支持遊戲智能的自適應學習。

  模糊推理API:同反應式一樣的處理過程,知識推理過程利用模糊邏輯。而規則用模糊邏輯的形式書寫。

  A*尋路算法API:這是遊戲中最常用的人工智能,A*尋路算法類保留一份圖象作爲路徑判斷的依據,最優通路表現爲圖象上的黑色區域,而障礙表現爲圖象上的白色區域,而黑色到白色間的灰度表示的區域的顏色代表不採用該路徑的權值,白色就是絕對不採用的路徑點,黑色就是儘量採用的路徑點,該圖象上每一個2D點同3D空間中的3D座標有一定的對應規則。該規則由用戶自己的腳本定義。A*尋路算法類,只是用於輸入一個源2D點和一個目標2D點。A*類輸出一個2D點序列表示來源點到目標點的建議路徑,該建議路徑儘量的用A*算法來滿足路徑上每個點的權值的和最小。

  K. 網絡通信:
  SI Engine爲滿足網絡遊戲的需求,提供了一套自己的網絡通信基礎結構。
  分析網絡遊戲的通信需求,可以發現遊戲對於網絡通信的要求是:高速、低延遲、大客戶量。對於通信的安全性,遊戲並沒有特表高的要求,但是存在有一些網絡遊戲出於對遊戲公平性考慮和保護玩家權益要求網絡遊戲平臺能夠提供對玩家關鍵性隱私數據的安全性保護(反盜用)和防止不合理的客戶端對服務器的數據欺騙(反外掛)但是這很難就通用引擎中設計出來只能夠在具體遊戲中利用腳本具體設計。對於遊戲通信的穩定性要求也不太高,不需要保證每個客戶通信穩定,只需要單個或有限的客戶端的斷線和錯誤不影響到所有的玩家,並能夠保證出錯的客互端能從新登陸加入遊戲。同時網絡遊戲的通信量比較大,需要較大的服務帶寬。同時一個遊戲引擎的網絡通信部分,如果要設計,必然應該設計成同具體遊戲類別無關的。

  SI Engine的網絡通信實現如下的功能:
  客戶端管理:負責玩家的客戶端登陸,登陸服務器的客戶端,服務器記錄其IP地址和路由信息,用玩家用戶名來標識。所有服務器到該客戶端的信息發送或其他客戶向該客戶的信息發送都通過用戶名來表示目的地址。而客戶登陸的具體IP地址對用戶透明。

  網絡數據對象同步和訪問:負責服務器維護的網絡對象和客戶端的網絡對象代理的數據同步和客戶端對網絡對象的數據更新發布和客戶端對網絡對象的函數接口調用。SI Engine中的所有數據對象的類都派生於網絡對象類,並且網絡對象類如果屬性指明是需要服務器進行數據同步的,那麼服務器將保證每個客戶端看到的該網絡對象的數據是相同的。這是SI Engine實現遊戲網絡通信的主要形式。通過網絡對象的數據同步,任何客戶在遊戲中對遠程對象的數據修改都能夠反映給其他客戶,從而實現了遊戲的網絡交互。同時由於客戶端訪問網絡對象實際上是直接從網絡對象的本地代理對象上獲取屬性數據和調用成員函數,所以網絡對象對開發者而言實際上是透明的,他可以在腳本中像操縱本地對象一樣的去操作網絡對象,不必要關心數據同步的機制和具體網絡協議,減小了網絡遊戲開發的難度,開發者甚至根本不需要去編寫一行網絡代碼就可以實現一個網絡遊戲,只是在製作平臺中將一些數據對象指定爲需要同步就行了。這個機制可以通過.NET Remoting技術很好的實現。
  資源下載更新:在用SI Engine設計的遊戲中,資源管理在關卡準備階段加載資源,如果發現資源不存在於本地,那麼就向連接的服務器下栽該資源。資源下栽的過程是通過P2P方式來進行的,以節約服務器貸款。SI Engine在資源管理類裏面實現了該網絡機制。把服務器上游戲的資源文件夾和本地的資源文件夾通過資源管理的API透明的合併成一個虛擬的文件系統,就象一些原代碼管理機制一樣,如果遊戲在本地的資源文件同服務器上同名資源文件不一致就自動啓動資源同步機制保持客戶端遊戲用到的資源文件是服務器上最新的資源文件。這利於實現網絡遊戲的媒體化經營,可以讓服務器通過修改和增加資源的形式來擴展網絡遊戲的場景和關卡。並且資源的下載過程對設計者而言還是透明的。並且P2P方式的資源下載節約了對服務器帶寬的佔用。
  
  信息收發和傳遞:SI Engine提供服務器與客戶之間,以及客戶與客戶之間的消息收發API,用於開發者在腳本中定義自己的網絡通信。同Socket不同的是這些API封裝了服務器和客戶具體的網絡地址。用用戶名和服務器名來表示手法的來源和目的地址。消息收發有兩種形式一種是連接(基於TCP),一種是非連接的(基於UDP).

  客戶間即時通信:SI Engine提供客戶間的即時通信控件(包括文字、圖片、視頻、語音通信),來設計遊戲中的玩家交流平臺。
  
  數據庫訪問服務:SI Engine提供給爲保證通信的高效率,SI Engine的網絡服務基於集羣服務和負載平衡的思想來設計。在服務器端,服務可以分爲:

  門戶登陸服務:門戶登陸服務,是客戶端登陸游戲服務器統一入口,因爲玩家不可能知道所有的節點服務的拓撲和地址信息,只能通過登陸一個統一地址的門戶服務來進入遊戲,而門戶服務在登陸過程中負責記錄登陸客戶的用戶名和從節點數據庫檢索服務中獲取用戶的信息。並通過負載平衡機制,和根據玩家所在的當前關卡信息,分配不繁忙的關卡服務器來負責管理客戶在當前關卡的遠程對象數據同步和遠程對象接口調用請求。分配了節點服務後,玩家客戶端同服務器的通信轉向分配的節點關卡遠程對象同步服務。門戶登陸服務還維護登陸客戶和所有節點服務的地址信息,用於客戶間和客戶到服務器間的消息傳送。

  節點服務分配服務:負責節點服務的建立和分配。所有的具體服務器設備都必須安裝節點服務分配服務。以便於門戶服務在這些服務器設備上建立某種節點服務。

   節點關卡遠程對象數據同步服務:節點關卡遠程對象數據同步負責一個關卡的網絡對象的數據同步,保證登陸到該關卡的客戶的客戶端訪問網絡數據對象的數據時候訪問到同樣的數據。並執行客戶請求的網絡對象的成員函數。不光如此,由於網絡遊戲的玩家的大規模性,對於一個關卡用一個節點服務來維護數據同步有時候是不效率的,因爲有些關卡的玩家數量很大,所以同一個關卡也可以通過分配多個節點服務器來服務,只是關卡維護的網絡數據對象和玩家連接,根據玩家更新和訪問網絡對象數據的頻繁程度被分割到不同的節點服務器上,每個節點服務器維護不同的網絡數據對象和玩家連接,通過節點服務器間的數據同步來保證同一個關卡的網絡數據對象在不同節點服務器上同步。當然這不是最優的做法,因爲多個同一關卡的節點服務器間的通信也需要耗費大量的內部帶寬和處理時間。保證服務效能的有效做法是,遊戲設計者,儘量的分割網絡遊戲的關卡,並規定每個關卡的最大進入人數。這樣SI Engine的數據同步服務的自動機制就能夠很好的保證數據同步。另外節點關卡遠程對象數據同步服務所維護的網絡對象有兩種形式:一種是GET形式的,也就是客戶端訪問該對象數據的時候,通過網絡對象代理從網絡上獲取網絡對象數據。另一種是PUT形式的,也就是玩家從本地的網絡對象鏡像上獲取數據,不通過網絡。但是玩家修改網絡對象數據的時候通過網絡通信修改服務器上的網絡對象數據並將該對象數據的修改傳送給所有保留了該數據對象副本鏡像的客戶端,讓這些客戶端修改該網絡對象在本地的鏡像對象數據。這兩種形式的網絡對象的數據同步對帶寬的佔用情況是不同的,GET模式適合於頻繁修改數據但不常讀數據的對象。而PUT模式適合於頻繁讀數據而不常改數據的對象。在遊戲設計中使用製作平臺用佈局場景或對象屬性修改或腳本建立網絡對象時候遊戲設計師需要根據實際情況和經驗設置這兩種同步模式。

   節點資源下載服務:負責客戶端向服務器下載資源的網絡通信。通常在客戶端發出資源下載請求時候,門戶服務器根據客戶端的資源請求表分配一組接點資源下載服務給客戶端。每個節點服務負責資源文件的一部分的下載。節點資源服務可以存在於其他在線玩家的客戶端機器上用於從該玩家客戶機上下載該玩家擁有的資源文件,以減少服務器端帶寬。

  節點數據庫檢索服務:遊戲服務器的數據庫主要是用於存儲玩家保存的信息。玩家保存的信息由於沒有太大的相關性可以分佈式儲到不同的數據庫服務器上,以加快訪問數據庫的速度。SI Engine爲開發者提供訪問和培植節點數據庫服務的API,節點數據庫連接的數據庫類型取決於開發者通過這些API對節點數據庫服務的設置腳本。

  以上的服務是指軟件服務,並不要求一定要安裝到不同的服務器上,可以多個服務安裝到一臺服務器上。對於開發單機遊戲的情況,你可以把所有的服務都安裝到客戶端上。

  (3)遊戲製作平臺體系結構
  SI Engine遊戲製作平臺負責生成關卡文件,並初試化遊戲關卡的資源。主要有以下組成部分:
  界面編輯器
  場景編輯器
  場景佈局
  包圍盒生成
  包圍球生成
  包圍網面生成
  環境貼圖盒編輯
  PRT球編輯
  輻射度光照貼圖生成
  二步光線跟蹤光照貼圖生成
  PRT預計算
  環境貼圖生成
  門和區域編輯
  區域八叉劃分
  幾何壓縮

  紋理編輯器
  紋理編輯
  紋理座標編輯
  材質編輯
  凹凸編輯器件
  法線貼圖生成
  水平線貼圖生成
  LOD編輯器
  離散LOD定義
  連續LOD生成
  地形編輯器
  地形編輯
  水面編輯
  草和毛髮編輯器
  植物編輯器
  粒子特效編輯器
  動畫編輯器
  骨骼動畫編輯:
  變形動畫編輯:
  替換動畫編輯
  渲染器編輯器
  渲染流程編輯器
  狀態機編輯器
  BP神經網編輯器
  活動響應編輯器
  對象編輯器
  腳本編輯器
  遊戲測試器

  具體功能所明如下:
  A. 界面編輯:
  通過提供一個界面編輯器來可視化的交互佈局2D的界面控件和容納場景的視口控件。實現對控件的建立、拖動、屬性編輯、事件腳本編程等功能。

  可以將定義的界面保存爲界面定義腳本文件。並指定特定的界面文件爲關卡的初始界面,從初始界面跳轉到其他界面需要通過腳本編程來卸載舊界面和加載新的界面文件。界面上的一些控件如對話框可以初始化爲隱藏狀態,在特定的事件處理腳本中用腳本程序顯現。

  B. 場景編輯器
  場景佈局:
  通過提供一個場景佈局器,來建立場景物體、命名場景物體,爲場景圖元對象加載網格和貼圖等資源、修改場景物體的屬性、設置場景圖元對象渲染特效。

  通過揀選物體並移動,旋轉、放縮來改變場景物體佈局。
  爲多個場景物體的建立組,或將某個場景物體指定爲其他場景物體的子物體,其位置和方向被表示爲相對於上層物體相對位置和相對方向。
  場景物體不單指場景圖元對象還包括各種光源、攝相機,卷積霧,卷積光,陰影體,虛擬物體,地形,水面,植物,草和毛髮,粒子對象,環境貼圖盒,PRT盒等等。並且在場景編輯中都可以交互式的改變他們的位置和方向以及屬性數據。
  同時還可以設置整個場景霧化效果等等。
  場景佈局可以在多個不同方向和投影方式的視圖中進行。並可以改變編輯視口的攝影方向和投影方式。
  可以改變移動、旋轉、放縮的參考座標系。
  並且硬件不能直接繪製的參數曲面表示的場景圖元一樣可以被場景佈局裝入和佈局。只是傳遞到虛擬機後參數曲面被虛擬機關卡裝入過程三角形條帶化。
  場景佈局還定義場景物體的事件激發條件和編輯場景事件的處理腳本。

  物理編輯:
  建立和設置場景物體的虛擬物理對象並同場景物體綁定。
  建立和佈局虛擬的物理力場對象,並應用於場景物體。
  建立虛擬的物力參數探測器以及碰撞檢測探測器,設置場景關卡的物理探測的觸發條件如時鐘,其他事件觸發等等。
  爲物理事件添加處理腳本。
  
  包圍盒生成:
  自動生成指定場景物體的包圍盒,用於門裁減、閉合探測和碰撞檢測等。
  
  包圍球生成:
  自動生成指定場景物體的包圍球,用於門裁減、閉合探測和碰撞檢測等。
  
  包圍網面生成:
  自動按設定的誤差範圍,生成指定場景物體的包圍網面,包圍網面用於裁減和測試的效率不高,但是可以用於代替原始圖元網面來生成卷集模版陰影,可以提高模版陰影的渲染效率。
  
  環境貼圖盒編輯:
  通過交互方式編輯添加環境貼圖盒。並指定環境貼圖盒是否伴隨某個場景物體移動,以及指定環境貼圖盒子的攝相範圍。以及指定那些場景對象的環境貼圖通過該環境貼圖盒子得到。
  
  PRT球編輯:
  通過交互方式建立PRT球,併爲PRT球指定一個環境貼圖或貼圖爲環境光源貼圖。並指定那些靜態場景對象綁定到該PRT球,以便計算他們的傳遞係數,在渲染中他們的漫反射將受該PRT球影響。

  輻射度光照貼圖生成:
  爲需要輻射度光照圖的場景對象,計算他們的輻射度關照貼圖,並保存爲他們的紋理。
  注意輻射度光照貼圖和PRT都是作用於物體漫反射,他們不能同時被一個場景圖元對象使用。

  二步光線跟蹤貼圖生成:
  從一個指定攝像機位置通過二步光線跟蹤算法渲染出一個貼圖,保存爲紋理文件,供其他圖元添加貼圖時候使用。

  PRT預計算:
  計算所有PRT球環境光照係數,並計算PRT球綁定的物體的光能傳遞係數。

  環境貼圖生成:
  計算所有靜態的環境貼圖。並保存爲紋理文件和加載到需要該貼圖的場景物體資源中。

  門和區域編輯:
  通過交互式編輯指定一個虛擬網面範圍內的場景圖元或選中的場景圖元構成一個區域。 
  用交互式編輯繪製一個虛擬多邊形作爲從一個區域到另一個區域的門。

  區域八叉劃分:
  爲每個區域執行八叉樹劃分,並建立八叉樹來管理區域內物體。
  
  指定物體的卷積模版陰影的產生多邊形網格:
  可以指定有卷積模版陰影的圖元的卷積模版陰影的產生多邊形網格是用包圍盒、包圍球、包圍多邊形面還是原始圖元多邊形面本身。

  幾何壓縮:
  調用幾何壓縮算法,壓縮場景物體的幾何數據。幾何壓縮算法主要有三角形條帶化、頂點數據表示精度有損壓縮、以及幾何數據有損拓撲編碼和預測編碼。幾何壓縮能夠減少資源文件的大小,但是在三角形條帶化後的幾何壓縮步驟產生的數據硬件都不能直接支持,所以幾何壓縮後的數據傳遞給虛擬機後將在關卡初始化階段被一定程度的解壓縮成硬件能夠支持的條帶化幾何數據,以變虛擬機渲染時候不需要進行復雜的解碼運算,以加快渲染速度。。

  變換動畫編輯:
  在場景編輯器中建立命名變換動畫對象,並定義其關鍵時刻。指定每一個關鍵時刻,場景中運動物體的位置和方向。


  C. 紋理材質編輯器:
  紋理編輯:
  進行紋理的裝入,命名,卸載。紋理可以是視頻表示的過程紋理。

  紋理座標編輯:
  主要針對一個場景物體,調整紋理座標。
  如果場景物體沒有紋理座標,那麼可以用投影盒或投影球,投影圓柱等方式建立投影紋理座標,或進行通過建立和自動生成頂點紋理地圖的方式來建立紋理座標。並用交互編輯的形式通過調整這些投影座標體的位置和方向或頂點在紋理地圖上的座標來編輯這些紋理座標。
  如果場景物體有對應該紋理的紋理座標那麼可以通過頂點紋理座標數據修改的形式來調整紋理座標。

  材質編輯:
  建立命名材質,爲該材質設置參數和設置紋理槽的紋理。材質包括動畫材質,動畫材質用關鍵時刻和材質對列表的形式保存動畫開始後每個時刻的材質。中間材質插值得到。

  D. 凹凸編輯器:
  法線貼圖生成
  裝入場景物體幾何數據的高精度和低精度版本,參考高精度版本計算低精度版本的法線紋理貼圖。法線貼圖可以通過法線貼圖渲染器的Vetex Shader和Pixel Shader程序進行逐像素的渲染,以變用低精度模型就能很好的近似高進度模型的表面細節。
  
  水平線貼圖生成
  裝入場景物體幾何數據的高精度和低精度版本,根據高精度版本計算照射到物體表面像素的光線不被本身凹圖遮擋的角度範圍。並以此爲依據生成低分辨率物體的水平線貼圖。水平線貼圖能用於渲染物體本身凹產生的陰影。

  虛擬位移貼圖生成
  裝入場景物體幾何數據的高精度和低精度版本,根據高精度版本計算低精度物體的虛擬位移貼圖。

  E. LOD編輯器
  離散LOD定義
  將物體模型的精度分成幾個LOD級別,爲每一個級別裝入該級別進度的物體的多邊形表示,並生成離散LOD場景對象。並設置圖元在什麼情況下使用那一級別的多邊形表示。

  連續LOD生成
  利用幾何縮減算法爲指定的場景物體模型生成連續LOD對象。並設定在那些距攝像機距離的情況下使用多少頂點的多邊形表示。

  F. 地形編輯器
  地形編輯
  裝入或隨機產生或繪製地形高度圖象。指定高度單位和地形網格數量和地形的範圍和地形場景簡化算法,生成原始的地形網面。並交互式的在地形網面上調整。和覆蓋地形貼圖。並生成地形場景對象。和保存爲地形文件。

  水面編輯
  利用水面的地形高度圖,指定算法和參數用生成地形的相同方式生成和調整水面。並對突變的水面落差隨機的生成瀑布面片,並指定水面的法線過程貼圖或水面的法線變化Shader函數。自動的按設定的參數爲環境包圍盒基準邊長生成很多覆蓋水面的相連的環境包圍盒集合。最後生成水面場景對象。還可以通過兩副或多副不同時刻的水面高度圖來生成變動的水面。這種變動的水面能根據兩副相鄰時刻的水面地形高度圖快速突變的地方生成浪花。

  G. 草和毛髮編輯器
  爲指定的場景物體,通過三角形邊沿法線生長出矩形面片和源多邊形根據參數設置多次沿法線位移複製出分層覆蓋面片並在這些面片上覆蓋靜態貼圖或過程貼圖的形式來生成毛髮和草。並設置其顯現的攝像機距離範圍。最後形成草和毛髮對象,可以被保存或作用於場景物體。

  H. 植物編輯器
  裝入植物的原始枝幹網面、葉子網面、葉子貼圖。並自動生成植物的全多邊形表示、SpeedTree表示,正交IBR表示、單個佈告牌表示。並設置這些表示到不同LOD級別,設置LOD級別的距離條件。生成植物對象。

  I. 粒子特效編輯器:
  設置粒子發生器的類別,粒子速度,範圍,方向等參數生成粒子特效場景對象。

  J. 動畫編輯器件:
  骨骼動畫編輯: 
  裝如或建立骨骼物體,建立骨骼物體需要裝如一個多邊形作爲皮膚,並建立一系列骨骼,設置骨骼對皮膚上頂點的影響權值。
並建立一系列的命名動畫。選擇每一個命名動畫,爲其添加和設置關鍵時刻,並編輯該動畫在關鍵時刻的骨骼位置。最後生成骨骼動畫場景對象並保存骨骼動畫資源文件。

  變形動畫編輯:
  裝入網格物體,並建立一系列的命名動畫,爲每個命名動畫添加關鍵時刻,並在關鍵時刻設置網格物體頂點的位置和法線更改的目標位置。生成變形動畫對象。保存到資源文件。

  替換動畫編輯:
  建立一個替換動畫物體,並建立他的一系列的命名動畫,爲每個命名動畫添加關鍵時刻,並在關鍵時刻裝入特定的多邊形表示。生成替換動畫對象。保存到資源文件。

  K. 渲染器編輯器
  通過可視化的組織渲染器層次和編輯渲染器屬性及渲染器腳本編輯,引用的效果文件及其CG代碼編輯來自定義渲染器類。

  L. 渲染流程編輯器
  通過可視化的組合渲染器樹以及爲渲染器樹上的每個渲染器設置屬性參數和指定資源來定義渲染流程。

  M. 狀態機編輯器  
  通過可視化的繪製狀態機及設置狀態遷移的輸入條件來在腳本中生成狀態機類。

  N. BP神經網編輯器
  通過可視化的繪製神經網絡節點和連接權值,並用輸入輸出向量進行訓練來生成神經網絡類腳本。

  O. 活動響應編輯器
  通過繪製活動響應狀態機並設置活動檢測的條件和時機,以及爲活動狀態遷移事件編輯處理腳本或錄製場景變化宏的形式來定義活動響應事件檢測和行爲響應方式。

  P. 對象編輯器:
  維護和編輯關卡里面的對象樹,對象樹以樹狀結構管理所有的內存對象,在SI Engine中所有的類(包括場景物體類、界面控件類、物理對象類等等)實例化成對象後都被命名和加載到對象樹。對象樹管理的對象能夠被腳本檢索。同時可以通過可視化的編輯選擇對象樹上的對象,來修改對象的數據屬性和爲對象的事件接口添加處理腳本。

  Q. 腳本編輯器:
  提供一個文本編輯界面,用於編譯和編輯修改腳本程序。腳本程序包括關卡啓動初始化啓動函數、用戶自定義類程序、特定對象或類的事件處理程序、關卡結束解析程序、製作平臺生成的類程序(如渲染器類、渲染流程類、狀態機類等等)、用戶自定義的渲染函數、調試用控制腳本命令。SI Engine腳本使用C#語言編寫,並利用.Net的運行時編譯和反射功能編譯和執行。

  R. 遊戲測試器:
  定義一些測試指標,並實際調用虛擬機運行遊戲關卡,並獲取測試數據。可進行中斷和調試。以及通過控制檯執行一些調試用控制腳本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章