По мнению Олега главного потока должно хватить для игры, если код будет оптимизированным. И за многопоточность нужно браться только в крайнем случае, потому что это сильно затрудняет работу с кодом. Также присутствует проблема с нагреванием устройства, за котором может последовать троттлинг. <br> Если все же прибегать к многопоточности, то наилучший подход - это выполнять Джобы во второстепенных потоках. Джобы должны принимать параметры перед запуском во второстепенных потоках и не лезть за данными во внешнюю область. При этом периодически, когда это удобно основному потоку(ОП), основной поток проверяет, завершился ли Джоб. Если завершился, то прочитать результат, когда это будет удобно ОП. <br> Если все же Джобы будут лезть за данными во внешнюю область, то нужно использовать модификатор **volatile** или **concurrentQueue** ### Volatile Для переменной указывается модификатор **volatile**, если к переменной могут обратиться джобы из разных потоков. Модификатор запрещает потоку кешировать переменную. Модификатор можно использовать для переменных размером 4 байта и меньше. С ссылками, в этом плане, проблем нет, потому что ссылки всегда занимают 4 байта. Однако, джобы пойдут дальше и будут в самом классе читать/менять поля, поэтому это нужно отдельно контролировать. Если не запретить кешировать переменную, то есть риск, что какой-то поток не получит актуальную информацию о значении. Пример проблемы, которая может возникнуть, если не воспользоваться модификатором: - Поток 1 закешировал у себя значение переменной (Пусть будет «2») - Поток 2 изменил значение переменной. Теперь оно «4» - Потоку 1 понадобилась эта переменная, поэтому он читает значение. Но так как он закешировал значение переменной, то он думает что значение «2», а не «4». ![Многопоточность (Multithreading)](images/Многопоточность%20(Multithreading).png) <br> ### СoncurrentQueue Отдельная большая тема, которую нужно разобрать.