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

Рейтинг: 73.8% · 74 голосов
Создание игр на Unity, Unreal Engine, Godot: 3D-графика, шейдеры, физика, геймдизайн, оптимизация и инди-проекты.
Ответить
Аватара пользователя
mynancy
Сообщения: 24
Зарегистрирован: 19 май 2026, 07:17

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

Сообщение mynancy »

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

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

Сообщение envoy69 »

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

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

Сообщение python5 »

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

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

Сообщение marianna »

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

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

Сообщение depechie »

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

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

Сообщение marianna »

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

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

Сообщение jpearce »

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

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

Сообщение cohenst1 »

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

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

Сообщение much »

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

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

Сообщение olgerd »

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

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

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

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