作者TeaEEE (愛不趴 不愛趴)
看板C_and_CPP
標題Re: [問題] 想了解遊戲業者如何做跨平台遊戲
時間Tue Oct 12 10:27:00 2010
※ 引述《QQ29 (我愛阿蓉)》之銘言:
: l大第一種作法的話
: user應該只看的到
: Renderer這層interface吧
: 所以l大這方法還必須export CreateInstance這function給user呼叫
: 然後要new哪一個instance的實作
: 還是必須用第二種方法判定嗎?(#if OPENGL #else DXD)
: 目前比較無法理解 第一種作法如果沒搭配上面講的話 該怎麼做到
: 上層不需要管用opengl還是dxd的方法....
: 所以在這層也是必須要寫兩分code
: 針對opengl和dx分別寫兩套同樣目的的程式碼嗎?
: 謝謝
在問問題前先想像一下,如果我被分派做遊戲的繪圖引擎工作時,我最該注重的是什麼?
是程式碼的共code?還是引擎表示出的效能?所以,做引擎開發工作時,為了發揮出平
台100%的能力,大概除了界面以外,都是分離的程式碼。
但如果你是做為腳本開發人員,對邏輯的一致性重於效能,這時可能就需要底層提供大量
的函式庫,在不同平台間提供相同的界面,讓邏輯能表示一致,這時的共code程度就會很
高。
至於要不要用CreateInstance的做法,應該要看你的平台是同時支援OpenGL/DirectX或是
只支援其中一種?2者都支援時才需要做CreateInstance,否則也可簡單到直接new出來使
用。我這裡指的直接new,是指下面的class Renderer直接實做而非抽象的介面層,因為
只支援一個平台且共code低,程式應該會是完全不同的專案(你會有二個同名的class但是
實做完全不同),二專案的介面一致是透過文件來定義,不需再多控管其介面層。
: ※ 引述《littleshan (我要加入劍道社!)》之銘言:
: : 比較漂亮的作法:
: : class Renderer { // 某個處理繪圖用的 abstract class
: : public:
: : virtual void render(const Scene& scene) = 0; // 把場景畫出來
: : };
: : class RendererD3D9 : Renderer {
: : public:
: : void render(const Scene& scene)
: : {
: : // 使用 DirectX 進行繪圖
: : }
: : };
: : class RendererGL : Renderer {
: : public:
: : void render(const Scene& scene)
: : {
: : // 使用 OpenGL 進行繪圖
: : }
: : };
: : 比較醜但是直接的做法
: : void Render(const Scene& scene)
: : {
: : #ifdef USE_OPENGL
: : // 使用 OpenGL 進行繪圖
: : #else
: : // 使用 DirectX 進行繪圖
: : #end
: : }
: : 說穿了也沒什麼神奇的
: : 當然其中也有一些技巧就是了 (比如 abstract factory pattern)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 219.87.85.162
推 linjack:話說現在寫得很好的開源3D引擎非常多 10/12 10:31
→ linjack:本串裡提到的很多問題,好像去瞥一下人家的src就都好了.. 10/12 10:32