加载新级别的OpenGL

时间:2015-10-13 16:11:11

标签: opengl-es android-ndk

我正在使用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上下文,并且它工作正常。

如果需要更多信息,请告诉我

2 个答案:

答案 0 :(得分:0)

  

glGenTextures不断返回重复的ids

这不应该发生,除非您在某处(其他地方)删除具有该ID的纹理,或者在不同的GL上下文中结束。

  

我在如何改变等级方面遇到困难,例如。从菜单到游戏屏幕。

与绘制不同的东西一样容易。有两个函数draw_menudraw_level;可能是draw_loadingscreen,当您在加载屏幕或菜单中时,您可以替换关卡所使用的所有内容。

或者您可以使用现代流媒体方法,在这里您不区分菜单,加载屏幕和关卡,而是在绘制每个框架时收集绘制它所需的资源,加载尚未加载的内容进入GL语境然后画出。

删除GL资源大部分可以卸载到后台垃圾收集例程中。即每个框架为您的游戏的每个资源增加一个计数器;在框架设置中,当您实际要绘制它时,将计数器重置为零。一旦计数器达到某个阈值,您就将其删除。如果在将资源加载到GL时遇到内存不足的情况,您可以通过具有最高计数器值的资源向下工作,从GL上下文中删除它们。

答案 1 :(得分:0)

因此事实证明我在OnTouch()方法中正在侦听更改屏幕方法,该方法显然运行在与opengl不同的线程上,因此每件事都崩溃了。所以我不得不添加一个回调,这将改变onDrawFrame中的屏幕,并修复了问题。 谢谢你的帮助:)。