Я запускал простую симуляцию SpriteKit с множеством тел (800) 2x2 пикселя, используя PhysicsWorld под iOS11/Swift4 — рудиментарную систему частиц.
Он содержит простой радиальный гравитационный узел с 800 объектами, вращающимися вокруг него без использования обнаружения столкновений или контактов.
На моем тестовом оборудовании iPhone6S — я был действительно впечатлен достижением 60 кадров в секунду и супер плавной симуляцией — что открывает путь для гораздо большего исследования.
Единственная проблема, с которой я столкнулся, заключается в том, что производительность действительно непоследовательна.
Если я переключу напряженность поля гравитационного узла на высокое значение в середине прогона (это означает, что объекты перемещаются намного быстрее) — примерно в 25% прогонов симуляция может получить 60 кадров в секунду без проблем, но в остальных 3 из 4 запусков частота кадров падает до 3-4FPS
Если я вернусь к низкой напряженности поля (более медленным движениям), то снова всегда будет 60 кадров в секунду.
Я профилировал в XCode - и вижу, что ИНОГДА 3 или 4 потока даются приложению, что дает 60FPS, но в других случаях задаче дается только один поток - что означает корявую производительность
Я экспериментировал с Grand Central Dispatch и приоритетами потоков - безрезультатно - в любом случае единственный код, который работает в каждом кадре, - это PhysicsWorld, я ничего не делаю кадр за кадром.
Любые идеи, как я могу получить стабильные 60 кадров в секунду — поскольку аппаратное обеспечение способно на это — но только тогда, когда мне захочется!
Дополнительное примечание: если устройство подключено к Mac разработчика / на зарядке / USB / с запущенным XCode и т. д. - производительность чаще бывает хорошей при всех используемых потоках. Но попытка того же самого приложения, скажем, на следующий день, работающего автономно на устройстве (не подключенном к машине разработчика) - почти всегда очень низкая производительность - ГЛАВНАЯ ГОЛОВНАЯ ЦАРКА!