2015-10-13 44 views
-1

我正在使用opengl爲android-ndk創建一個小型2d遊戲引擎。 我面臨着如何改變關卡的難度,例如。從菜單到遊戲屏幕。 由於使用glGenTextures加載遊戲畫面的新紋理時紋理ids無法正常工作,因此glGenTextures會一直返回重複的ids。加載新的級別OpenGL

// 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上下文,並且它工作正常。

並請讓我知道,如果需要更多的信息

+1

這就是有點難以回答沒有一小段代碼!試着給我們一個簡單的例子,說明你如何改變你的關卡以及如何處理你的紋理。 –

+0

@MartinHennig是否足夠描述? – amuTBKT

回答

0

glGenTextures不斷返回重複的ID

不應該發生的,除非你具有該ID的地方(否則)刪除紋理或者結束於不同的GL上下文中。

我面臨着如何改變水平的困難,從菜單到遊戲屏幕。

就像繪製不同的東西一樣簡單。有兩個功能draw_menudraw_level;也許是draw_loadingscreen,當你在加載屏幕或菜單中時,你可以替換關卡使用的所有東西。

或者您可以使用現代流式方法,您不需要在菜單,加載屏幕和級別之間進行區分,而是在繪製每個框架時收集繪製它所需的資源,加載尚未加載到GL上下文中的內容以及然後畫。

刪除GL資源大部分可以轉移到後臺垃圾回收例程中。即遊戲的每個資源的每一幀都增加一個計數器;在框架設置中,當您實際要繪製它時,將計數器重置爲零。一旦計數器達到某個閾值,您就刪除它。如果在將資源加載到GL時遇到內存不足的情況,您可以通過具有最高計數器值的資源向下工作,從GL上下文中刪除它們。

+0

我在更換屏幕時不會刪除紋理,所以我認爲這不是問題。是否有任何限制我們可以加載文字的地方,如只在onSurfaceCreated,onSurfaceChanged或onDrawFrame? – amuTBKT

+0

@amuTBKT:好吧,像任何GL操作一樣,紋理加載僅限於使GL上下文變爲當前的塊。當GL上下文處於香草狀態時調用'onSurfaceCreated';請注意,在Android上,您可以隨時釋放上下文,並且可能需要重新創建資源。在這方面'onSurfaceCreated'是創建紋理和其他永久資源的好地方。否則,只能在'onDrawFrame'和'onSurfaceChanged'中保證GL上下文。如果你實現流GL資源更新'onDrawFrame'將是去的地方。 – datenwolf

+0

所以,我加載'onSurfaceChanged' onDrawFrame'的資源,但它仍然行不通! – amuTBKT

0

因此,事實證明,我正在監聽OnTouch()方法中的更改屏幕方法,該方法顯然運行在與opengl不同的線程上,因此每件事情都崩潰了。所以我不得不添加一個回調,它將改變onDrawFrame中的屏幕,並解決了問題。 感謝您的幫助:)