Процедурная генерация по сиду выдаёт разные карты на разных машинах

Рейтинг: 73.8% · 74 голосов
Создание игр на Unity, Unreal Engine, Godot: 3D-графика, шейдеры, физика, геймдизайн, оптимизация и инди-проекты.
Ответить
Аватара пользователя
valera_vector
Сообщения: 32
Зарегистрирован: Пн май 11, 2026 8:23 am

Процедурная генерация по сиду выдаёт разные карты на разных машинах

Сообщение valera_vector »

Сделал генерацию уровней по seed, на моём ПК один и тот же сид = одинаковая карта, всё ок. У тестера с тем же сидом карта ДРУГАЯ. Воспроизводимость сломана, в чём может быть подвох?
👍 ❤️ 🔥 😄 🤔2
✔ Лучший ответ сформирован автоматически — ivan_neon11
Вторая причина — порядок итерации по Dictionary или HashSet. В .NET это не гарантировано, и если генератор итерирует по словарю при построении карты, порядок будет разным между запусками и платформами. Замени на SortedDictionary или List с явной сортировкой там где нужен детерминизм. Третье: float-арифметика может давать разные результаты на x86 и ARM (у тестера M1/M2 Mac или мобильный девайс?). …
Перейти к ответу →
Аватара пользователя
anton_loop
Сообщения: 2
Зарегистрирован: Вс май 24, 2026 3:19 pm

Re: Процедурная генерация по сиду выдаёт разные карты на разных машинах

Сообщение anton_loop »

Классика. Где-то используешь System.Random или встроенный рандом движка, который не гарантирует одинаковую последовательность между платформами/версиями. Заведи свой детерминированный PRNG, например xorshift, и сей только его.
👍1 ❤️1 🔥1 😄 🤔
Аватара пользователя
yaroslav_hex13
Сообщения: 20
Зарегистрирован: Пн май 11, 2026 8:32 am

Re: Процедурная генерация по сиду выдаёт разные карты на разных машинах

Сообщение yaroslav_hex13 »

Плюс проверь не лезет ли в генерацию float-арифметика с разным округлением. Если карта зависит от порядка обхода хэш-сета/словаря — порядок итерации может отличаться, и сид тут ни при чём.
👍2 ❤️1 🔥 😄1 🤔2
Аватара пользователя
semyon7320
Сообщения: 14
Зарегистрирован: Сб май 16, 2026 3:00 am

Re: Процедурная генерация по сиду выдаёт разные карты на разных машинах

Сообщение semyon7320 »

@perf_freak о, про обход словаря в точку — у меня биомы расставляются итерацией по Dictionary. Порядок реально не гарантирован. Это могло давать расхождение даже при одинаковом рандоме?
👍1 ❤️ 🔥 😄 🤔1
Аватара пользователя
lev_loop
Сообщения: 30
Зарегистрирован: Пн май 11, 2026 5:23 am

Re: Процедурная генерация по сиду выдаёт разные карты на разных машинах

Сообщение lev_loop »

@gopher_max именно. Если ты вызываешь rng в порядке итерации словаря, а порядок недетерминирован — последовательность вызовов плывёт, и карта вместе с ней. Замени на List с явной сортировкой по ключу.
👍1 ❤️ 🔥 😄 🤔1
Аватара пользователя
griddocker4829
Сообщения: 1
Зарегистрирован: Ср май 13, 2026 8:56 pm

Re: Процедурная генерация по сиду выдаёт разные карты на разных машинах

Сообщение griddocker4829 »

Заменил Dictionary на отсортированный список + свой xorshift вместо встроенного рандома. Карты теперь идентичны на трёх машинах. Двойная причина была, спасибо обоим!
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
anton_py83
Сообщения: 5
Зарегистрирован: Пн май 11, 2026 10:49 pm

Re: Процедурная генерация по сиду выдаёт разные карты на разных машинах

Сообщение anton_py83 »

Запиши себе на будущее золотое правило детерминизма: фиксированный PRNG, фиксированный порядок обхода, никакого системного времени, и аккуратно с float. Нарушишь один пункт — потом сутки ловишь как сейчас.
👍5 ❤️1 🔥2 😄 🤔2
Аватара пользователя
tanya_ml
Сообщения: 14
Зарегистрирован: Вт май 12, 2026 1:52 am

Re: Процедурная генерация по сиду выдаёт разные карты на разных машинах

Сообщение tanya_ml »

Первое что нужно проверить — какой генератор случайных чисел используешь. Стандартный System.Random в Unity (и C# в целом) до .NET 6 давал разные последовательности в зависимости от реализации runtime. Если используешь UnityEngine.Random — он детерминирован в пределах одного запуска, но InitState должен вызываться явно до любых других вызовов. Проверь нет ли где-то вызова Random.Range до SetInitState(seed).
👍 ❤️3 🔥 😄 🤔
Аватара пользователя
ivan_neon11
Сообщения: 7
Зарегистрирован: Пт май 15, 2026 11:09 pm

Re: Процедурная генерация по сиду выдаёт разные карты на разных машинах

Сообщение ivan_neon11 »

✔ Лучший ответ — сформирован автоматически
Вторая причина — порядок итерации по Dictionary или HashSet. В .NET это не гарантировано, и если генератор итерирует по словарю при построении карты, порядок будет разным между запусками и платформами. Замени на SortedDictionary или List с явной сортировкой там где нужен детерминизм. Третье: float-арифметика может давать разные результаты на x86 и ARM (у тестера M1/M2 Mac или мобильный девайс?). Если сид-генерация проходит через float — переходи на int-математику с фиксированной точкой.
👍3 ❤️ 🔥1 😄 🤔
Аватара пользователя
kira_app10
Сообщения: 23
Зарегистрирован: Вт май 12, 2026 2:35 am

Re: Процедурная генерация по сиду выдаёт разные карты на разных машинах

Сообщение kira_app10 »

Для отладки удобно добавить хеш от финального состояния карты и логировать его вместе с сидом. Тогда сразу видно на каком шаге расходятся результаты. В Unity есть ещё нюанс с Physics-симуляцией если она задействована в генерации — физдвижок не детерминирован между платформами по определению, только в пределах одной сессии.
👍2 ❤️2 🔥1 😄 🤔
Ответить
Поделиться темой: ✈ Telegram VK

Вернуться в «Геймдев и разработка игр»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость