看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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