Не застрять в текстурах после ремастеринга
Gamedev
Владимир Семыкин

Как обычный геймпад мог привести к очистке карты памяти на PS1 — история бага в Crash Bandicoot Статьи редакции

Аппаратная ошибка, которая чуть не стала фатальной для знаменитого платформера.

Программист оригинальной Crash Bandicoot от Naughty Dog Дейв Бэггетт в 2013 году опубликовал на Gamasutra текст про необычный баг, который приводил к полному удалению данных с карты памяти. Пожалуй, самое удивительное в этой истории, что ошибка была вызвана проблемами в железе. Пересказываем материал.

По словам Бэггетта, обычно при возникновении ошибки программисты в первую очередь винят свой код. Затем подозрения падают на компилятор. И уже в последнюю очередь — на железо. Как раз c аппаратной ошибкой Бэггетт и столкнулся, когда писал код для Crash Bandicoot.

Программист занимался созданием системы сохранений и загрузок — он ожидал, что это будет простая задача, которая займёт максимум несколько дней. Но в итоге на отладку кода ушло полтора месяца. Вся проблема заключалась в странном баге — иногда процесс сохранения приводил к повреждению всех данных на карте памяти. И причина была неизвестна.

Постепенно напряжение нарастало — продюсер Sony Конни Бут начала паниковать, так как это был серьёзный баг, из-за которого релиз игры могли отложить. Через Конни программисты из Naughty Dog связались с другими разработчиками, которые делали игры для PS1. Но ни у кого не возникало проблем с картой памяти.

Когда идеи закончились, Бэггетт начал удалять куски кода, чтобы понять, какой именно фрагмент приводит к багу. В результате должна была остаться только часть с ошибкой. Проблема такой отладки в том, что в видеоиграх сложно удалять отдельные части и не затрагивать остальные. В таких случаях приходится заменять недостающие куски заглушками, которые лишь имитируют деятельность. Это достаточно медленная и трудоёмкая задача.

В результате у Бэггетта остался лишь код запуска системы, но ошибка всё ещё повторялась. В определённый момент у программиста появилась догадка. Чтение и запись данных всегда опирается на время — часы позволяют аппаратному устройству, которое напрямую не подключено к процессору, оставаться синхронизированным с кодом, который исполняется CPU.

Часы связаны со скоростью передачи данных, поэтому если с ними что-то случится, то система просто запутается. Такие ситуации часто приводят к повреждению данных. Бэггетт проверил таймер на PS1 и заметил, что он установлен на 1 кГц — 1 тысячу тиков в секунду. Обычно игры на PS1 работали всего на 100 Гц, что значительно ниже, чем частота в Crash Bandicoot.

Оказалось, что другой программист завысил частоту, чтобы добиться более точных вычислений. Бэггетт снизил частоту до 100 Гц и по какой-то причине баг исчез. Разработчик решил проблему, но на тот момент всё ещё не разобрался, из-за чего она возникала.

После Бэггетт неоднократно возвращался к ошибке и пытался понять, почему частота в 1 кГц приводила к проблеме. Он смог выявить одну закономерность — баг возникал, когда тестеры использовали геймпад. Сам Бэггетт почти не применял его, потому что он не нужен был для отладки системы и написания кода.

Бэггетт связался с инженером из Sony, который отрицал возможность аппаратной ошибки, но пообещал протестировать систему. Проверки показали, что дело действительно было в железе. Бэггетт признался, что до конца так и не разобрался, почему возникал баг, но скорее всего всё было так. Контроллер, отвечающий за скорость записи и чтения данных для карты памяти, также устанавливал скорость передачи данных для геймпадов.

В результате к ошибке приводило сочетание двух факторов. Во-первых, это перекрёстные помехи между отдельными частями материнской платы, а во вторых — одновременная передача данных для порта геймпада и порта карты памяти с частотой 1 кГц. В таком случае биты информации пропадали, а данные на карте портились.

#опыт #ps1 #crashbandicoot

{ "author_name": "Владимир Семыкин", "author_type": "editor", "tags": ["\u043e\u043f\u044b\u0442","ps1","crashbandicoot"], "comments": 89, "likes": 214, "favorites": 133, "is_advertisement": false, "subsite_label": "gamedev", "id": 725549, "is_wide": true, "is_ugc": false, "date": "Wed, 12 May 2021 13:31:41 +0300", "is_special": false }
0
89 комментариев
Популярные
По порядку
Написать комментарий...
104

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

Геймпад.

Ответить
21

Джойстик значит джойстик

Ответить
34

чот не помню такой бандуры на ps1 

Ответить
21

Всегда называли геймпады джойстиками и ничего

Ответить
4

может у вас еще и сотки фишками называли?

Ответить
2

Фишки сотками?

Ответить
0

Марками

Ответить
0

У нас да

Ответить
0

Знакомая мордель. Откуда?

Ответить
0

Мордель? :0

Ответить
3

Мой хороший. Пытился где то лет 500 уже на балконе... Когданить я куплю ил-2 штурмовик за 1999 рублей в стиме, и сотру с него всю пыль, и буду с радостью вспоминать школу..

Ответить
0

JOY TECH BIO GRIP великолепно. 

Ответить
3

Вот еще

Ответить
0

ух-ты, темно-серый дорестайлинговый. круууто!

Ответить
1

Чисто технически, он был

Ответить
4

не, ну чисто технически и вот такое было )

Ответить
8

Ps1 glove.

Ответить
0

как такой штуки не хватало бич-слэпать людей, которые тебя таранят в нфс

Ответить
1

Я не знаю, что это за сумрачное творение, но джойстик что я скинул, вполне себе производился Сони, и продавался. 

Официальное название:  PlayStation Analog Joystick (SCPH-1110). 

Ответить
0

да, я в курсе. Внутренний японский рынок, не взелетело) 
я же написал "не _помню_ такой штуки на ps1" )

Ответить
2

На оригинальной упаковке вот такие устройства были нарисованы. Если найду скрин коробки, то скину

Ответить
1

А вот это тогда как называется?)
Только не надо читать надпись, а то для холиваров появится новая переменная)

Ответить
0

я бы назвал это прадедушкой файтстиков)

Ответить
0

Лул, файтстики были на аркадах еще до консолей

Ответить
0

да, только нельзя было от аркады оторвать кусок с управлением и поиграть дома на сеге)

Ответить
0

Потому шо не нужно было

Ответить
0

мне было нужно(

Ответить
2

У тебя точно была уже не такая сега, а мега драйв. А для нее уже было

Ответить
0

видимо не завезли в тот момент. Но выглядит круто, конечно.

Ответить
1

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

Ответить
0

Контроллер

Ответить
0

Ваще то это сайдстик, а по русски ручка управления, что еще за джойстик

Ответить
4

Joy Stick

Ответить
0

And this is my BOOMSTICK

Ответить
1

Мой бумбастик
просто *** фантастик!

Ответить
3

справедливо. Поменял

Ответить
1

официально по гайдлайнам Sony - контроллер

Ответить
1

Контроллер

Ответить
0

Это теперь так менеджер сказал говорить?

Ответить
77

история бага в Crash Bandicoot

Бэггетт признался, что до конца так и не разобрался, почему возникал баг

Ответить
11

Тогда:
Постепенно напряжение нарастало — продюсер Sony Конни Бут начала паниковать, так как это был серьёзный баг, из-за которого релиз игры могли отложить.

Сейчас:
На релизе выпускаем патчи первого дня после которых игра всё равно неиграбельна.

Ответить
3

Уже 

Патчи кое что чинят, а кое что ломают, некоторые покупатели рассказывают, что то ничего и вообще энтузиасты, вот уже скоро все модами допилят. А тех кто возмущаются плохим техническим состоянием, чуть ли не травят. 

Ответить
1

и не только первого (вспоминая предпоследний патч ретёрналс ^^)

Ответить
9

Хоть отловили, а не «ху€$ ху€$ и в продакшен», как некоторые, ведь баг критический.

И сделать с десяток патчей, тогда физически не могли, и в этом были некоторые плюсы...

Ответить
1

В этом была так и же проблема.
Иногда игры могли быть не проходимы.
Плака о двух концах.

Ответить
4

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

Ведь сколько было случаев, что на ПК, просто забивали на банальную проверку, и игры были сломаны и непроходимы.

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

Ответить
0

Ультима, ну твою же мать Гэрриот, восемь

Ответить
–3

Тестеров тогда не существовало?

Ответить
4

Существовало. Но ты действительно считаешь что все баги можно отловить?
Там игры не менее забагованные были. Спидарны по твоему как работают вообще?

Ответить
0

Причем тут это, во времена первой плойки железо у всех одинаковое было, следовательно и баги, если игра дошла релиза и оказалась непроходима, значит ее вообще не тестили

Ответить
2

Системы полностью проверенные на отсутсвие багов не существуют. Ближе всего к этому разработки реального времени для особо важных объектов типа АЭС. Проверить игру полностью невозможно в хоть какой-то обозримый промежуток (см. спидраны по Марио).

Ответить
0

Патчей первого дня не существовало

Ответить
0

Вспомним Mankind Divided и ещё десяток другой Киберпанков, где после патчей первых дней, они ломали игру без возможности прохождения. Дааа, палка, которая из раза в раз каким-то образом стреляет потребителю в колено, хотя по идее и стрелять-то не должна. 

Ответить
7

скорее всего всё было так

Типикал геймдев (¬‿¬ )

Ответить
5

Люблю истории про баги с утра, пока исправляешь свои баги. 

Ответить

Комментарий удален

Комментарий удален

Комментарий удален

Комментарий удален

Комментарий удален

0

Да программирование одна сплошная магия, помню как компилятор тупо нужную мне строку просто перепрыгивал и все нахуй ломалось. Почему перепрыгивал я так и не понял, просто ещё одну строку с бесполезным кодом добавил. 

Ответить

Комментарий удален

0

У меня и на тест-машине стояли разные компиляторы, которые по-разному преобразовывали одно и тоже выражение. 
Каково было моё удивление, когда я всё-таки понял, что одна и та же строчка кода по-разному работала.

Ответить
1

Каково было моё удивление, когда я всё-таки понял, что одна и та же строчка кода по-разному работала.

Более того, в C/C++ такое поведение вполне может соответствовать стандарту)

Например, порядок вычисления аргументов функции не определён (unspecified behavior).

И есть ещё undefined behaviour, куда вообще наступать не рекомендуется, потому что даже в рамках одного компилятора может повести себя по-разному. Но зато такой ценой даётся простор оптимизатору.

Ответить
0

В низкоуровневых языках легко и самому допустить ошибку из-за неполного понимания какого-нибудь нюанса, вроде undefined behavior в C/C++.

Тем не менее, баги в компиляторах не такая уж и редкость. Из недавнего — у меня GCC игнорировал атрибут naked и вставлял пролог в одну функцию с ассемблерной вставкой. Или линковщик Visual Studio тупо не инициализировал глобальный объект, пока я его не перенёс в другой исходник.

Ответить
0

обычно это свойственно компиляторам как раз языков высокого уровня )
просто потому, что любой сложный оператор разбивается на простейшие и это может реализовываться по разному, откуда и растут проблемы. от пересечения модулей (иногда даже переменных) до банального замусоривания памяти. )

Ответить
7

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

Ответить
1

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

Ответить
0

добро пожаловать в индустрию.

Ответить
0

да я и так давно в индустрии

Ответить

Текущий кот

3

Непонятно, что дальше делал программист, который не смог пользоваться этим приёмом для увеличения точности вычислений.

Ответить
2

Предполагаю что просто на время сохранения герцовку снижали

Ответить
–13

М-да, какой то говнокод у них там был, судя по описанию. Слеплено из говна и палок, раз при сохранении ещё и таймер задействован. Зачем передавать данные на пад если карта памяти в корпусе была?
Комментировать большое число кусков кода и использование заглушек - да чел просто методом тыка пытался найти проблему, типичный джун, даже не пытался проанализировать что привело к ошибке. В конечном итоге его говнокод сохранения зависел от частоты системы и пада, вот это костыль.

Ответить
8

Трепещите, выше мы имеем шанс видеть величайшего программиста, который известен по таким идеально написанным хитам как...

... кого мы обманываем, очередной ноунейм решил выебнуться.

Ответить
1

Который из двух? 🤔

Ответить
1

Я ж не строю из себя кармака как минимум)

Ответить
0

А кто тут строит из себя кармака? Или критиковать его уже запрещено? Может вы из адептов двойных стандартов "нигером назвать черного может только другой черный"?

Здесь обычный наемный рабочий, которому посчастливилось поработать над этим проектом, так же как и я могу работать над фитнесс аппом которым пользуются миллионы.

Ответить
0

Ну так как ты здесь, то второй

Ответить
0

Можете и так считать, ваше право. Но у меня кровь из глаз от такого чтива. А процесс поиска и попытка исправления бага - приключения джуна в проекте с говеной архитектурой. Не зря же там упомянули, что в других проектах у людей не возникало проблем с сейвом. Это значит лишь то, что при написании краша была разработана извращенная система сейвов, которая зависела от тика пада и системы. 

Ответить
2

А ты в курсе архитектуры системы? Ее API? Может там все на тиках и завязано. Прежде чем срать, мамин жабаскриптер, погугли

Ответить
0

Он еще и не в теме, что ND на херу вертели сонивский SDK с сами заколхозили хаки, чтобы адекватнее использовать хардварь. И даже свой лисп сделали. Наркоманы. Вообще есть видео от одного из челов, который делал игру)

Ответить
3

Поэтому Краш и великая игра.

Ответить
0

Есть такое. 1ая плойка с этим мудаком и ассоциируется)

Ответить
–1

А зачем гуглить архитектуру системы, апи, если этого лампового чтива для фанатов "миссии невыполнима" достаточно? Здесь речь про говнокод их игры, который был завязан на тики падов и системы, причем пад совершенно другой уровень интефейса по отношению к механизму сейвов, чую там дикое спагетти было. У других игр такой ошибки не было (слова автора), значит проблема в том как они писали код (здесь должна быть шутка про код индусов).

Не стоит оправдывать и защищать чейто говнокод архитектурой и апи системы. Игра великая, ее никто не срет. Речь про ламповые приключения джуна не знающего архитектуры и апи системы, с которой он работает.

Ответить
0

Добро пожаловать в низкоуровневую разработку, где можно тратить кучу времени на отлов рандомных багов, связанных с аппаратной частью. Жабаскриптерам такое не знакомо.

Ответить
0

Так прежде чем анализировать что привело к ошибке нужно найти тот самый кусок кода который эту ошибку вызывает. Что иногда бывает совсем не просто и в какой-то момент выключение модулей/частей кода это единственный вариант поиска.

Ответить
0

Как раз c аппаратной ошибкой Бэггетт и столкнулся, когда писал код для Crash Bandicoot.

...когда программист программно поменял значения, которые менять, судя по всему, не стоило.
Я не профи, но могу предположить что на девките такое (повышение точности вычислений, что явно увеличивает нагрузку на процессор) прокатывало, а вот на пользовательской приставке — вряд ли

Ответить
0

Однажды написал калькулятор на Python. Загордился)) мол мистер Робот))) а тут вон как бывает... даже страшно Python дальше учить)))

Ответить
Комментарии
null