WORLD OF WARCRAFT

Тема: Error code: server on fire  (Прочитано 31964 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Kermit

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 8586
Error code: server on fire
« : 26 Ноября, 2015, 10:00:06 »
  • Рейтинг:53 (+53 | 0)


Еще одна история с Близзкона. Этого не было на трансляции, но в одном из холлов была организована встреча с разработчиками Близзард - теми ребятами, которые пишут код для World of Warcraft, Overwatch и всех других игр компании. Как оказалось, над всеми этими играми с точки зрения программирования работают одни и те же люди, и у них таки есть, что рассказать.

Байки разработчиков
  • Команда Overwatch готовила демо-версию для показа в Китае, но ВНЕЗАПНО оказалось, что они забыли убрать кровь, а как мы знаем, в этой стране существует запрет на такие вещи. Человек с демо-версией уже приехал в Шанхай, и людям в Калифорнии нужно было придумать как доставить новую версию клиента через хилый wifi в его отеле. Китайский интернет это та еще песня, те кто там был, подтвердят. Инженеры почесали в затылке, посмотрели на исполняемый файл и сообразили, что в нем есть место, где игра определяет, произошло попадание в игрока или в стенку, и в зависимости от этого показывается спецэффект. Они не стали ничего перекомпилировать, а написали небольшой патчер, который брал готовый клиент, изменял в нем один байт (условный переход на безусловный) и сохранял его. Патчер переслали в Шанхай, он нормально отработал, и показ для китайцев прошел без накладок.

  • Как многие помнят, запуск Warlords of Draenor прошел не совсем гладко. Железа для нормального функционирования серверов у Близзард в принципе хватало, но World of Warcraft довольно старая игра, и требует точного распределения - какой сервер будет обслуживать аккаунты пользователей, какой базы данных и так далее. Инженеры заранее собрали конфигурацию, которая по их мнению должна была работать, но после запуска оказалось, что в серверах, отвечающих за инстансы, почти мгновенно закончилась память. Не удивительно: каждый гарнизон порождал новый инстанс, и в какой-то момент количество инстансов измерялось сотнями тысяч.


    На протяжении восьми часов инженеры в датацентрах перетряхивали все на ходу: вытаскивали блейд-сервера из стоек, добавляли в них память, меняли местами и перераспределяли для них нагрузку. После этого все пошло более гладко, проблемы с железом кончились и остались только с софтом)
:cut:
  • Heroes of the Storm использует движок Starcraft, поэтому когда разработчики хотят внести какое-то изменение в движок, они всегда должны иметь в виду все созданные игроками моды, которые возможно используют этот функционал. Приходится использовать множество костылей, но пока слава Богу в компании еще работают те люди, которые писали код 15-летней давности и они могут пояснить зачем нужен тот или иной его кусок.

  • 16 мест в рюкзаке на протяжении 15 лет - что с вами не так? Отвечаем. Разработчики оригинальной версии World of Warcraft однажды решили, что инвентарь персонажа будет храниться в массиве данных. В нескольких первых элементах массива лежат вещи, которые одеты на персонаже, и после этого идут сумки - подход уходит корнями еще в Diablo 2, когда все это умещалось на одном открытом экране персонажа. В какой-то момент времени в игре появился банк, и вещи банка добавили в конец того же массива. Поскольку игрок не мог получать доступ к банку из любой точки мира, программисты рассчитывали, что в определенной точке массива точно заканчивается инвентарь и начинается банк. Это значение жестко задавалось (hardcoded) по всем исходным текстам программ, и что еще хуже, некоторая математическая логика полагалась на то, что этот сдвиг является константой. Чтобы попытаться залезть и исправить это дело, пришлось бы затратить гигантские усилия - сначала программистов, которые станут читать тысячи строк кода и искать слабые места, а потом отдел тестирования, которому придется опробовать изменения во всех мыслимых и немыслимых случаях. И все равно после этого неизбежно что-то сломается. Вот как мы оказались перед фактом фиксированного размера рюкзака.


  • Во всех играх Blizzard есть какое-то количество устаревшего кода, который приходится поддерживать, так сказать, по наследству. Когда команда Battle.net захотела увеличить количество друзей, которое может иметь игрок, им пришлось перелопатить все игры в поисках вещей, которые могут пойти неправильно. Дело не только в базах данных и коде: интерфейсы некоторых игр писались пять, восемь лет назад, и надо сказать что разработчики каждой игры первым делом пишут свой собственный интерфейс с нуля, потому что все старые были отстоем. Поэтому если вы хотите увеличить количество друзей в Battle.net, вам нужно переделать и протестировать интерфейсы всех игр Blizzard. И не только переделать, но и убедиться что в них работает одновременно и старый и новый интерфейс, поскольку у вас нет возможность пропатчить все игры в один и тот же момент.

  • В Blizzard работают гениальные дизайнеры, которые вечно носятся с новыми идеями. У программистов не принято говорить им "нет". Если дизайнер приходит с идеей сделать нового героя Heroes of the Storm, которым управляют сразу два игрока, программисты сначала впадают в панику, потом обдумывают подходы и наконец находят способ реализовать. В отделе разработки есть популярный мем - картинка, где нарисован включенный утюг, на нем стоит чашка кофе и на ней кастрюля со спагетти. Подпись: "проблема решена, вы можете варить спагетти".


  • В своей работе команда Overwatch разбивается на спецбригады, которые реализуют ту или иную вещь, обычно это новый герой. Собираются дизайнер геймплея, программист, художник, специалист по спецэффектам и звуковик, и начинают делать какого-нибудь Гэндзи. Они работают вместе и играют в то что получилось вместе, тем самым приобретая бесценный опыт. Конечно, учитывается и фидбек со стороны отдела тестирования и всех остальных, кто подвернулся под руку.

  • В Overwatch есть два типа героев: D.Va и не D.Va. Работа над ней началась несколько месяцев назад, и тогда еще никто не понимал, что потребуется все время до релиза, чтобы с ней закончить. Некоторые программисты Overwatch пришли из разработки на Unreal Engine, и они еще два года назад подозревали, что в какой-то момент их попросят сделать нечто подобное тому, что реализовано в Unreal - ракету, которую игрок выпускает, а потом ей управляет. Поэтому они впрок написали такой механизм, и когда потом на сцене появился Крысавчик со своей Адской шиной, разработчики ходили очень собой гордые. Я могу предсказывать будущее!


    Но потом появилась D.Va, и весь этот механизм пришлось выкинуть, после чего написать заново. Вылезла неимоверная куча багов, таких например как мех, который самостоятельно эскортирует груз, когда D.Va уже из него вылезла. Или например ты вылезаешь из меха и оказываешься в точке с координатами 0.0.0, потому что произошел какой-то непредвиденный случай. Точка 0.0.0 вообще любима разработчиками, там имеют тенденцию собираются такие вот забагованные вещи. Помните трупы, плавающие под Когтистыми горами? Это точка 0.0.0, начало всего.

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

  • Многие спрашивают, где давно обещанная опция Battle.net "прикинуться, что я оффлайн". Дело не в сложности технической реализации, но в самом гейм дизайне. "Прикинуться оффлайн" обычно означет "я пойду играть в Diablo 3 вместо того, чтобы пойти в рейд", и это простой случай. Но что делать если твой друг якобы оффлайн, но ты его видишь перед собой на аукционе в World of Warcraft..


  • Программисты Blizzard используют разнообразные инструменты оптимизации и тестирования - начиная от VTune и заканчивая своими собственными разработками. В тестах есть разные методы автоматизации, например такой: берется карта Heroes of the Storm с одной линией, на нее ставятся 10 героев и те сражаются друг с другом длительное время. Герои меняются, меняются их билды, и набранная статистика помогает в поиске ошибок баланса.

  • Один из ведущих программистов Blizzard раньше работал в области высокочастотного трейдинга, и однажды он оптимизировал код хеш функции, сэкономив на ее вызове 120 наносекунд. И это был грандиозный грандиозный прорыв, который принес компании миллионы долларов. И нет, программист не получил за это миллион долларов.

  • По-настоящему серьезный вопрос: почему мы в 2015 году до сих пор имеем еженедельное отключение серверов на профилактику и патчи? Внутри Blizzard есть понимание того, что игры должны быть онлайн постоянно, в идеале приближаясь к 99.9% непрерывной работы. Инженеры пытаются достичь этого, в особенности с World of Warcraft, но главная заминка здесь в старой инфраструктуре - как в WoW, так и в некоторых частях Battle.net. Сейчас целью является сокращение даунтайма до часа в неделю, и в европейском регионе этого удалось достичь - в неделю Близзкона сервера были недоступны 53 минуты. Когда-нибудь (в мечтах) World of Warcraft станет работать непрерывно.

  • В разных отделах используются разные системы контроля версий и интеграции. В Overwatch применяют Perforce, в Battle.net - Git и Jenkins, а в World of Warcraft до сих пор сидят на Subversion.

  • Существовал план по шифрованию всех файлов World of Warcraft, с тем чтобы затруднить жизнь датамайнерам, которые раскрывают все секреты игры задолго до того момента, который считается подходящим внутри Blizzard. Этого не стали делать, поскольку патчить зашифрованные файлы было нельзя, и клиентам пришлось бы перезакачивать весь контент снова и снова.

  • Игры Blizzard работают в окружении, где даже на первый взгляд невинные вещи могут оказаться опасными. Например, команда /who в World of Warcraft показывает список игроков онлайн. Когда игра только была выпущена, буквально каждый игрок хотел знать, кто еще из их друзей находится онлайн. Дело доходило до того, что запросы команды /who съедали 85% серверного времени!


  • Внутренние номера команд разработчиков: 1 - Starcraft 2 и Heroes of the Storm, 2 - World of Warcraft, 3 - Diablo, 4 - Overwatch, 5 - Hearthstone.

  • Внутри кода игр Blizzard есть множество мест, которые выглядят устаревшими и непонятными. Во многих случаях подобный стиль связан с багфиксами, которыми чинили неочевидные случаи использования кода. Но существует серьезная разница между желанием понять этот код и желанием переписать его заново. Если код устарел, но в нем заложены четкие механизмы расширения, то с ним можно нормально работать. Если же по мере расширения все запутывается и начинает тормозить, возможно тут стоит кое-что написать заново.

  • Очень, очень много людей записались на бета тест Overwatch. То, чего ждут от теста программисты, это понимания того как их код работает в различных сетевых окружениях. Например, им был интересен отзыв игрока из Чили (работает отлично!) и тех, кто пытается играть через телефон по 4G.

  • Overwatch планируется выпустить одновременно для всех платформ. Инженеры ждут, что будет тяжко.

  • Открытые бета-тест выходные отлично подходят для того, чтобы ронять сервера и находить баги. Так, например, во время открытых выходных был найден прекрасный баг в сервере Diablo 3. Если сервер падал по какой-то причине, то после того как он вновь поднимался, балансировщик нагрузки видел сервер с нулевым количеством клиентов и радостно направлял все новые игры туда. Естественно, сервер снова падал, и так повторялось вновь и вновь.

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

(показать/скрыть)

Satros

  • Завсегдатай
  • **
  • Сообщений: 330
  • Маленькая девочка

  • Варкрафт: +
    • Имя: Айри
    • Класс: Паладин
    • Сервер: Ревущий Фьорд
Re: Error code: server on fire
« Ответ #1 : 26 Ноября, 2015, 10:22:51 »
  • Рейтинг:5 (+5 | 0)
Цитировать
Такие дела! Я надеюсь, что вам было так же интересно это читать, как мне переводить. В перевод вошло не все, интересующиеся темой могут посмотреть полную запись (на английском).
Кермит, спасибо за перевод =)
Интересно было почитать, как это все у них там внутри присходит :)

Eldhenn

  • Ветеран
  • ****
  • Сообщений: 5118
  • If your dad doesn't have a beard...

  • Варкрафт: +
    • Имя: Pestilentiae
    • Класс: рыцарь смерти
Re: Error code: server on fire
« Ответ #2 : 26 Ноября, 2015, 10:25:20 »
  • Рейтинг:-25 (+4 | -29)
> вытаскивали блейд-сервера из стоек, добавляли в них память, меняли местами и перераспределяли для них нагрузку

Брехня. Или я очень плохого мнения о близзардах. Чтобы в 2014 году не использовать виртуализацию?
No beard, no good.

isco

  • Завсегдатай
  • **
  • Сообщений: 116
Re: Error code: server on fire
« Ответ #3 : 26 Ноября, 2015, 10:27:21 »
  • Рейтинг:0 (+0 | 0)
Интересно, спасибо. Но этого не понял: "World of Warcraft довольно старая игра, и требует точного распределения - какой сервер будет обслуживать аккаунты пользователей, какой базы данных и так далее" - так со всеми крупными проектами, независимо от их свежести.

Eldhenn

  • Ветеран
  • ****
  • Сообщений: 5118
  • If your dad doesn't have a beard...

  • Варкрафт: +
    • Имя: Pestilentiae
    • Класс: рыцарь смерти
Re: Error code: server on fire
« Ответ #4 : 26 Ноября, 2015, 10:32:20 »
  • Рейтинг:0 (+0 | 0)
Интересно, спасибо. Но этого не понял: "World of Warcraft довольно старая игра, и требует точного распределения - какой сервер будет обслуживать аккаунты пользователей, какой базы данных и так далее" - так со всеми крупными проектами, независимо от их свежести.
Речь о том, что в инфраструктуру WoW не встроен делитель нагрузки.
No beard, no good.

vlexaa

  • Старожил
  • ***
  • Сообщений: 1266
Re: Error code: server on fire
« Ответ #5 : 26 Ноября, 2015, 10:48:45 »
  • Рейтинг:-29 (+3 | -32)
Цитировать
16 мест в рюкзаке на протяжении 15 лет

Бла бла бла.

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

Ведь каждый мог прожать и увидеть, что на пиратке, с которой он пришел, онлайн выше был.  ;)

Цитировать
И нет, программист не получил за это миллион долларов.

А вот тут обидно было.  :(
« Последнее редактирование: 26 Ноября, 2015, 10:50:50 by vlexaa »

HedgeHog592

  • Старожил
  • ***
  • Сообщений: 1392
Re: Error code: server on fire
« Ответ #6 : 26 Ноября, 2015, 11:04:32 »
  • Рейтинг:0 (+0 | 0)
Цитировать
16 мест в рюкзаке на протяжении 15 лет - что с вами не так? Отвечаем. Разработчики оригинальной версии World of Warcraft однажды решили, что инвентарь персонажа будет храниться в массиве данных. В нескольких первых элементах массива лежат вещи, которые одеты на персонаже, и после этого идут сумки - подход уходит корнями еще в Diablo 2, когда все это умещалось на одном открытом экране персонажа. В какой-то момент времени в игре появился банк, и вещи банка добавили в конец того же массива. Поскольку игрок не мог получать доступ к банку из любой точки мира, программисты рассчитывали, что в определенной точке массива точно заканчивается инвентарь и начинается банк. Это значение жестко задавалось (hardcoded) по всем исходным текстам программ, и что еще хуже, некоторая математическая логика полагалась на то, что этот сдвиг является константой. Чтобы попытаться залезть и исправить это дело, пришлось бы затратить гигантские усилия - сначала программистов, которые станут читать тысячи строк кода и искать слабые места, а потом отдел тестирования, которому придется опробовать изменения во всех мыслимых и немыслимых случаях. И все равно после этого неизбежно что-то сломается. Вот как мы оказались перед фактом фиксированного размера рюкзака.

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

DesFolk

  • Старожил
  • ***
  • Сообщений: 1881
  • Казуальный валенок

  • Варкрафт: +
    • Имя: Тормуул
    • Класс: Шаман
    • Сервер: Ясеневый лес
Re: Error code: server on fire
« Ответ #7 : 26 Ноября, 2015, 11:17:22 »
  • Рейтинг:6 (+6 | 0)
Цитировать
16 мест в рюкзаке на протяжении 15 лет - что с вами не так? Отвечаем. Разработчики оригинальной версии World of Warcraft однажды решили, что инвентарь персонажа будет храниться в массиве данных. В нескольких первых элементах массива лежат вещи, которые одеты на персонаже, и после этого идут сумки - подход уходит корнями еще в Diablo 2, когда все это умещалось на одном открытом экране персонажа. В какой-то момент времени в игре появился банк, и вещи банка добавили в конец того же массива. Поскольку игрок не мог получать доступ к банку из любой точки мира, программисты рассчитывали, что в определенной точке массива точно заканчивается инвентарь и начинается банк. Это значение жестко задавалось (hardcoded) по всем исходным текстам программ, и что еще хуже, некоторая математическая логика полагалась на то, что этот сдвиг является константой. Чтобы попытаться залезть и исправить это дело, пришлось бы затратить гигантские усилия - сначала программистов, которые станут читать тысячи строк кода и искать слабые места, а потом отдел тестирования, которому придется опробовать изменения во всех мыслимых и немыслимых случаях. И все равно после этого неизбежно что-то сломается. Вот как мы оказались перед фактом фиксированного размера рюкзака.

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

Легко рассуждать не видя код.:/

caorec

  • Завсегдатай
  • **
  • Сообщений: 451
Re: Error code: server on fire
« Ответ #8 : 26 Ноября, 2015, 11:18:10 »
  • Рейтинг:29 (+30 | -1)
> вытаскивали блейд-сервера из стоек, добавляли в них память, меняли местами и перераспределяли для них нагрузку

Брехня. Или я очень плохого мнения о близзардах. Чтобы в 2014 году не использовать виртуализацию?
Дай угадаю. Ты работаешь эникейщиком, но считаешь себя админом. Или может даже программистом.
Я бы не вступил в ту гильдию, в которую бы согласились принять такого человека как я...

barsuk101

  • Старожил
  • ***
  • Сообщений: 2570
Re: Error code: server on fire
« Ответ #9 : 26 Ноября, 2015, 11:21:13 »
  • Рейтинг:3 (+3 | 0)
Много веселых историй  ;D
P.s. забрал на память, при релизе легиона и овервотча понадобится  :P
« Последнее редактирование: 26 Ноября, 2015, 11:28:10 by barsuk101 »

Likvick

  • Завсегдатай
  • **
  • Сообщений: 650

  • Варкрафт: +
    • Имя: Ликви
    • Класс: Друид
    • Сервер: Свежеватель Душ
Re: Error code: server on fire
« Ответ #10 : 26 Ноября, 2015, 11:30:25 »
  • Рейтинг:0 (+0 | 0)
ну легко судить не видя дело)) а так мозгодробительная работа с кодом это да))

isco

  • Завсегдатай
  • **
  • Сообщений: 116
Re: Error code: server on fire
« Ответ #11 : 26 Ноября, 2015, 11:38:42 »
  • Рейтинг:2 (+10 | -8)
Цитировать
16 мест в рюкзаке на протяжении 15 лет - что с вами не так? Отвечаем. Разработчики оригинальной версии World of Warcraft однажды решили, что инвентарь персонажа будет храниться в массиве данных. В нескольких первых элементах массива лежат вещи, которые одеты на персонаже, и после этого идут сумки - подход уходит корнями еще в Diablo 2, когда все это умещалось на одном открытом экране персонажа. В какой-то момент времени в игре появился банк, и вещи банка добавили в конец того же массива. Поскольку игрок не мог получать доступ к банку из любой точки мира, программисты рассчитывали, что в определенной точке массива точно заканчивается инвентарь и начинается банк. Это значение жестко задавалось (hardcoded) по всем исходным текстам программ, и что еще хуже, некоторая математическая логика полагалась на то, что этот сдвиг является константой. Чтобы попытаться залезть и исправить это дело, пришлось бы затратить гигантские усилия - сначала программистов, которые станут читать тысячи строк кода и искать слабые места, а потом отдел тестирования, которому придется опробовать изменения во всех мыслимых и немыслимых случаях. И все равно после этого неизбежно что-то сломается. Вот как мы оказались перед фактом фиксированного размера рюкзака.

я хз, но даже я понимаю, что можно все элементы массива относящиеся к рюкзаку, заменить на функцию, которые бы вызывались с параметрами ячейки. Тем самым независимо от того насколько старый код, он будет обращаться к новодельному рюкзаку через старый АПИ.
Так что отмазка какая то ну прямо скажем грустная.
Диванные программисты подтянулись =)

JohnAlterat

  • Завсегдатай
  • **
  • Сообщений: 676
Re: Error code: server on fire
« Ответ #12 : 26 Ноября, 2015, 11:40:18 »
  • Рейтинг:0 (+0 | 0)
Крайне занимательно вышло. Прочитал про данжи, на релизе дренора, вспомнил сотни бедняг (среди которых и сам был), что возмущенно топтали чей-то гарнизон. :D
Аз есмь во многих ипостасях

Taithur

  • Новичок
  • *
  • Сообщений: 47

  • Варкрафт: +
    • Имя: Tairein
    • Класс: Shaman
    • Сервер: Argent Dawn
Re: Error code: server on fire
« Ответ #13 : 26 Ноября, 2015, 11:48:02 »
  • Рейтинг:0 (+0 | 0)
очень интересно :P спасибо)

Mardekaitv

  • Завсегдатай
  • **
  • Сообщений: 468
Re: Error code: server on fire
« Ответ #14 : 26 Ноября, 2015, 12:18:09 »
  • Рейтинг:4 (+4 | 0)
Инженеры заранее собрали конфигурацию, которая по их мнению должна была работать, но после запуска оказалось, что в серверах, отвечающих за инстансы, почти мгновенно закончилась память. Не удивительно: каждый гарнизон порождал новый инстанс, и в какой-то момент количество инстансов измерялось сотнями тысяч.
Инженер Близард: Ой, а откуда у нас взялись сотни тысяч инстансов? У серверов инстансов уже кончилась память!
Разработчик гарнизонов: Не удивительно, мы сделали гарнизон каждого игрока отдельным инстансом. А что, вы не знали?
Инженер Близард в панике убегает переставлять память

 :facepalm:
« Последнее редактирование: 26 Ноября, 2015, 12:20:53 by Mardekaitv »

 

закрыть