Я учился и делал небольшие игры некоторое время, и в последнее время я решил, что я попытаюсь разработать игры для Android.
Для меня прыжок с родного кода на С++ на Android Java был не таким уж трудным, но мне больно думать о том, как я могу поддерживать логику отдельно от рендеринга.
Я читал здесь и на других сайтах, которые:
Лучше не создавать для него еще один поток, просто потому, что Android наверняка не будет иметь проблем для обработки.
Значение кода будет примерно таким:
public void onDrawFrame(GL10 gl) {
doLogicCalculations();
clearScreen();
drawSprites();
}
Но я не уверен, что это лучший подход. Поскольку я не думаю, что мне нравится, как это будет выглядеть, если я положу свою логику внутри метода GLRenderer::onDrawFrame
. Насколько мне известно, этот метод предназначен только для рисования, и я могу замедлить фреймы, если я поставлю туда логику. Не говоря уже о том, что это вредит концепциям POO в моем понимании.
Я думаю, что использование потоков может быть таким, как я планировал:
Основная деятельность:
public void onCreate(Bundle savedInstanceState) {
//set fullscreen, etc
GLSurfaceView view = new GLSurfaceView(this);
//Configure view
GameManager game = new GameManager();
game.start(context, view);
setContentView(view);
}
GameManager:
OpenGLRenderer renderer;
Boolean running;
public void start(Context context, GLSurfaceView view) {
this.renderer = new OpenGLRenderer(context);
view.setRenderer(this.renderer);
//create Texturelib, create sound system...
running = true;
//create a thread to run GameManager::update()
}
public void update(){
while(running){
//update game logic here
//put, edit and remove sprites from renderer list
//set running to false to quit game
}
}
и, наконец, OpenGLRenderer:
ListOrMap toDraw;
public void onDrawFrame(GL10 gl) {
for(sprite i : toDraw)
{
i.draw();
}
}
Это грубая идея, которая не полностью завершена. Этот шаблон сохранит все его разделение и будет выглядеть немного лучше, но лучше ли это для производительности?
Пока я исследовал, большинство примеров многопоточных игр используют canvas или surfaceview, они не будут соответствовать моему случаю, потому что я использую OpenGLES.
Итак, вот мои вопросы:
Какой лучший способ отделить мой игровая логика из рендеринга при использовании OpenGLES? Прошивка моего выражение? Поместите логику в отдельный метод и просто вызовите его из метод рисования?