我正在開發Android的小遊戲引擎與Android NDK和opengl ES 2.0,最近該項目變得越來越大,我需要重構一些代碼,我不能'爲下一個問題尋找合適的設計模式。初始靜態成員的C++設計,任何時候需要
在android上,當應用程序到達OnPause()狀態時,opengl上下文被銷燬,但是java和C++中變量和對象的狀態被保留。所以每次玩家暫停和恢復應用程序,我必須重新初始化opengl部分,緩衝區,着色器,頂點等。
我有類似「方形」的「方形對象」,每個都有自己的類屬性,並且可以繪製每個「方形對象」,所以方塊可以訪問該類的靜態(opengl)成員,這些成員用於正確渲染。所以這個靜態成員必須在繪製對象之前初始化,我在創建或重新創建opengl上下文時執行它。每個類都有自己的opengl屬性,所以每個類都有自己的參數單獨初始化,所以我想要一個設計,每個類可以設置一些初始參數,傳遞或捕獲這些參數來初始化靜態成員班(我忘了說這些參數是私人的)。但正如我之前所說,每次應用程序恢復時都需要重新初始化這些參數。
目前我初始化這些成員分別喜歡
Square::init(/*hardcoded parameters*/);
Circle::init(/*hardcoded parameters*/);
Triangle::init(/*hardcoded parameters*/);
Polygon::init(/*hardcoded parameters*/);
Shape::init(/*hardcoded parameters*/);
.
.
.
.
// Many other inits.....
.
,我想寫類似
// here all the classes with opengl part are initialized
// all init methods of each class are called here, with their respective parameters
Opengl_Initializer::init(); // <--- magic way, no other init calls
所以我想一些(靜態/ harcoded)變量設置爲分類,然後當將創建opengl上下文,該類將以「魔術」方式進行初始化,而不需要爲每個類的init方法編寫調用代碼。
我試過使用繼承,但問題是我需要初始化類而不是對象,也試圖實現靜態對象並在cpp文件中初始化此對象,並存儲指向對象的指針在一個矢量中,當它是在他的構造器中創建的時候,是一個在該對象自己的類中的向量,但是這種設計給了我很多問題。
有誰知道一些可以幫助我的設計?
編輯:我的課
的init()
功能的stucture是非常大的,因爲shader
和frag
參數路徑文件,我對他們執行一些任務,合格的結果進行,以OpenGL和返回我一個ID
這是該程序靜態變量,用OpenGL部分的所有clases實現這個同樣的過程,參數camera
是把它連接到相機
class Square {
// static variable all classes have
static GLuint program;
// other glparameters not in common, initialized in the same static init() method
static GLint uniform1;
static GLint uniform2;
public;
// the static init function has the same header on all the classes
static init(const char* shader, const char* frag, const char *camera);
}
也許有些結構我想是
class Square {
static GLuint program;
static const char *vertex = "hardcode";
static const char *frag = "hardcode";
static const char *cam = "harcode";
static init();
/// or somethig like
static Initializer init(
"harcode shader", "hardcode frag", "hardcode camera",
[&] (void) ->void {
//this is the init function
}
);
public:
}
將所有內容加入到一個Singleton中。 –
@πάνταῥεῖ是的,我曾經想過,但也是一樣的,我必須爲每個類調用'init()',你會如何實現它? – quetzalfir
C++沒有辦法迭代現有的類,如Java /。網有 - 如果你對此有所瞭解。所以你需要直接調用「init」或存儲指針。你的類在「init」函數中有什麼共同點? – Evgeniy