Очередной
годный пост от разработчика Box2d — в этот раз про детерминизм, который особенно важен при работе с физическим движком, т. к. нужна повторяемость.
- Тестировочный детерминизм. У Box2D модульные тесты через GitHub Actions. Так тестирует все аспекты, которые могут повлиять на детерминизм: MSVC, Clang, GCC, x64, ARM, быстрые движения и коллизии и т. д.
- Алгоритмический детерминизм. По сути, не должно быть случайностей. Запуская на той же машине, получаем тот же результат. В прошлой версии движка было проще, а вот в 3.0 сложнее...
- Многопоточный детерминизм. Разные ядра, разная скорость, синхронизация состояния. Всё это ведёт к рендому. Атомики и мьютексы не спасают. В Box2d детерминизм поддерживается за счёт битовых массивов, которые поддерживают порядок. Была
отдельная статья.
- Кроссплатформенный детерминизм. Ну, тут всё ясно. Но есть нюансы.
1. Быстрая математика. В угоду скорости уменьшается точность. Лучше не включать.
2. Инструкция Fused Multiply-Add. Штука не стандартизована, лучше отключать
-ffp-contract=off
.
3. Тригонометрия. Тригонометрические функции в стандартной библиотеке C зависят от компилятора. В Box2d свои аппроксимированные версии.