Вынесение физического движка игры в отдельный поток — распространённая практика, поскольку физические расчёты одни из самых накладных. 1
Для правильного выноса физического движка в отдельный поток можно предпринять следующие шаги:
- Разделить физический движок на два основных этапа. 1 На первом он ищет коллизии (столкновения) объектов. 1 На втором разрешает каждое из столкновений — вычисляет, какие скорости и их направления приобретают столкнувшиеся объекты. 1 Для второй стадии можно запустить множественные потоки для каждого солвера, чтобы они вычислялись параллельно. 1 Затем движок дождётся выполнения всех потоков, и настанет фаза синхронизации с игровой симуляцией. 1
- Избежать борьбы между потоками за общую информацию. 2 Если нужно читать данные из глобального объекта, но избежать этого, можно скопировать срез данных на момент запуска потоков. 2
- Использовать lock-free структуры данных. 2 Они позволяют потокам читать и писать в глобальный объект без data-races и крупных накладных расходов на синхронизацию. 2
Следует учитывать, что выбор решения зависит от конкретной ситуации, и общих рекомендаций по этому вопросу нет. 2