Files
owniverse/tests/artifacts/all_objects_speed6_results.md
T
Kirill e48d4bbe88 Add comprehensive tests and optimizations for simulation and UI performance
- Introduced a new benchmark save script to create a stress test scenario with extreme values for simulation performance.
- Added a full UI benchmark script to measure frame rates and performance metrics during UI interactions.
- Implemented tests for coarse generations to ensure population transitions are handled correctly.
- Created tests for extra parameters to validate the loading and application of configuration settings.
- Developed simulation optimization tests to verify the efficiency of population drift and rounding mechanisms.
- Added split optimization tests to ensure accurate allocation and rounding behavior in population management.
- Included startup parameter tests to confirm the correct initialization of global parameters before scene readiness.
- Enhanced the audit rounding ledger to compare selective and full rounding results for consistency.
2026-10-05 22:16:59 +03:00

9.9 KiB
Raw Blame History

Все объекты, скорость 6

Создано скриптом tests/create_full_benchmark_save.gd. Пароль нативного сохранения: qwerty. Генератор не читает и не перезаписывает сохранение игрока.

Начальное состояние: 151 запись каталога (включая группы), все 44 стадии правил цивилизаций, все шесть этик на каждой стадии, 1000 когорт (по десять на сущность с временными партиями). У большинства обычных объектов количество равно 6e60, у стадий цивилизаций — 6e20. Пространство и водород имеют количество 1e90, гелий и металлы — 1e80, энергия — 1e100. Возраст — 1e15 лет. Запасов достаточно для требований продвинутых стадий звезд и структур. Оставшиеся сроки жизни когорт покрывают весь срок жизни сущностей, поэтому переходы происходят во время замера.

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

Машина: Apple M4 Pro, Godot 4.7.2, рендерер Metal Mobile.

Замер Результат
Headless, скорость 6, шесть шагов по 0,5 секунды 943,936–1221,992 мс на шаг
Среднее время headless-шага 1122,287 мс
Пропускная способность headless 0,446 секунды симуляции на секунду CPU
Настоящий UI, страница цивилизаций, 600 кадров 17,38 FPS
Средний / p95 / максимальный кадр UI 57,55 / 99,78 / 116,94 мс
Завершенные транзакции 23
Запрошенный прирост игрового времени 3464662,267 лет
Опубликованный прирост игрового времени 1080000 лет
Пропускная способность с UI 0,3117
Накопленный долг за замер 2384662,267 игровых лет (23,85 реальных секунд на скорости 6)
Записей каталога осталось в конце 151

Динамический шаг достигает предела в 0,5 секунды. Рендеринг идет быстрее 5 FPS, но симуляция не успевает за заданным темпом в этом сценарии. На обработку поколений приходится примерно 94% времени CPU. Подготовка цивилизаций занимает в среднем 634 мс на шаг, в том числе дрифт этик — 218 мс, войны — 124 мс; колонизация — 121 мс на шаг. Интервалы профилировщика вложенные и частично перекрываются.

Сравнение оптимизации дрифта (2026-10-05)

Замеры сделаны на одном сгенерированном сохранении и одной машине до и после прямого распределения потоков для обычного и колониального дрифта, а также кеширования ставок дипломатии в фиксированной точке. Каждый headless-запуск выполняет шесть последовательных шагов по 0,5 секунды на каждой скорости.

Замер До После
Средний headless-шаг на скорости 6 1122,287 мс 1018,559 мс
Пропускная способность headless на скорости 6 0,446 0,491
Дрифт этик, сумма интервалов за шесть шагов 1,338 с 0,643 с
UI, FPS за 600 кадров 17,38 17,04
Средний / p95 / максимальный кадр UI 57,55 / 99,78 / 116,94 мс 58,70 / 102,67 / 114,30 мс
Завершенные UI-транзакции 23 25
Запрошено / опубликовано игровых лет в UI 3464662 / 1080000 3533627 / 1180000
Пропускная способность симуляции с UI 0,3117 0,3339

Средний headless-шаг ускорился примерно на 9,2%, а интервал профиля дрифта этик сократился примерно на 52%. Частота кадров UI практически не изменилась (в этом запуске снизилась примерно на 2%), при этом завершилось больше транзакций и выросла доля опубликованного игрового времени. На скорости 6 стресс-сценарий все еще отстает от реального времени: пропускная способность — около 0,49 секунды симуляции на секунду CPU в headless и 0,33 с UI. Самыми затратными остаются планирование поколений и войны.

Прямые пути сохраняют целое население, но разносят малые целочисленные потоки по нескольким последовательным переходам с помощью остатков для каждого источника. Поэтому распределение в отдельном переходе отличается от независимого округленного распределения по матрице 6×6. Ставки дипломатии округляются до сетки фиксированной точки с шагом 1e-9. Целевая регрессия: 769 проверок эволюции цивилизаций, оптимизаций симуляции, границ партий, укрупненных поколений и эволюции кадров; все пройдены.

Последующая оптимизация подготовки поколений и кешей (2026-10-05)

На той же нагрузке среднее время headless-шага на скорости 6 снизилось с 1018,559 до 1005,138 мс (примерно на 1,3%). Пропускная способность headless изменилась с 0,491 до 0,497. Суммарные интервалы generations близки: 5,703 с и 5,629 с за шесть шагов. Подготовка цивилизаций остается самой затратной измеренной подфазой — 3,130 с. UI также почти не изменился: 17,04 → 17,09 FPS, пропускная способность симуляции — 0,3339 → 0,3351. Улучшение небольшое: арифметика населения в поколениях по-прежнему дорога при сотнях активных когорт и множестве правил цивилизаций.

Профиль теперь отдельно показывает generation_withdrawal и generation_products. Первый интервал занимает 55,5 мс, второй — 120,2 мс за шесть headless-шагов на скорости 6. Эти значения нельзя складывать с общим временем поколений, поскольку интервалы профилировщика вложенные.

Инкрементальная обработка партий новорожденных (2026-10-05)

Удалены снимки когорт до и после рождения и последующий полный обход когорт. append_batch теперь сразу накапливает поправку на возраст новорожденных при добавлении частей когорт. Финальный замер после повторного использования сумм завершившихся партий в пределах поколения дал 1028,991 мс на headless-шаг скорости 6 и пропускную способность 0,486. В повторных прогонах этой же версии получилось 1005–1011 мс, поэтому при выборке всего в шесть шагов разброс велик, и устойчивое ускорение утверждать нельзя. В UI получилось 17,05 FPS, среднее время кадра 58,66 мс и пропускная способность 0,3342. Новый профиль показывает 319 мс на обработку партий новорожденных за шесть шагов. Это изменение пока не демонстрирует снижения общего времени на этом сохранении; его потенциальная польза относится прежде всего к сценариям с гораздо большим числом когорт на сущность, где прежние обходы росли пропорционально числу когорт.

Повторить замеры из родительской папки проекта:

godot --headless --path Owniverse.GI --script res://tests/create_full_benchmark_save.gd
godot --headless --path Owniverse.GI --script res://tests/benchmark_saved_state.gd -- Owniverse.GI/tests/artifacts/all_objects_speed6.adventure.json 0.5 profile
godot --path Owniverse.GI --script res://tests/benchmark_full_ui.gd