Home

Milo的遊戲開發

查看執行文件內容的小工具 Sizer

Sizer 是我無意中發現的一個小工具,可以檢測 EXE 及 DLL 裡的內容,讓你知道裡面的函式和資料各使用了多少空間。

知道了空間的分佈有助優化檔案大小,並且可以找到一些不必要的 dependenices。

使用時,必須生成 PDB 檔,讓那個工具可以取得 symbols。

以下節錄了我現時做的 “引擎”的 DLL 的大小分佈 (佔大部份是 static-link 的 Lua 引擎):

繼續閱讀

使用 Custom Build Tool 執行 SWIG

今晚完成了近期的第三個目標,加入 Script Module 的 Binding (其實只是一個叫 Runtime 的類別),利用 C# 去執行之前的 Lua 的程序 (test1.lua)。

今早 Edwin 的回應啟發了一些想法,所以著手更改 SWIG 在 Visual Studio 的編譯方法。

現在採用了Visual Studio 的 Custom Build Rule。由於 Lua 和 C# 需要不同的規則,所以要兩個 file extensions,我設定 Lua 的 Swig Interface 檔案為 .li,C# 則是 .ci。

Lua

swig
 -c++
 -lua
 -o $(OutDir)/$(InputName)Lua.cxx
 "$(InputPath)"

C#

swig
 -c++
 -csharp
 -o $(OutDir)/$(InputName)Cs.cxx
 -outdir $(OutDir)
 -namespace Mil.$(InputName)
 -dllimport $(TargetName)
 "$(InputPath)"

生成的檔案會放置於 Debug 或 Release 的輸出目錄,解決之前兩個 configuration 會互相影響的問題。

兩個規則分別生成 $(OutDir)/$(InputName)Lua.cxx 和 $(OutDir)/$(InputName)Cs.cxx,這些檔案需要加入 Project 裡。但因為一個項目不應該同時加入 Debug 和 Release 版的這些檔案,我想到的方法是寫一個 .cpp 去 #include 這些檔案,例如:

// MathCs.cpp
#include "stdafx.h"
#include "MathCs.cxx"

之後再把 Project 的 Include path 加入 “$(OutDir)”,那麼,就可以正確地編譯現時 Configuration 的 Swig 生成檔案。

後來再試驗檔案的 Additional Dependencies 屬性,設定單一檔案仍然不成功。之後我把 .li 和 .ci 裡 include 的檔案改名為 .lii 和 .cii,希望只要可設置 dependencies 為 *.lii 和 *.cii 就可以了,但都不成功。或許可以用 Pre-Build Event 去檢查這些檔案,如比輸出檔案新就 touch 那個 .li 或 .ci。不過未嘗試。

最後,還有一個問題是 C# 的 Proxy 需要編譯多個由 SWIG 生成 .cs 檔案。我找了一回才發現 C# 沒有 #include、也似乎沒有機制可以編譯 *.cs 等多個檔案。最後暫時用 C++ Project 的 Post-Build Event 把適當 Configuration 的檔案拷貝到 C# 的項目裡,再人手加入這些檔案。

copy $(OutDir)\*.cs ..\MilCs

Lua 的渲染測試

今日順利完成3月6日訂下的第二個目標,把昨天的 C# 測試程式用 C++ 及 Lua 實現。圖像輸出和昨天的測試程式一模一樣,就不上傳了。

C++ 負責創建視窗和呼叫 Device::Open(Hwnd),Lua 做渲染的部份。(其實在遊戲中是不會用 Lua 做這麼低階的工作,這裡只是當作測試 Lua Binding。)

除了編寫 Lua 的 SWIG interface 檔案外,今天主要的工作是考慮如何從 C++ 呼叫 Lua 的類別。發覺對 Lua 的語法還是很不熟識。

有興趣的話可以比較以下的C++/Lua代碼和昨天的C#代碼

繼續閱讀

實作簡單的材質

進度有點緩慢,今天才完成了 3月6日定下的第一個目標。

使用 blinn_bump_reflect.fx 的渲染

今天的學習進度:

  1. 設定 Matrices 及修正相關函式: 現時設定為 column-major。改正相關函式花了很多時間。
  2. 修改 ChamferBox: 由於 ChamferBox 只負責生成一個 Geometry 物件,所以把 constructor 改為一個 function。原本想嘗試做一個 non-member function,但是 SWIG 部份有問題,花了一兩個小時也找不到解決辦法,所以現在改為一個 static member function。
  3. 實作 Material: 使用 HLSL fx 檔案在建構一個 Material (在 Direct3D9 上而已,之後再考慮跨平台的設計)。利用 FX Composer 的 Blinn.fx 測試渲染。
  4. 加入 Texture: 因為 blinn.fx 需要 diffuse texture,又實作了一個 Texture 類別,和 Material 相似,也是從 constructor 讀入一個影像檔案。
  5. 測試 blinn_bump_reflect.fx: 因為這個 Effect 需要 Tangent 和 Binormal,所以實作了
    void GeometryBuilder::ComputeTangentSpace(int texcoordIndex)

    函式從三角形網格計算這些向量,當中參考了這個網站的實作

  6. 加入 CubeTexture: blinn_bump_reflect.fx 需要環境貼圖,因此加入這個類別。並重構 Texture,使 Texture 和 CubeTexture 繼函自 TextureBase。

繼續閱讀

實作Geometry Builder

geometrybuilder1.png

因為還未決定坐標系統,今天先實作 Geometry Builder。

首先闡述現時的設計:

  • Geometry 類別是一個渲染的單位,儲存平台相關的渲染資訊,例如在 Direct3D9 版本裡包括了 Vertex Declaration、Vertex Buffer(s)、Index Buffer 和 Draw-call 的參數。但它並不包含 World Transform、Lighting 及 Material 等資訊。
  • GeometryBuilder 是用來生成 Geometry 的輔助類別。Geometry Builder 的介面是一個平台無關的,只有 Build() 函式的實現才跟平台相關, Build()是把建立的平台無間資訊轉化為平台有關的 Geometry 內容。
  • Device 類別有一個 DrawGeometry() 函式用來渲染 Geometry 物件。

繼續閱讀

Game Developer Conference (GDC) 2008 Online Slides

The followings are some slides from GDC 2008 collected online. I will update the list if new slides are found.

Valve

  • Integrating Narrative and Design: A Portal Post-Mortem. Slides
  • Stylization With a Purpose: The Illustrative World of Team Fortress 2. Slides
  • How To Go From PC to Cross Platform Development Without Killing Your Studio. Slides
  • Post Processing in The Orange Box. Slides

NVidia

  • NVIDIA Developer Toolkit Overview. Slides
  • Direct3D Day: Optimizing DirectX 10 Performance. Slides
  • Direct3D Day: Soft Shadow Mapping. Slides
  • Direct3D Day: Instanced Tesselation in DirectX 10. Slides
  • Direct3D Day: Harnessing the Power of Multiple GPUs. Slides
  • Particle-Based Fluid Simulation for Games. Slides
  • 3D Stereoscopic Game Development. Slides
  • GPU Optimization with NVIDIA Performance Tools. Slides
  • NVIDIA FX Composer 2.5 + NVIDIA Shader Debugger. Slides
  • Beyond printf(): Debugging Graphics Though Tools. Slides
  • GPU Physics for Game Programmers. Slides

ATI

  • Future-Proof Games with Real-Time Tessellation. Slides
  • Harnessing the Power of Multiple GPUs. Slides
  • Harnessing the Power of Multiple GPUs. Slides
  • DirectX10.1: DirectX 10 and then some…. Slides
  • Tessellation in a Low Poly World. Slides
  • Ultimate Graphics Performance for DirectX 10 Hardware. Slides
  • The Ultimate Developers Toolkit. Slides

Others

繼續圖像引擎

因為太太星期五抵上海,自那天到星期日也沒有「開工」。

今天繼續做圖像引擎,不過只有小許時間。現在加了一些 hard-code 的 D3D Matrices,可以從 C# 渲染一個 Chamfer Box (no lighting)。

想繼續下去時又停了下來,為了想幾件事情。一開始是考慮用甚麼的 handedness 的座標系統和 column/row major 的矩陣,不過找不到一個比較通用的標準。後來就想以一般的 shader 例子作為主要考慮,所以往 Nvidia 下載 Fx Composer 2,希望可以使用其設定的慣例和例子。剛開始可以直接用 HLSL 的,之後再考慮 CgFX 或 COLLADA FX。歡迎各位討論,特別是用過這些工具的朋友。

接下來設定好這些慣例後,就會加入一個簡單的預設 shader,再 refactor 現在的 Geometry 生成方法。現時的想法是,建立一個 Platform-specific 的 Geometry Class,它基本是一個 draw-call 的資訊。再設計一個 Geometry Builder,方便 procedurally 建立 geometry。這個 Geometry Builder 的介面應該是平台無關,日後可以利用這個介面來做個別平台的三維模型轉換 (e.g. COLLADA 到 Geometry 的轉換)。希望透過這個介面,可以在 Lua 簡單地寫一些 procedural geometry,例如 Chamfer Box、Teapot 等等。這些其實在遊戲中不太實用,但作為 script 和 CG 的學習可能不錯。

今天,也要早些睡了……

開始實作圖像引擎

昨晚只是寫 Blog 已經花了幾小時。不過這也是值得的,因為我可以從寫的過程中把思路弄清楚一點。今晚終於開始編程。

詳細的設計留待一兩天才說吧,今天基本上只寫了一些數學部分、Direct3D9 的起動、一個叫 Geometry 的類別和一個 Chamfer Box。但全部都通過編譯但未進行測試。

我希望在這幾天內實現以下的產出 (deliverables):

  1. 在 C# 創建的視窗中渲染一個旋轉 Chamfer Box,只有直線光源。
  2. 用 C++ 和 Lua 寫同一個和 (1) 相同的程序。
  3. 用 C# 創建的視窗中運行 (2) 中的 Lua 的程序。
  4. 在 cygwin 上執行 (2),使用 gcc 和 OpenGL。

過了這一步,就可以加入輸入和嘗試做一些遊戲性相關的實驗。有時間的話,也想找一部 PSP 用開源的 SDK 試試移植。

跨平台的圖像渲染引擎

今天轉一個話題,暫時不想 Script 的部份。本來想寫一些圖像的代碼,但敲了幾個鍵又停下來思考,猶豫不決,便希望寫這一篇 blog 整理一下思緒。希望大家能多給意見。

沒有一個圖像渲染引擎可以適合所有平台、所有應用。我暫時設定的目標是

  1. Windows Direct3D 9
  2. Windows Direct3D 10
  3. Windows OpenGL
  4. Linux
  5. OSX
  6. M記3代(實際是2代? ^_^)
  7. S記3代
  8. S記手提
  9. N記W機

當然,我不是要立即把它們全部實現,而是在開始做的時候考慮到它們。當中,電腦的平台上只考慮支援有 Shader 的硬件 (其實不同的 GPU 可以視為不同的平台)。而一些遊戲機是只有 Fixed Pipeline的。

跨平台方案

如下圖所示,一個圖像渲染的引擎大概是介乎應用程式和 Graphics API之間。

renderengine1.png

有一些平台,例如一些遊戲機,可以讓應用程式跨過 Graphics API 和 OS/Driver,直接操作硬件。這種方式和 DOS 年代的電腦遊戲做法一樣。

要實現跨平台的應用程式 (遊戲),我想到有4個方案

  1. 使用跨平台的 Graphics API (如 OpenGL、或 Java 的甚麼幾個數字標準…)
  2. 每一個平台編寫一個把平台Graphics API 抽像化的 API
  3. 每一個平台編寫一個 Render Engine
  4. 每一個平台編寫一個 Application

由於我的目標比較廣,基本上第一個方案不作考慮。

繼續閱讀

解構 CryEngine2 的 Script 物件模型(一)

這幾天看了一點 Crysis 的 Script。CryEngine2 和 CryEngine 一樣是使用 Lua 為 Script 語言。CryEngine2 把 Lua 升級上 5.x 的版本。

雖然 CryEngine2 的功能實在比 CryEngine 進步許多,可是,有點失望的是 Crysis 的說明文檔比 Farcry 少,甚至最近才釋出的 SDK 也沒有 Script 的 API 參考文檔。暫時只看了一篇官方的 “Creating a new entity”文章和 Crysis 遊戲裡的 Script,所以很多以下的內容是未經証實的猜想。

這是部份 Script 物件模型的 UML 類別圖:

crysis.png

由於 CryEngine 的 Script 是 loosely typed,實際上並沒有真正的 Base、EntityBase 等類別和繼承存在。這圖所顯示的,只是我從例子中找到的一些共同部分,把它組合成類別及繼承。由於時間關係,我需要分開數天研究不同的「類別」,今天主要集中看 Entity。

繼續閱讀

Home

Search
Feeds
Meta

Return to page top