Сколько потоков следует использовать в игре для Android?


28

Как минимум, игра OpenGL для Android имеет поток пользовательского интерфейса и поток визуализации, созданный GLSurfaceView. Renderer.onDrawFrame()должен делать минимум работы, чтобы получить самый высокий FPS. Физике, ИИ и т. Д. Не нужно запускать каждый кадр, поэтому мы можем поместить их в другой поток. Теперь у нас есть:

  1. Нить рендерера - обновляйте анимацию и рисуйте полис
  2. Тема игры - Логика и периодические обновления физики, ИИ и т. Д.
  3. Поток пользовательского интерфейса - только взаимодействие с Android-интерфейсом

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

Ответы:


18

Крис Пруетт из Google рассказывает об этой проблеме в своем блоге на острове Реплики . Поскольку eglSwapBuffers () является блокирующим вызовом в потоке GLSurfaceView, наличие кода игровой логики в другом потоке позволяет ему выполняться, пока вызов буфера подкачки блокируется. Это важно, если ваша игра сложная и вы хотите достигать 60 кадров в секунду.

Вы можете скачать исходный код для Replica Island и посмотреть, как они это сделали. Я реализовал нечто подобное для своей игры (с тремя обсужденными вами темами), и это прекрасно работает.


2

Android поддерживает стандартные потоки Java. Вы можете использовать стандартные потоки и инструменты из пакета java.util.concurrent, чтобы поместить действия в фоновый режим. Единственным ограничением является то, что вы не можете напрямую обновлять пользовательский интерфейс из фонового процесса.

Если вам нужно обновить пользовательский интерфейс из фоновой задачи, вам нужно использовать некоторые классы для Android. Вы можете использовать класс android.os.Handler для этого или класс AsyncTasks.

Для более подробной информации, пожалуйста, проверьте следующую ссылку ....

http://mindstick.com/Articles/7a9205de-bae7-48ba-81b5-2b2ec161d672/?Thread%20in%20Android

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.