2010年3月18日 星期四

My GDC 2010 (Day 2)

今年的GDC是在 3/9 至 3/13 ,所以我現在寫的是回憶錄...XD

Day 2

早上還是待在微軟的場子裡,聽了兩堂關於 DirectCompute 以及 Tessellation 的課程。

DirectCompute 主要在介紹 Compute Shader 的使用( 對..今天也還是Tutorial.. ),重點在於,Compute Shader 本身就是為了做平行化計算而生的,所以各式各樣我們在做平行化、多執行緒的程式所需要考慮到的問題,例如Shared Memory, Atomic Operation...等等,都在這裡一一出現。

平行處理始終是個大課題啊...

在 HDR 計算時,可以將平均亮度的計算拉到 Compute Shader 來做,這算是很好的應用了。

DirectCompute 是 DX11 的規格,不過某些 DX10 顯卡已經有 Compute Shader 可用,DX10 也有函式可以呼叫來使用說。

Tessellation 課程的演講人是個華人,他說大部分的 DX SDK Sample 都是他寫的。

這個課程的主題,就是介紹幾個 Tessellation 的 Sample,每個 Sample就解說一下做法,然後把範例跑一跑,還不算太無聊。

範例咧,在 Dx11 的 SDK Sample 裡都有。

下午,微軟的課程就走到即將發表的 Windows Phone 7 作業系統上了,所以我就先到了 iPhone 的場子去。iPhone 有一場很有意思的講題 -- "如何讓你的 iPhone App 保持 Apple Store 的排名上"。

答案就是,跟我們的MMO要保持在遊戲社群網站排名的手法一樣...

持續的做更新

節慶的時候出個更新做 in-game 活動

網站上面弄點相關新聞

官方人員有事沒事在社群網站上放點消息,跟玩家溝通

...

MMO Game, Mobile Game, Social Game, ... 只要是在網路上玩、網路上營銷的遊戲,操作手法都極為相似啊...

下午最後一堂課,又回到了微軟的場子裡,聽聽 Windows Phone 7 這個系統。

微軟打算把這個系統跟 XBox Live, Windows Live Games 結合起來,然後把 Apple Store 的功能、Facebook 的社群功能全部包在這裡面...

換句話說,就是整碗捧去啦...

一天結束,有始有終,又填了一份問卷,又拿了一件微軟 T-Shirt

2010年3月17日 星期三

My GDC 2010 (Day 1)

到了會場後的第一個感覺,就是規模縮小了。

過去兩年都使用了西、南、北三個館,今年只剩下了南北兩個館做為會場。

課程變少了,而且課程的安排很糟糕,常常會是,要不是這個時段沒課可上,就是想上的課衝堂衝很嚴重。例如,有個時段 Program Track 的課,只有兩堂,而另外有個時段,Program Track 的課少說有八九堂,其中NVidia跟AMD還各佔了一堂課,這是怎樣? 逼我們選邊站嗎?

GDC五天,前兩天是 Tutorial & Summit 的課程,後三天才是正題 Main Conference。

Day 1

一整天待在微軟的場子裡。

一入場,微軟就先發個筆、筆記紙、還有投影片檔的 CD ( 省得裡頭的人拼命把投影片拍照... )

一開始,題目是VC 2010。

有點鳥。

不過,聽到一個很奇特的東西," Move Constructor "。

回頭翻光碟片,google了一下,原來這是C++的新規格,號稱 C++0x。VC 2010會支援全套的C++0x規格。

C++0x FAQ

Move Constructor 可以處理掉某些效能上的問題,應該是個頗實用的東西。

接下來聽到的是,xperf的介紹。

這是一套效能分析的工具組, Windows Performance Toolkit ,功能很強大。甚至能夠收集處理Disk I/O, seek time, content switch的資料。

找時間要抓來瞧瞧。

接著下午聽了一個重頭戲, Cascade Shadow Map 。

只不過裡頭的內容,早就發表在 MSDN 上了。微軟還是有點混。

Common Techniques to Improve Shadow Depth Maps

Cascade Shadow Map 在當前,基本上已經成為影子計算的最佳解法了, God of War III 用到它,Uncharted 2 也用到它,更不要說PC上的遊戲了,WOW已經用了,你要不要跟進咧?

微軟一天的課程結束,把問卷填一填,換了一件 T-Shirt。還滿好穿,不過就是大了點。

2010年3月8日 星期一

GDC前的舊金山一日遊

今年的GDC是從週二開始,週一是我們多出來的一天調整時差以及城市旅遊日。因為是週一上班日,所以連續陪了我們兩年的地陪朋友,就沒辦法再來帶隊了。

這一回,因為也還是有幾位頭一次來舊金山的同事,所以,這一日遊的行程,就還是那樣,萬年不變的舊金山行程景點--漁人碼頭和金門大橋。

只不過這一次,我們是在舊金山自己找交通工具。

去漁人碼頭,叮噹車一定是首選。

DSC00828

DSC00829

叮噹車最有 fu 的搭乘方法呢,就是抓住車旁的欄杆,然後一路上這麼掛著,到了站,直接跳下車。不過今天早上氣溫很低,這樣掛著吹風不是好事...

我們從 Powell Street 上車,經過幾個上下坡,就可以到漁人碼頭。

如果叮噹車沒有壞掉的話。

DSC00831

就在最後一個下坡之前,叮噹車壞掉了,只見前面的駕駛員 ( 很高很壯,就像哈利波特裡的海格那種體型 ) 跳下車,大喊"Take off”,叫後面的售票員下車,然後..兩個人就這樣連人帶車..在“推車”啦!!!

車子開始動,兩個人就跳上車,前面的駕駛員用煞車控制車速,就這樣讓車子滑進了終點站。

DSC00834

DSC00837

這次來漁人碼頭,也還是只有遠遠的眺望惡魔島,真的,如果還有下次的話,應該要坐船到惡魔島上去逛逛。

DSC00839

吃完午餐,一群人就走到公車站牌,坐公車到金門大橋去。公車很貴,成人票2元。( 不過後來才知道,這個票不是算次數的,算時間的....)

這次到金門大橋,就可以有很充裕的時間多走一走了,前幾次真的只是拍照來個到此一遊而已。

DSC00847

DSC00853

橋上還有兩個警告,貼得到處都是。

DSC00852

不准從橋上丟東西或飛彈(??)

DSC00854

『還有希望,打個電話吧!』『從橋上跳下去的結果是致命而悲慘的..』

兩個景點晃完,就回到飯店房間宅一下,準備到GDC會場去領識別證去....

2010年2月23日 星期二

Carmack的終身成就獎

今天看到這則新聞,John Carmack Wins GDC Lifetime Achievement Award。神人卡馬克將獲得終身成就獎。

於是我想起了之前看過的Doom電影。

我大概是第二次或第三次重看 ( 因為電影台老是一直重播,真的不是我愛看.... ) 的時候,突然發現,耶,怎麼有個卡馬克博士?

網路上面查了一查,原來真的有這樣一個 Dr. Carmack 的角色,而且還是整個作怪的基地上的首席科學家。也就是 Dr. Carmack 發出了求救訊息之後,巨石強森那一夥軍人才會趕來救援。

然後,Dr. Carmack 就被怪物蹂躪了。

Dr. Carmack 出現的時間非常短,好像也沒什麼台詞。

但是短短幾秒鐘,已經向 John Carmack 致上最崇高敬意了。

( 雖然說,死得也是很慘.... )

220px-Robert_Russell

找不到劇照,只好用演員的照片。注意,這是演 Dr. Carmack 的演員,不是 John Carmack 本人,不過面相似乎有些神似....呵....

2010年1月25日 星期一

Multi-Thread Debugger

前幾天,下載了Visual Studio 2010 Beta版來安裝,人家問,有什麼新功能值得裝來的呀?

我也不知道。

回頭看了一看,有些附加功能 -- 效能分析、單元測試、程式碼靜態分析....好像都提不起勁....

然後是這個 – Multi-Thread Debugger。

啊....發現好東西....

Multi-Thread的時代,一定要有Multi-Thread 的Debugger啊!!

趕快開了個Multi-Thread的專案來測試。

未命名vs10_thread

當我在主緒中斷的時候,左邊的這個Thread視窗,會列出執行中的執行緒,在執行緒上點擊兩下,就會跳到所選擇的執行緒上,右邊視窗就可以看到這個執行緒的Call Stack,同時也可以知道變數的數值。

於是,多個執行緒的狀況可以同時掌握,對多緒程式的除錯真是一大福音啊....

VS 2010還有一個Parallel Stacks的視窗。不過我還看不出來它的用途。

未命名vs10_call_stack

VS 2008好像也有多緒除錯的功能,不過說實話,VS 2008沒有去詳細探究。畢竟人家說,VS 2008跟Vista一樣是個失敗品啊...

2010年1月12日 星期二

3dsMax Exporter Plug-in (3)

Well, 我們的Exporter還沒做完。

我們在MyExporter1::DoExport設定中斷點,會發現,這個函式會在我們選定了輸出檔,按下存檔之後才被呼叫。這時候,就開始了輸出工作。

首先會看到一個對話盒。

DoExport的程式碼裡,也就呼叫這個對話盒而已,實際輸出工作的呼叫,還是得要我們自己來。

clip_image001

這個對話盒是project wizard幫我們建立的,專案裡面有一個rc檔,我們可以打開來自己改。

例如,改成這樣,

clip_image002

我們可以將輸出時候需要的設定與選項,放在這對話盒裡頭,使用者按下了OK,實際的輸出工作就會開始進行了。

接下來,我們真的要開始從Max抓資料了。

Max有SDK,SDK也有Help文件。但是我們看習慣了MSDN, DirectX SDK文件之後,會發現Max SDK的文件真的是弄得很糟糕。但是我們還是得看。

有總比沒有好。

為了讓程式碼結構清晰些,我們建立一個ExporterPipeline物件來做這一堆苦工。

class CExporterPipeline
{
public:
    CExporterPipeline();
    ~CExporterPipeline();
    HRESULT Create(const char* model_name,const ExporterParameters& param);
    void SyncData();
    HRESULT Destroy();
private:
    void BeginSync();
    void EndSync();
    void SyncScene();
    void SyncGameNodeTree(int level,IGameNode* node,IGameNode* parent_node);
    void SyncGameNode(int level, IGameNode* node,IGameNode* parent_node);
    void SyncGameNodeGameObject(IGameNode* node, IGameObject* go);
    void SyncGameNodeMesh(IGameNode* node, IGameMesh* gm);
    void SyncGameNodeMaterial(IGameNode* node);
    void SyncGeometryData(IGameNode* node,IGameMesh* gm);
    void SyncMaterial(IGameNode* node, int matid, Mtl* mtl);
    void UpdateMeshSkinVertex(IGameNode* node,IGameMesh* gm);
    void UpdateNodeFrameAnimation(IGameNode* node);
private:
    Interface* m_MaxCore;
    IGameScene* m_Scene;
    IGameConversionManager* m_ConversionMgr;
    FILE* m_fpExportFile;
    ExporterParameters m_ExportParameters;
    int m_nTotalNodeCount;
    int m_nProgressNodeCount;
    std::vector<int> m_GameNodeIDArray;
};
extern CExporterPipeline g_ExporterPipeline;

ExporterPipeline只有幾個public函式: Create, SyncData, Destroy。其餘的苦工全部寫在private函式裡。

我們在MyExporter1::DoExport裡面這樣呼叫 :

int    MyExporter1::DoExport(const TCHAR *name,ExpInterface *ei,Interface *i, BOOL suppressPrompts, DWORD options)
{
    #pragma message(TODO("Implement the actual file Export here and"))
    if(!suppressPrompts)
        DialogBoxParam(hInstance,
                MAKEINTRESOURCE(IDD_PANEL),
                GetActiveWindow(),
                MyExporter1OptionsDlgProc, (LPARAM)this);
    ExporterParameters params;
    g_ExporterPipeline.Create(name,params);
    g_ExporterPipeline.SyncData();
    g_ExporterPipeline.Destroy();
    #pragma message(TODO("return TRUE If the file is exported properly"))
    return FALSE;
}

Create建立需要的物件與檔案,SyncData處理資料輸出,Destroy清除物件以及關閉檔案。

大致上外部的步驟就這樣。細節都藏在Exporter Pipeline裡,下回再繼續吧...

2009年12月27日 星期日

3dsMax Exporter Plug-in (2)

在實際執行之前,要先改一些程式碼。

打開專案程式的主檔案MyExporter1.cpp。

clip_image002

這個就是我們的Exporter主物件。從SceneExport繼承而來。

DoExport函式是實際進行輸出工作的入口函式。其他還有一些設定的函式,不過只有設定輸出檔副檔名的Ext函式比較重要。

int MyExporter1::ExtCount()
{
    #pragma message(TODO("Returns the number of file name extensions supported by the plug-in."))
    return 1;
}

const TCHAR *MyExporter1::Ext(int n)
{       
    #pragma message(TODO("Return the 'i-th' file name extension (i.e. \"3DS\")."))
    return _T("me1");
}

const TCHAR *MyExporter1::LongDesc()
{
    #pragma message(TODO("Return long ASCII description (i.e. \"Targa 2.0 Image File\")"))
    return _T("My Exporter Sample 1");
}
const TCHAR *MyExporter1::ShortDesc()
{           
    #pragma message(TODO("Return short ASCII description (i.e. \"Targa\")"))
    return _T("My Exporter 1");
}

我們把 ExtCount, Ext, LongDesc, ShortDesc 函式簡單實做之後,重新編譯一次。

然後,從 Visual Studio Debug 執行它。

跑不起來是正常的。

打開專案的 Property 設定,在 Debugging –> Command 那一項,把 3ds max 的執行檔設定進去。

clip_image002[9]

然後我們可以 Start Debugging。

Visual Studio 會啟動 3ds max,而 max 會將我們的 plug-in load 進去。

我們的 exporter 是在 export 檔案時才會用到的,所以,先 export 看看。

我們會在存檔類型那裏,找到我們的輸出檔格式。

clip_image001

到這裏,我們的 exporter 算是可以掛上 max 系統裡了。