2015-10-13 2 views
-1

Я работаю над небольшим 2d игровым движком для android-ndk, используя opengl. У меня возникли трудности с тем, как изменить уровни, например. от меню до игрового экрана. Поскольку идентификаторы текстуры не работают при загрузке новых текстур для игрового экрана с использованием glGenTextures, glGenTextures сохраняет возвращаемые дубликаты идентификаторов.Загрузка нового уровня 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 текстовые идентификаторы все перемешались

Я в основном портировал его из приложения Windows, где я использовал GLUT для создания контекста OpenGL, и там он работал нормально.

И, пожалуйста, дайте мне знать, если больше информации необходимо

+1

Это немного сложно ответить без небольшого фрагмента кода! Просто попробуйте дать нам минималистский пример того, как вы пытаетесь изменить свои уровни и как вы относитесь к своим текстурам. –

+0

@MartinHennig это достаточно описание ?? – amuTBKT

ответ

0

glGenTextures продолжает возвращаться дублированные идентификаторы

Это не должно произойти, если вы не удалите текстуру с этим идентификатором где-то (еще) или в конечном итоге в другом контексте GL.

У меня возникли трудности с тем, как изменить уровни, например. от меню до игрового экрана.

Это так же просто, как рисовать что-то другое. Имеют две функции: draw_menu и draw_level; возможно, draw_loadingscreen, и пока вы находитесь на экране загрузки или меню, вы можете заменить все, что использует уровень.

Или вы можете использовать современный потоковый подход, в котором вы не различаете меню, загружаете экран и уровень, а вместо этого при рисовании каждого кадра собираете ресурсы, необходимые для его рисования, загружаете то, что еще не загружено в контекст GL и затем нарисуйте.

Удаление ресурсов GL может быть в основном выгружено в обычную процедуру сбора мусора. То есть каждый кадр для каждого ресурса вашей игры увеличивает счетчик; в настройке кадра, когда вы на самом деле собираетесь его нарисовать, вы сбросите счетчик на ноль. Как только счетчик достигнет определенного порога, вы удалите его. Если при загрузке ресурсов в GL вы попадаете в состояние нехватки памяти, вы можете работать самостоятельно через ресурсы с наивысшим значением счетчика вниз, удаляя их из контекста GL.

+0

Я не удаляю текстуры при смене экранов, поэтому я думаю, что здесь не проблема. Существуют ли ограничения на то, где мы можем загружать тексты, например, только в onSurfaceCreated, onSurfaceChanged или onDrawFrame? – amuTBKT

+0

@amuTBKT: Ну, как и любая операция GL, загрузка текстуры ограничена блоками, в которых контекст GL становится текущим. 'onSurfaceCreated' вызывается, когда контекст GL находится в состоянии ванили; обратите внимание, что на Android вы можете потерять контекст в любое время, и ресурсы, возможно, придется воссоздать. В этом отношении 'onSurfaceCreated' является хорошим местом для создания текстур и других постоянных ресурсов. В противном случае вы гарантированно должны иметь контекст GL только в 'onDrawFrame' и' onSurfaceChanged'.Если вы будете внедрять потоковые обновления ресурсов GL, то «onDrawFrame» будет местом, где нужно идти. – datenwolf

+0

так что я загружаю ресурсы в 'onSurfaceChanged'' onDrawFrame', но все равно это не сработает !! – amuTBKT

0

так, как оказалось, я слушал метод смены экрана в методе OnTouch(), который, очевидно, работает на разных потоках, чем opengl, и поэтому каждая вещь разваливается. Поэтому мне пришлось добавить обратный вызов, который изменил бы экран в onDrawFrame и устранил проблему. спасибо за помощь :)

Смежные вопросы