【问题标题】:Loading new level OpenGL加载新关卡 OpenGL
【发布时间】:2015-10-13 16:11:11
【问题描述】:

我正在使用 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 都搞混了

我基本上是从我使用 GLUT 来创建 OpenGL 上下文的 Windows 应用程序中移植它,并且它工作正常。

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

【问题讨论】:

  • 如果没有一小段代码,这有点难以回答!试着给我们一个简单的例子,说明你如何尝试改变你的关卡以及你如何处理你的纹理。
  • @MartinHennig 描述够了吗??

标签: opengl-es android-ndk


【解决方案1】:

glGenTextures 不断返回重复的 ID

这不应该发生,除非您在某处(其他)删除具有该 ID 的纹理或最终进入不同的 GL 上下文。

我在如何更改级别方面遇到困难,例如。从菜单到游戏画面。

就像画不同的东西一样简单。有draw_menudraw_level两个功能;可能是draw_loadingscreen,当您在加载屏幕或菜单中时,您可以替换关卡使用的所有内容。

或者您可以使用现代流方法,您不区分菜单、加载屏幕和关卡,而是在绘制每一帧时收集绘制它所需的资源,将尚未加载的内容加载到 GL 上下文中,然后画。

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

【讨论】:

  • 更换屏幕时我不会删除纹理,所以我认为这不是问题所在。我们可以在哪里加载文本是否有任何限制,例如仅在 onSurfaceCreated、onSurfaceChanged 或 onDrawFrame 中?
  • @amuTBKT:嗯,就像任何 GL 操作一样,纹理加载仅限于 GL 上下文处于当前状态的块。 onSurfaceCreated 在 GL 上下文处于 vanilla 状态时调用;请注意,在 Android 上,您可以随时释放上下文,并且可能必须重新创建资源。在这方面onSurfaceCreated 是创建纹理和其他持久资源的好地方。否则,您只能在onDrawFrameonSurfaceChanged 中保证有一个GL 上下文。如果您实现流式 GL 资源更新,onDrawFrame 将是您的理想去处。
  • 所以,我正在加载onSurfaceChangedonDrawFrame 中的资源,但还是不行!!
【解决方案2】:

所以事实证明我正在监听 OnTouch() 方法中的更改屏幕方法,该方法显然在与 opengl 不同的线程上运行,因此每件事都分崩离析。所以我不得不添加一个回调,它会改变 onDrawFrame 中的屏幕,它解决了这个问题。 感谢您的帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    相关资源
    最近更新 更多