2011年3月3日 星期四

GDC 2011 Day 3

Game Develop Conference 今天算是正式開始。

一開始的盛事,就是任天堂社長岩田聰的 Keynote 演講。

DSC01132

DSC01134

說真的,日本人講的英文聽起來有難度,我想他說起來也不會簡單...

所以,在他演講台的正對面有大字報...

DSC01135

演講主題呢,就是內容啦、創意啦、熱情啦...這些東西...

一個小時的演講,中間還讓北美的任天堂主管進來工商服務一段 N3DS…

N3DS

真的是很讚。

中午休息時間,到任天堂的展場去,搶到空位,把玩了一下 N3DS 的任天貓狗,整個裸眼 3D 的畫面效果好逼真啊...

不過這個真的要親眼看,有圖就沒真相了。

其他的四堂課,好像都碰到了大大小小不等的地雷,沒有什麼非常 Exciting 的東西。倒是另一位同事選到了一兩個有意思的課程。

首先是 Autodesk 講他們正在進行的新計畫 -- DNA Language,用來做為 Game Runtime, Game Editor, DCC Tools 之間的資料庫管理橋樑。讓 Asset 的製作與測試,能夠有更快速順暢的 Workflow。

可是,我只是想知道 Asset 的版本管理方法啊... 課程簡介上不是寫的是這個嗎? 你們不能就這樣輕輕鬆鬆帶過啊...

下午,先去聽 Valve 的演講,這場技術性比較高些,可能跟這個演講者老是在玩組合語言有關。

網頁: http://bit.ly/hPCmVW

然後去聽了 BattleField 3 的新的場景 Culling 的方法。

什麼新方法?

把矩陣行列轉過來,讓 SIMD 運算比較快些,也算新方法?

然後講 Software Culling,什麼? 就畫在一張比較小的 Z-Buffer 上然後做 Z-Test ?

我快昏了...

最後一堂課,去聽 AMD 介紹新版 PerfStudio。心得就是 : AMD 用了一張顯示卡,換到了幾十張開發者的名片...

 

今天的像素拼圖是這樣--

DSC01151

那個蹲跪著在拼的應該是日本人,他也不管格子上面寫的是什麼符號,反正就是要從別的地方拆方塊下來拼馬利歐就對了。

我開始覺得,每個人都想要做自己的創意,這張圖應該沒辦法完成了...

2011年3月2日 星期三

GDC 2011 Day 2

DSC01131

這是一道壁報牆,上面的一點一點紅色藍色黃色黑色的小方塊,是由每一位 GDC 的參加者,一人一塊貼上去的。

白色的格子上有小小的標示,寫著方格該貼的顏色,每一位 GDC 的參加者會拿到一塊方塊,自己對著顏色貼上去。

很有意思的活動,象徵著古早時代的遊戲美術一個像素一個像素的"刻點"。

不過那個戴帽子的老兄不知道在幹嘛,一直從別的地方把方塊拔下來黏到他要的地方去...

明天再去看看完成度如何...

第二天的課程,選擇去微軟的 Kinect Develop Summit。

據說 Kinect XDK for Windows 即將要釋出,不知道是不是表示 Kinect 可以裝在 PC 上了。這會是什麼景象?

---------------------------------------------------------------------------------------------------------------------

微軟還是很上道,去聽的人都能夠拿到一份光碟,所以就不用拼命低頭寫重點或是把投影片拍下來。

還送了一小疊很有質感的筆記紙。

一開場的簡介,快講完的時候,有這麼一段--

本來完全不玩遊戲的媽媽,跟參與 Kinect 開發的兒子說,要買 Kinect 來玩,而且,現在每天玩。所以,這是一個遊戲產業的世代革命...

好,這故事從 Wii 換成 Kinect,故事主角從宮本茂的老婆換成某位微軟員工的媽...

老梗。

Kinect 有幾個主題,Joint Filter, Gesture Detection, Speech Recognition, 還有 Mechine Learning, Neural Network。

我們能說,整個系統已經不再是 true / false, 0 與 1 的思考方式,必須改用機率、權重、取樣分佈來想。

而且,這樣的系統裡,取得的資料很多,資料裡的雜訊更多,如何取得能用與有用的資料,就變成是 Filter 的技術所在。

Gesture Detection 也不簡單,因為每個人的姿勢手勢都不同,很多元,所以設計就變得很複雜,要考慮的狀況、要測試的條件也很多。

例如,"伸出你的右手"。

男人女人的伸手方式就不一樣了,老人與小孩的伸手方式也不會相同。

這程式要怎麼寫?

Hmm…

Mechine Learning

我們決定演算法之後,讓機器自己去決定參數與權重...

不知道是不是所有的體感遊戲平台都有這樣的做法,不過對習慣於 Input 始終是 0 與 1 組成的我們來說,應該是很有挑戰性。

課程結束,填了問卷交回。

哇咧,今年沒有 "填問卷送 T Shirt" ?

2011年3月1日 星期二

GDC 2011 Day 1

2011 年的 GDC,是第 25 屆,不過也好像沒有特別盛大什麼的。反而是讓人感覺規模越來越小,就連報名參加所給的一個資料袋,質感都越來越糟...

依照慣例,前兩天是 Tutorial 課程跟一些 Summit 演講。

今天還是參加了一整天的 Tutorial,題目是 – "Advanced Visual Effects with DirectX 11"

--------------------------------------------------------------------------------------------------------

早上第一堂課,介紹的是 DX 11 裡的 Device Context & Command List,多緒繪製的架構。

接下來,是 Deferred Shading 的最佳化策略。包括 Light Pre-pass, Light Geometry Optimization 幾個方法。不過,Light Pre-pass 馬上在下午的課程裡被打槍...

接著是 Civilization V 。

他們用了一個稱為 "Packetized Rendering" 的設計策略,將所有的 API call 包裝成一個 packet,送到 engine 去處理,每個獨立的 render job 可以降低彼此之間的關聯性,甚至沒有關聯。然後可以很自豪的說,"No threading bugs"。

展示了一個很壯觀的 Screen Shot -- 滿滿畫面的兵,底下還秀了CPU 效能,12個核心同時在跑!!

然後是 Dragon Age II ,介紹他們所使用的 DX11相關技術。

他們主要用在 Dynamic Lighting ( Light Pre-pass method ), Tessellation, Diffusion Depth of Field (DDOF), Contact Hardening Shadows 上。

從這裡開始,DDOF 就一直出現了...

根據他們所說, Tessellation 是一個效能殺手。所以,只用在看得到的、很靠近攝影機的地形上。

也就是,這技術並不是什麼都適用的好物...

Contact Hardening Shadows 做出來的 Soft-shadow 效果,比過去用的 PCF Filtering 好非常多。DX11 SDK 上有 Sample,不過,我的電腦還是 DX10的顯卡,跑不起來,只能看靜態的圖...

下午第一堂課,就由 DICE 介紹他們的大作 Battle Field 3。

這遊戲,只支援 DX11,拋棄 DX9。

他們說,BF3 是大作,所以可以推動 OS 以及硬體的更新。

我們在旁邊,表示 .. "一切樂觀其成"...

太樂觀了...

BF3 的 Deferred Shading 並沒有使用 Light Pre-pass 方法,因為 Light Pre-pass 要對 Geometry render 兩個 pass,對 BF3 而言,Geometry 太多,不適用。

BF3 用了一個特殊的想法。

將 Screen Image 切分成幾十個 Tile,每個 Tile 用 Compute Shader 計算相關的 Light Info,這樣,據說可以計算場景裡高達 1000 個點光源...

BF3 的場景裡的物件也是很多的,所以依舊存在著 Draw Call 的 Bottleneck。所以, BF3 將 Instancing 發揮到最大極限,從一個 Object 一個 Draw Call ,變成 "一種" Object 一個 Draw Call...

效能大提升。

最後,BF3 呼籲 : Drop DX9!!

(我們還是繼續在旁邊... "樂觀其成"...)

接下來是一個日本人的介紹。

精神不濟加上日式發音很難懂,以致這半個多小時全部不知道什麼是什麼...

然後,又來 DDOF 了。

主題是 DDOF Solver,不太懂在做什麼,回去要開始找資料開始瞭解。

接下來的主題是 Separable Filters。

是用 Compute Shader 取代 Pixel Shader 做 Image Base Filter 的想法。

舉例就舉例嘛,不知道為什麼,又拿 DDOF 來舉例...

DDOF 看起來好像真的很重要...

然後談到 Tessellation, Displacement Shading, 重點 : 請用在 "Key Assets" 上...

最後,再經過一段冗長的 Post-Processing Performance Optimizing 演講,好不容易,下課休息。

2010年12月17日 星期五

引擎中不可或缺的事件訊息系統

嗯...對...

很久沒有發文了...

「懶」是唯一的解釋...

前一陣子看到一個引擎中的訊息系統架構,突然間,對整個引擎的架構設計有了新的想法。或者該說,解決了我心中長久以來的難題。

說穿了,不過就是事件訊息驅動式 ( Event Driven ) 的架構設計。

這東西被我晾在一旁太久,已經完全忘記它的存在了。

簡單舉個例子說吧...

遊戲中有很多系統,會受到攝影機的位置方向的影響,例如,天空盒子 ( Sky box ) 必須隨著攝影機的位置變動位置,動態讀取的無接縫地圖系統也必須檢查攝影機的位置來決定是否讀取地圖或是釋放地圖。如果在一個單純的程序式的架構中,我們會在攝影機位置變動的時候,呼叫這兩個物件系統來做相應的更新檢查。

像是這樣:

CameraManager::UpdatePosition(Camera* camera, Vector3 pos)
{
  camera->UpdatePosition(pos);
  skybox->UpdatePosition(pos);
  seamless_world->CheckLoading(pos);
}

只不過,這麼一來,我們可以非常確定的是, Camera Manager 這個物件已經跟 Skybox 、 Seamless World 分不開了。三個物件綁在一起的結果是,物件的再利用性大大降低。( 想想如果我們需要將 sky box 改為 sky doom, 又或者我們不再需要無接縫地圖的時候... )

這還只是其中一個問題。

另外一個問題是,在我們遊戲越做越大,引擎越寫越深入的時候,我們發現, LOD ( Level of Detail ) 的計算也需要隨著攝影機變動而更新,水面倒影效果也跟攝影機有關,粒子系統的繪製也需要攝影機的資料...

於是乎,我們又把 LOD 系統、水面倒影、粒子系統全綁到了攝影機物件裡。

更甚至於,第三人稱視角的遊戲裡,攝影機是跟著主角走的,所以,又把攝影機綁到了主角身上,跟著主角更新。

最後的結果就是,整個引擎裡各式各樣的系統物件,因為彼此之間相互影響的關係,全部混成一團。

現在換個角度,改用事件驅動來做。

攝影機變動的時候,我們不管 Skybox 、 Seamless World,只送個訊息給事件系統。

像是這樣:

CameraManager::UpdatePosition(Camera* camera, Vector3 pos)
{
  camera->UpdatePosition(pos);
  event_system->Send(idCameraPositionUpdated, camera);
}

而對於 Skybox, Seamless World 來說,必須有函式負責來接收這個事件,同時,在物件的初始化的時候,必須先把這個函式登記到事件系統裡。

Sky Box 的接收函式大概會長得像這樣:

Skybox::OnCameraPositionUpdated(Camera* camera)
{
  UpdatePosition(camera->GetPosition());
}

其他的,需要隨著攝影機更新而更新的物件,也都會有相類似的函式,同時也都需要將函式登記到事件系統中,事件系統在收到攝影機送來的事件後,就會分發事件,一一呼叫每個需要的事件處理函式。

這樣子,事件系統將我們的各個物件獨立開來,減少了很多錯綜複雜的關連。

更進一步來,我們可以在玩家主角的位置更新的時候,發送一個事件出來,然後在攝影機系統裡,寫個這樣的函式:

CameraManager::OnPlayerPositionUpdate(Player* player)
{
  UpdatePosition(player->GetPosition());
}

當然了,這樣的事件驅動架構不是沒有缺點的。缺點就是,為了遵循這個架構模式,我們必須多寫很多 code ,例如,本來可以直接在攝影機裡呼叫的函式,現在必須寫一個事件處理函式來呼叫它,而且還必須要把事件處理函式登記到系統裡,有點煩...

但是多花這些工絕對是值得的...

2010年6月11日 星期五

一個「偽」亂數的演算法

這是前一陣子從 "Game Code Complete" 裡看到的演算法。

說是「偽」亂數,因為它並不夠亂。但是它非常節省效能。

 

需求是這樣:

有某個數量的獎品,我們希望每次亂數取出一個來,不能重複,而且每個都要取到。

演算法是這樣:

假設獎品數量為 member,比 member 大的一個質數為 prime,

首先先取三個亂數 RandomA, RandomB, RandomC

計算

Skip = RandomA * member * member + RandomB * member + RandomC

取得 Skip 數值後,在每次需要取亂數數值時,

nextNumber += Skip

nextNumber %= prime

也就是,每次計算時,把前一次的數值加上 Skip, 然後用這個質數來取餘數, 這樣算出來的 nextNumber 就絕對不會重複。當然餘數可能會比 member 數量還大,那就再計算一次,取下一個。

 

看完之後,霎時間覺得很神奇,一時半刻還想不透,於是用試算表建公式來算,果然,產生了一個不會重複數字的序列。

但是,從這序列也發現了缺點。就是取出來的數值是有某種規律的,而且規律很明顯。不過如果不把數列排出來,也不容易發現就是了。

效能是這個演算法最大的優點,每次取亂數只需要一個加法跟一個取餘數的運算。

 

再深入去看,這演算法還可以多做一些簡化。

Skip 這個數值,只要取小於 prime,大於 0 ( 最好也不要等於 1 ) 的數值就可以,不需要取三個亂數再去加減乘除。

取出的數值的規律是,從第一個取出的 nextNumber 開始,每次遞增 Skip 指定的數量,超過 prime 的時候,再回到 0 繼續算,而之所以會全部都選取到的原因,就是因為質數的特性 -- 只能被 1 與自己整除。

 

這個演算法可以用在什麼地方呢?

分配掉寶當然是不能用啦,這個數列太過規律了。但是任務物品的掉落倒是可以用得上,怪物的重生也可以用,適用的場合應該還不少。

2010年4月29日 星期四

Activision 把金雞母 Infinity Ward 送給 EA 的事件

今天看到了這樣一篇新聞。

38 Infinity Wards employees and ex-employees file class action lawsuit

霎時間,還搞不清楚這到底是什麼,為什麼沸沸揚揚。

於是開始Google搜索。

原來 Infinity Ward 是製作 "決勝時刻:現代戰爭2"的研發公司,母公司是遊戲發行商 Activision Blizzard。

現代戰爭2是2009年非常風光的一款遊戲,怎麼現在鬧出權利金跟獎金的糾紛來了?

 

故事要從今年三月說起。

三月初, Activision 以違約與不服從命令為由,強迫兩個 Infinity Ward 高高層離職。

總裁 Jason West 與執行長 Vince Zampella。

到底這兩人不服從什麼命令,沒人知道,但是猜測是說,Activision 希望他們繼續把現代戰爭繼續製作下去,做個沒完沒了。研發單位當然不肯。

沒想到重演當年在 EA 的 2015工作室一樣的不爽事件。

據說,那時候 2015工作室做了個很賣錢的"榮譽勳章",EA 龍心大悅,希望他們一直做下去,把這個招牌賣到不能再賣為止。結果自然也是不太愉快,帶了幾個人,兩人投靠 Activision。

只不過這次 Activision 更惡劣, 連該給的權利金與獎金,也一直扣著沒發放。

大概是鬧得非常非常不高興,這兩人就離職了。

然後,事件就一發不可收拾。

四月中,同樣也是遊戲發行商的 EA,宣布成立了一個新的工作室,叫做 "Respawn Entertainment",重生。並且由 Jason 與 Vince 兩位來帶領。

隔天,報導說,首席設計師 Mackey McCandlish 與程式設計師 Jon Shiring 從 IW 離職,當時雖未明講,但猜也猜得到,去 Respawn 了,後來也得到了證實。

這兩三週以來, IW 持續失血,老員工成雙成對的離職。人才流失就像潰堤一般,止都止不住。而且流失的人才還大部分都是菁英。首席軟體工程師 Francesco Gigliotti,首席動畫師 Mark Grigsby,首席角色動畫 John Paul Messerly,首席環境美術設計 Chris Cherubini,軟體工程師 Rayme C. Vinson,一堆的『首席』全都跑去了『重生』。

Activision 在這幾週來,悄悄的進行組織重整,也開始對留下來的還忠誠的 IW 員工發放積欠的獎金跟權利金,但終究是喚不回 IW 員工的信任了,失血非但沒止住,IW 員工還給了 Activision 一個暱稱 -- "shit"。

到今天,估計 IW 原先的員工已經有一半離職。Activision 調動了其他工作室的人到 IW 裡,希望維持住產品的開發運作,但想也知道,基本上起不了什麼作用。

Activision 的某個高層,前幾天也辭去了職務 ( 不過還是以類似顧問的身分留著 ),沒講理由,大概是辭職以示負責。有人毒舌的說,「不會也是要去Respawn吧?」

 

故事寫到這邊。

IW 的兩個頭子真正的離職原因是什麼很難說,也有人說是他們打算把現代戰爭這個招牌賣到別的發行商手上才被開除,但是會引發後面一連串的『首席』離職,Activision 也必有虧欠員工之處。我想權利金與獎金發放的太不乾脆,應該會是主因之一。

不管怎麼說,這一場風波下來, EA 這個風評也不甚好的發行商,光是躺著就能撿到一整隊的金雞母,還不只是一兩隻而已。

天上掉下來的會生金蛋的母雞,誰不帶回家?

現在, EA 說的很漂亮了,完全不會干涉他們開發的內容,未來也會盡全力去發行遊戲...

Activision 一個錯誤的決定,把白花花的美金平白的又還給了 EA。EA 應該是暗爽在心裡吧?

(Update : 又看到幾篇精彩的歷史,修改了一些...)

2010年4月2日 星期五

一年一度的愚人節歡樂日

愚人節是很歡樂的日子。

Blizzard 依照慣例出了好幾道搞笑的假新聞,國內的遊戲公司也有的開始玩起來了。

Google 照例還是玩很大。

MLB 也有一堆假新聞。

今天看到一個說法是,「愚人節是 IT 產業的國定假日」。

同事說,那我們應該放假一天的呀...

來轉貼個歡度愚人節總整理好了。

剛剛在 GameDev.net 上,看到 The Daily GameDev.net 編輯所寫的一段,算是最好的註解。

他寫,

If you're expecting news from today well, you can forget about it. I refuse to look at any headlines today because... well, if you don't know than you deserve what you get :P

他「拒絕」在今天看任何的頭條新聞...