我正在使用opengl为android-ndk开发一个小型2D游戏引擎。 我在如何改变等级方面遇到困难,例如。从菜单到游戏屏幕。 因为使用glGenTextures为游戏屏幕加载新纹理时纹理ID不起作用,glGenTextures会不断返回重复的ID。
// class to bind ndk with java
Renderer.java
void onSurfaceChanged(gl, width, height){
nativeSurfaceChanged();
}
void onDrawFrame(){
nativeDrawFrame();
}
// c++ code
Game.cpp
Screen *screen;
void SetScreen(Screen *scrn){
screen = scrn;
// load textures and create openGL objects (mesh and textures)
screen->Initialize();
}
void Update(){
screen->Update();
screen->Render();
}
NDKActivity.cpp
Game *game;
void nativeSurfaceChanged(){
// initlizes stuff like audio engine, rendering engine
game->Initialize();
// set current screen to main menu
game->SetScreen(new MainMenu());
}
void nativeDrawFrame(){
game->Update();
}
MainMenu.cpp
void Update(){
// if some button is clicked
game->SetScreen(new GameScreen());
}
现在初始化菜单时,一切正常。但在加载GameScreen时,textue id会混淆
我基本上从Windows应用程序移植它,我使用GLUT创建OpenGL上下文,并且它工作正常。
如果需要更多信息,请告诉我
答案 0 :(得分:0)
glGenTextures不断返回重复的ids
这不应该发生,除非您在某处(其他地方)删除具有该ID的纹理,或者在不同的GL上下文中结束。
我在如何改变等级方面遇到困难,例如。从菜单到游戏屏幕。
与绘制不同的东西一样容易。有两个函数draw_menu
和draw_level
;可能是draw_loadingscreen
,当您在加载屏幕或菜单中时,您可以替换关卡所使用的所有内容。
或者您可以使用现代流媒体方法,在这里您不区分菜单,加载屏幕和关卡,而是在绘制每个框架时收集绘制它所需的资源,加载尚未加载的内容进入GL语境然后画出。
删除GL资源大部分可以卸载到后台垃圾收集例程中。即每个框架为您的游戏的每个资源增加一个计数器;在框架设置中,当您实际要绘制它时,将计数器重置为零。一旦计数器达到某个阈值,您就将其删除。如果在将资源加载到GL时遇到内存不足的情况,您可以通过具有最高计数器值的资源向下工作,从GL上下文中删除它们。
答案 1 :(得分:0)
因此事实证明我在OnTouch()方法中正在侦听更改屏幕方法,该方法显然运行在与opengl不同的线程上,因此每件事都崩溃了。所以我不得不添加一个回调,这将改变onDrawFrame中的屏幕,并修复了问题。 谢谢你的帮助:)。