Я некоторое время изучал и делал маленькие игры, и недавно решил, что попытаюсь разработать игры для Android.
Для меня переход с нативного кода C ++ на Android Java не был таким уж сложным, но у меня возникают головные боли, когда я думаю о том, как мне сохранить логику отдельно от рендеринга.
Я читал здесь и на других сайтах, что:
Лучше не создавать для этого другую ветку, просто потому, что
У Android наверняка не возникнет проблем с обработкой.
Значение кода будет примерно таким:
public void onDrawFrame(GL10 gl) {
doLogicCalculations();
clearScreen();
drawSprites();
}
Но я не уверен, что это будет лучшим подходом. Поскольку я не думаю, что мне нравится, как это будет выглядеть, если я помещу свою логику в метод GLRenderer::onDrawFrame
. Насколько я знаю, этот метод предназначен только для рисования, и я могу замедлить кадры, если я добавлю туда логику. Не говоря уже о том, что в моем понимании это вредит понятиям ПОО.
Я думаю, что использование потоков может быть способом, вот как я планировал:
Основная деятельность:
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();
}
}
Это грубая идея, не полностью завершенная.
Этот шаблон будет держать все это отдельно и будет выглядеть немного лучше, но лучше ли это для производительности?
Пока я исследовал, большинство примеров многопоточных игр используют холст или вид с поверхности, они не подходят для моего случая, потому что я использую OpenGLES.
Итак, вот мои вопросы:
Какой лучший способ отделить мой
игровая логика от рендеринга при использовании OpenGLES? Заправка моего
приложение? Поместите логику в отдельный метод и просто вызовите ее из
метод ничьей?