我正在用Android NDK和opengl es 2.0为Android开发一个小游戏引擎,最近项目变大了,我需要重构一些代码,我找不到下一个问题的合适设计模式。
在 android 上,当应用程序达到 OnPause() 状态时,opengl 上下文被销毁,但 java 和 c++ 中的变量和对象的状态保持不变。所以每次播放器暂停并恢复应用程序时,我都必须重新初始化 opengl 部分、缓冲区、着色器、顶点等。
我有像“Square”这样制作“方形对象”的类,每个都有自己的属性,并且每个“方形对象”都可以绘制,因此方形可以访问使用的类的静态(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
所以我想为类设置一些(静态/硬编码)变量,然后在创建 opengl 上下文时,以“魔术”方式初始化该类,并且不需要为每个调用编写一个 init 方法班级。
我尝试使用继承,但问题是我需要初始化类而不是对象,还尝试实现一个静态对象并在 cpp 文件中初始化该对象,并将指向该对象的指针存储在向量中这是在他的构造器中创建的,在对象自己的类中的向量中,但是这种设计给我带来了很多问题。
有谁知道一些可以帮助我的设计?
编辑:我的班级结构
该init()
函数非常大,因为shader
参数frag
是路径文件,我对它们执行一些任务,将执行的结果传递给 opengl 并返回我一个ID
程序静态变量,所有带有 opengl 部分的类都实现了相同的过程,参数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:
}