2011-06-02 36 views
5

我工作的律」的遊戲引擎,C++,並決定做這一切OOPily(大量使用類) 它的目的是(理論上)單個本地類實例交叉平臺,所以我有一個'引擎'類,它的一個實例由'OS Module'創建,它是Windows的WinMain(我首先開發的平臺)。C++ - 爲整個程序持續時間

我有三個主要問題:

  1. 是它認爲不良做法,以創建一個類,只是要在整個應用程序實例化一次?也許是因爲使用類而不是一堆函數會導致某種性能下降或額外開銷?

  2. 我一直計劃讓WinMain創建Engine的實例作爲局部變量。 Engine類會相當大,包含渲染,腳本解析,文件系統等的類。基本上,除了操作系統特定的代碼外,整個遊戲引擎將以某種形式包含在Engine類中(可能作爲一個實例)在WinMain函數中創建了一個非常大的Engine類的本地實例是一個壞主意?創建一個本地實例是一個壞主意,當程序啓動時會創建類,並在程序結束時結束?也許會更好?

  3. 我的計劃(i/wa)將引擎分成'模塊',每個模塊由一個類表示。引擎類將包含幾乎所有其他模塊的一個實例,如上所述,渲染,文件系統交互等。從某些角度來看,使用類作爲大型模塊的容器是一個壞主意(性能,設計,可讀性? )

感謝所有幫助:)

+6

這不是有史以來最偉大的問題,但與莎士比亞的一些東西相比,爲什麼downvote? – 2011-06-02 21:56:39

回答

4

因爲它們通常涉及與低級API(不是跨平臺)的高效交互,所以遊戲引擎不是跨平臺性的主要候選對象。

類的大小取決於它包含的成員變量,而不是它實現的函數的數量。

堆棧空間通常很小(http://msdn.microsoft.com/en-us/library/ms686774%28v=vs.85%29.aspx),而堆理論上與可用RAM一樣大。所以,如果你有一些非常大的東西,把它存儲在堆上(用新的)。

「啓動畫面」:在程序開始時不要完成所有工作。用戶在運行程序時討厭它,屏幕上沒有任何東西顯示,因爲你的程序正忙着初始化某些東西...... 查找懶惰實例化,基本上不做任何可以等待並且總是在屏幕上顯示的東西。

至於具體的答案: 1.不,假定沒有虛擬功能,應該沒有性能開銷。 2.請參閱上面的「啓動畫面」和「有限的堆棧空間」。 3.模塊化通常很好,只要確保每個班級都代表一個「事物」。但是,不要讓你開始忘記他們的名字和目的:)

+0

「類的大小取決於它包含的成員變量,而不是它實現的函數的數量。」 - 哦,當然。我其實已經忘記了:P謝謝,這個答案很有幫助。 – 2011-06-02 22:21:19

1
  1. 沒有,做什麼讓你的設計更清潔,更易於維護的建議。
  2. 沒有,直接用的FreeStore應儘量避免(即不使用new,除非你絕對必須的)
  3. 見#1
+0

關於1),CEGUI大量使用單例,並且是一種流行的輕量級GUI。 – 2011-06-02 21:55:45

1
  1. 沒有它不被視爲不好的風格。其實我知道,去沒有一個沒有應用程序框架,和著名的Singleton模式基本上是圍繞同一主題(但不同的,你要知道)

  2. 我無法想象,你的類是實際上那麼大。如果是這樣,把它放在堆上。然而,無論如何,這個類的實際內容會堆在堆上(我假設你會使用現有的容器類,那麼有100個會使用100個動態分配;這適用於STL容器)

  3. 無論你把它們放在數據段中,作爲棧中的汽車還是類的成員,它們會有什麼不同?我認爲這個課程充分體現了模塊化,並且可以讓你更輕鬆地完成任務(比如單元測試,或者將引擎重新用於純網絡版等)。)

2

是它認爲實習差 創建一個類,只會 是整個 應用程序實例化一次這麼多的班?也許是因爲有 某種性能命中或增加 使用類 而不是一堆功能產生的開銷?

根本不是。這基本上是因爲你的Application類可以做類似繼承和封裝的事情。沒有性能影響或額外開銷。

我已經打算要的WinMain 創建引擎實例作爲 局部變量。引擎類將 是相當大的,包含類 進行渲染,腳本解析,文件 系統的東西,等等。基本上, 整個遊戲引擎,除了OS 特定的代碼,將包含在 Engine類的一些形式 (可能作爲另一個 類的一個實例。)創建一個本地實例 我的超大引擎類 WinMain函數是一個壞主意? 創建一個本地實例不好主意 當這個類將被創建時 程序啓動,並且當 程序結束時結束?也許新的會更好嗎? 更好?

不是 - 這是非常適合的方式。爲什麼打擾堆分配?你想要自動銷燬語義。除非你的班級規模非常大,數百KB或更多,在這種情況下,基於RAII的堆分配更智能,因爲堆棧內存非常有限。也就是說,sizeof()報告的物理每個實例靜態大小,不包括動態分配。

我的計劃(I/WA)■劃分發動機 成「模塊」,其每一個是由類表示 。發動機 類將包含 幾乎所有其它模塊,就像一個實例,如 上面提到的,渲染,文件 系統交互等的使用 類爲巨大的模塊 從某些角度來看 一個壞主意容器(性能,設計,可讀性?)

這到底是換封裝,將程序分成明確定義和分離模塊,然後實例每一個你所需要的,是什麼對象爲導向的設計正是這個想法落後於面向對象的編程。一個類封裝的概念的大小通常被認爲是不相關的,只要它是一個單一的概念。明確的模塊化設計非常棒。

我建議對所有依賴於平臺的運行時繼承使用運行時繼承,並且最好在運行時動態加載它們(使用OS類執行動態加載)。這實施了一個可靠的編譯時抽象並允許更高效的編譯。