Каковы преимущества / недостатки игрового цикла в отдельном потоке?

#android #multithreading #performance

#Android #многопоточность #Производительность

Вопрос:

В примерах Android, таких как LunarLander, и многих других руководствах, написанных в блогах по всей сети, игровые циклы почти всегда запускают отдельный поток для вызова частей обновления состояния и рендеринга игры.

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

Я знаю, что это веская причина, хотя хотелось бы надеяться, что если ваша игра работает с приличной частотой кадров, приложение останется достаточно отзывчивым. Но есть ли какие-либо другие причины?

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

Комментарии:

1. «кроме этого». Это основная причина, по которой приложение остается отзывчивым.

2. Да, вы попали в самую точку. «Единственная причина, о которой вы можете подумать», оказывается, очень, очень веской причиной 😉

Ответ №1:

В Lunar lander и других приложениях для Android — важно, чтобы ваш surface view запускался в отдельном потоке, чтобы ОС Android не прерывала его из-за длительных процессов. Android сохраняет основной поток пользовательского интерфейса, используемый, среди прочего, для кнопок меню и «Домой», доступный для постоянного просмотра пользовательского ввода. Если ваше приложение замедляет работу основного потока, ОС отключит ваш поток и завершит игру.

Таким образом, запуск вашего игрового цикла из потока просмотра Surface позволяет игре запускаться максимально быстро, когда она находится в фокусе, но это также позволяет Android прерывать ее всякий раз, когда это необходимо, например, когда поступает вызов или пользователь нажимает кнопку home.

Комментарии:

1. Система приостанавливает / завершает работу вашего приложения с помощью методов onPause / onStop / onDestroy действия, верно? Вы все еще можете приостановить свой игровой цикл, когда эти методы вызываются с помощью перехватов в вашей игровой системе. Это должно заставить его хорошо взаимодействовать с системой, хотя я согласен, что если игра действительно запускается очень медленно, есть опасность, что система убьет ее за то, что она не отвечает.

2. Да, вы можете приостановить игровой цикл с помощью этих событий. Чего вы не хотите, так это прерывания вашей игры из-за замедления основного потока пользовательского интерфейса. И большинство игр будут, потому что они ресурсоемкие. Хорошо, когда ваш цикл прерывается из-за поступления вызова. Плохо, когда ваша игра прерывается, потому что это приводит к тому, что основной поток пользовательского интерфейса перестает отвечать. Это стало понятнее?