Gamedev Андрей Верещагин
9 770

Пылесосы и часы: разработчики рассказали о самых необычных причинах багов в своих играх

На поиски некоторых уходили недели, а на исправление — всего пять минут.

В закладки
Аудио

Программист из инди-студии Flippfly Аарон Сан Филиппо в своём твиттере рассказал историю о поиске бага в игре Race the Sun, над которой он работал.

I'd like to tell you a little story about what it's like to actually run an indie game company. We've been working on this Limited Run release for Race The Sun for some time now. We thought we were on the home stretch around June with getting everything finished...
230
616
Я бы хотел рассказать вам историю о том, что это на самом деле такое — управление инди- компанией. Тогда мы уже какое-то время работали над версией Race the Sun от Limited Run. Где-то в июне мы думали, что находимся на финишной прямой, просто доделываем оставшееся.

Речь идёт о версии Race the Sun для консоли PlayStation Vita. Отдел контроля качества Sony обнаружил в игре два бага. Первый был незначительным и на его исправление у разработчика ушло «пять минут», а второй приводил к зависаниям. При этом в Sony не дали Аарону Сан Филиппо чётких указаний, как воспроизвести ошибку — казалось, что она возникала случайным образом. При этом у самого разработчика проблем не возникало.

Программист на протяжении 20 часов пытался заставить Race the Sun зависнуть, но безуспешно. Он даже внёс кое-какие правки в код в слепую, но из-за этого в Sony игра стала «крашиться» лишь сильнее, а у самого Аарона Сан Филиппо она работала как надо.

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

В тот момент я решил написать скрипт, который сам бы играл в игру. Где-то через 24 часа Race the Sun должна была использовать всю память системы, но проблема точно заключалась не в этом, ведь в Sony регулярно докладывали об ошибке.

Поэтому я стал думать о том, что в тестовой среде Sony могли быть какие-то отличия. Я пообщался с тестерами (которые мне очень помогли) и выяснил, что мы используем те же самые устройства и ОС. Однако у них краши случались, а у меня — нет.

Аарон Сан Филиппо
разработчик

Через несколько недель разработчика осенило: «Что, если различия кроются в скорости соединения с интернетом?» Аарон Сан Филиппо включил 3G и запустил свой скрипт — игра зависла в течение часа.

Оказалось, виной всему было так называемое «состояние гонки» — состояние, при котором баги возникают из-за нарушения порядка выполнения действий, связанных с обработкой одних и тех же данных. В случае с Race the Sun проблема заключалась в том, что игра пыталась внести результат игрока в «таблицу лидеров» ещё до того, как подсчёт очков был завершён. На поиск и исправление бага у Limited Run ушло около четырёх или пяти недель.

Другие разработчики также поделились своими историями о самых необычных причинах ошибок в играх, а также об их поиске. Так, технический художник из Treyarch рассказал о том, с чем ему пришлось столкнуться при работе над портом одной из частей Guitar Hero для PlayStation 2.

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

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

@AeornFlippout Turns out the slight difference in disc read speed versus loading the game from the PS2 dev kit HDD caused the desyncs, and the tutorials were hard coded to run at certain frame intervals. Oops
1
8
Оказалось, что существует небольшая разница между скоростью чтения диска и загрузкой игры с жёсткого диска девкита PlayStation 2. Она и вызывала десинхронизацию, ведь обучающие уровни были запрограммированы проигрываться со строгими интервалами в кадрах. Упс.

Один из разработчиков Prison Architect под ником Tommodore 64 рассказал, с чем он столкнулся, выпуская Frozen Synapse для PlayStation 3. Игра вышла бесплатно для подписчиков PS Plus, однако у многих пользователей она крашилась при первом запуске.

Этот баг стал неожиданностью не только для разработчиков, но и для команды контроля качества в Sony — прежде Frozen Synapse нормально запускалась на всех устройствах для тестов. В итоге в Sony всё-таки удалось найти копию PS3 для воспроизведения бага.

Отдел контроля качества отправил разработчикам отчёт об ошибке, но, по признанию Tommodore 64, в нём содержалась «какая-то чушь». Однако программисты смогли извлечь из него нечто полезное — оказалось, что проблема возникала из-за метода сохранения данных. Один из членов команды разработчиков предположил, что баг появился после выхода патча первого дня.

Авторы игры отправили Sony версию без него, и та отлично запускалась на той PlayStation 3, которая прежде не могла загрузить Frozen Synapse.

Оказалось, что у ревизий PS3 есть незначительные технические различия, которые полностью ломали нашу систему сохранения. Так как мы не могли самостоятельно воспроизвести баг, нам пришлось переписать её с нуля. Если бы не одна странная копия консоли в ливерпульском офисе отдела качества, в игру нельзя было бы поиграть и по сей день.

Tommodore 64
разработчик

Люк Томпсон из студии Sigtrap Games рассказал о поиске бага в шутере Sublevel Zero Redux для PlayStation 4. На этот раз он не был связан с зависаниями — игра отлично работала в офисе контроля качества Sony, однако один из тестеров заметил, что уровни, которые должны генерироваться случайным образом при каждом запуске, повторяются.

Проблема крылась в версии движка Unity для PlayStation 4. Из-за это последовательность уровней была постоянной.

Лайан Браун, который сейчас работает в Hello Games, поделился историей поиска бага в неназванной игре для PlayStation 2. Она отлично работала на девките, но при запуске с диска подгрузка ассетов и текстур сильно замедлялась. Разработчики пытались менять порядок загрузки файлов, но ничего не работало.

Кто-то заметил, что производительность падала, когда мы добавляли маленькие часы на задний план. Они работали в реальном времени. Оказалось, что PS2 приходилось каждый кадр обновлять данные о времени, а это было плохой идеей. Маленькая, незначительная деталь, которую я добавил в обход продюсера, чуть не стоила нам релиза.

Лайан Браун
разработчик

Сооснователь Media Molecule Алекс Эванс рассказал, с какими трудностями пришлось столкнуться при разработке первой Little Big Planet. По его словам, за две недели до того, как игра «ушла на золото», японские тестеры стали сообщать о баге — Little Big Planet крашилась, если оставлять её запущенной на 24 часа. В студии воспроизвести ошибку не удавалось.

Разработчики пытались воссоздать условия, при которых возникала ошибка. Они использовали то же оборудование и программное обеспечение, а также подключили к консоли цифровую камеру PlayStation Eye и оборудование для записи звука, как в японском офисе контроля качества. Удалось установить, что игра крашится только около 4 часов утра каждый день.

Почему? Что происходит только в Японии в 4 часа утра? Мы решили узнать. Оказывается, что в это время в офисе проходила уборка. Местные уборщики гораздо тщательнее выполняют свою работу, чем наши! Час уборки пылесосом возле PlayStation Eye воспринимался игрой как белый шум и вызывал потерю нескольких байтов памяти. Если пылесосили долго, то происходил краш.

Алекс Эванс
сооснователь Media Molecule

Узнав об этом, разработчики смогли воспроизвести баг. А на его исправление потребовалось всего пять минут.

Программист Филип Бак поделился опытом с «обратной стороны», рассказав, как происходила работа в отделе контроля качества Sony в 1998 году. По его словам, он устроился туда сразу после окончания университета.

Мы гордились собой, находя самые безумные способы сломать ваши игры. А всё, что вы получали — это дёрганная VHS-запись, да плохо написанный отчёт. Сама политика была уморительной. Раз или два менеджер приходил к нам с новой задачей (от старых коллег, с которыми он, очевидно, порвал все связи) и говорил: «Первый тестер который сможет сломать эту игру получит оплачиваемый отгул».

Филип Бак
программист

#опыт

{ "author_name": "Андрей Верещагин", "author_type": "editor", "tags": ["\u043e\u043f\u044b\u0442"], "comments": 50, "likes": 195, "favorites": 93, "is_advertisement": false, "subsite_label": "gamedev", "id": 32215, "is_wide": true, "is_ugc": false, "date": "Sun, 25 Nov 2018 14:49:26 +0300" }
{ "id": 32215, "author_id": 22254, "diff_limit": 1000, "urls": {"diff":"\/comments\/32215\/get","add":"\/comments\/32215\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/32215"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64954, "possessions": [] }

50 комментариев 50 комм.

Популярные

По порядку

Написать комментарий...
52

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

Ответить
17

Это настоящий детектив получается.
А помните как Хуан включал камин, когда искал геймпад?

Ответить
2

Выяснили, в чем было дело?

Ответить
6

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

Ответить
0

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

Ответить
0

если им такие закономерности искать приходится

искать

Ответить
1

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

Ответить
0

Сори, перепутал истории в статье, "японские тестеры стали сообщать о баге" — Little Big Planet крашилась, если оставлять её запущенной на 24 часа. В студии воспроизвести ошибку не удавалось. А вот поиск ее в причины уже лег на разрабов (кто код писал, тот его и знает)

Ответить
0

Мля , это инженеры чинить должны , а не программисты

Ответить
27

у ревизий PS3 есть незначительные технические различия

Сколько раз во время срачей я пытался опровергнуть пункт о том что "у консолей в рамках поколения всего 2-3 конфигурации", но меня не слушали, уверяя что все это чушь.

Наконец-то удалось заполучить доказательство что это не так!

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

Ответить
11

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

Ответить
5

Ему про конфигурации, а он про ревизии примерно/одних и тех же железок.
Дтф

Ответить
4

Кстати, на ранних PS4 Slim у многих игроков появилась проблема с Metro 2033 Last Light Redux, консоль просто вырубалась, интересно решилась проблема, и в чём она была.

Ответить
1

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

Ответить
2

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

Ответить
1

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

Ответить
0

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

Ответить
5

Каких-каких отличий?

Ответить
0

Что не ясно?

Ответить
0

Не ясно, каких отличий.

Ответить
11

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

Ответить
0

Любые, начинает от драйверов заканчивая аппаратными

Ответить
0

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

Ответить
13

«Первый тестер который сможет сломать эту игру получит оплачиваемый отгул».

Работа мечты...

Ответить
26

А потом ему дали fallout 76 и он больше не работал😂

Ответить
5

Зарплату скайримами отдали.

Ответить
6

... без отпуска

Ответить
0

Или с неоплачиваемым.

Ответить
13

Оказалось, виной всему было так называемое «состояние гонки» — состояние, при котором баги случаются после выполнения определённых действий в определённом порядке.

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

Ответить
0

Ага, очень частая проблема для сетевых игр. Race the Sun - не очень про мультиплеер и потому разработчик скорее всего не ожидал проблем в таком месте.

Ответить
2

Race condition скорее очень частая проблема в условиях, где основные метрики являются непостоянными (например разработчик предположил что задача пересчета статистики займет 1 минуту, но не учел что скорость ее выполнения так же зависит и от скорости получения данных из интернета). В общем race condition больше пресуща тем программам, которые используют несколько потоков выполнения (т.е. параллельно выполняется несколько задач, использующих какие-то общие данные). Вообще многопоточная разработка все еще является достаточно сложной для многих вещей, к которым относится и геймдев.

Ответить
1

Закладываться на время совсем не обязательно. Возьмём тупой демопример:
sum.update(int amount)
Где update(int amount): balans += amount

Если 2 потока одновременно зайдут в sum.update(), то может быть ситуация, что текущий баланс будет взят дважды, у каждого потка одинаковый, потом каждый поток независимо от другого обновит его по-своему и результат предсказать нельзя будет.

То есть (если кто-то из читателей не очень понимает состояние гонки):

текущий balans = 5. Два потока хотят обновить баланс. Один желает накинуть 3 рубля, другой желает снять 2 рубля. Гонка будет в том, что оба они зайдут в операцию обновления, оба возьмут 5 и проведут свои операции. И фиг его знает, то ли вам повезёт и операции пройдут последовательно и тогда итоговый баланс будет 3 рубля, то ли 8 рублей, то ли 3 рубля, то ли всё упадёт нафиг, потому что дальше ещё есть некий код, которому на вход придут не ожидаемые им данные.

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

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

Ответить
1

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

Ответить
6

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

Ответить
0

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

Ответить
0

Ну ошибки в по несколько другое, я имею в виду не проблему самого железа, а проблему поиска и локализации программной плавающей ошибки, которой свойственно воспроизводиться только в определенных условиях и на определенной конфигурации. Например из собственной практики, локально у разработчиков нашей команды среднее время возврата значения для запроса было 4-6мс, в то время как среднее время отклика для серверной инфраструктуры для этого же приложения составляло 20мс (и это при том что серверная инфраструктура была раза в четыре мощней). При этом как бы багрепорт на основе этого писать разрабам используемых нами компонентов - ваще ни о чем, потому что нет даже подозрения ни у кого на что-то конкретное. что виной всему библиотека для убунту, которую собирали с неоптимпльными настройками времени компиляции и в общем замена убунту на дебиан решила эту проблему. Но для того чтобы понять хотя бы источник проблемы, мы потратили около недели. В принципе это характерная для пк-платформы ситуация в целом, да и вообще характерная для окружения, в котором множество компонентов хаотично сочетаются их владельцами друг с другом

Ответить
1

Смысл в том, что разработчикам Хрома пришлось самим искать эти баги железа, чтобы Хром нормально на нём работал. И это ещё сложнее, чем выявить баг в своём коде.

Ответить
0

А, пони. Спасибо за наводку, гляну.

Ответить
4

Ну тут какие-то скучные баги. То ли дело баг, когда объект-хищник внезапно исчезал с карты, съедая самого себя. Вот это я понимаю :D.
В свое время писал другу дипломную прогу в институт, которая прекрасно работала, но на защите вылетела напрочь. Благо ему дали время разобраться проблемой, так что после недели медитаций меня осенило, что, в зависимости от времени суток, одна из функций возвращала часы в виде 1байта ночью и утром или 2х байт - днем и вечером. Уж не помню, что я там делал с числами потом, но вот ощущение, когда ОТЛЕГЛО - на всю жизнь :D

Ответить
2

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

Ответить
1

в офисе контроля качества Sony

Я так понимаю больше этого офиса нет, иначе как они пропустили fallout 76 в релиз ...

Ответить
2

иначе как они пропустили fallout 76 в релиз .

Сознательно. Мультиплеерных дрочилен ща очень много, а вдруг ещё одна не взлетит? Но денег на ее допиливание и полировку потрачено много. Потому выпускаем как есть, проверяем есть ли к ней интерес (а недовольство это тоже интерес, тока со знаком минус, но все равно не покупая игру нельзя узнать о том, что в ней полный вырвиглаз и жопа с физикой, так что недовольные тоже ее купили), допиливаем уже в процессе. Профит

Ответить
0

Крупный издатель и деньги… Это мелким разработчиком приходиться бороться над контролями качества или цензурой, а крупным издателям на такое плевать. Можно ещё там своих друзей иметь, чтобы проталкивать Белого Тигра и Лошадь Гоночный

Ответить
0

Ну некоторые баги, это все таки халтурная машина состояний.

Ответить
3

Вопрос трудозатрат, по большому счету источником даже описанных здесь проблем является то, что разработчики каждого из компонентов не учли кактх-то вариантов их совместного использования, или то, как их будут использовать другие (да и просто человеческий фактор - не выспался, жена ушла к соседу, кошка заболела, все это влияет оч сильно). Но тут важным моментом является то, что например в игровой индустрии баг с пылесосом никого не убьет, в то время как в медицине от него может зависеть чья-то жизнь (это правда сильно никого не останавливало, можете почитать историю с электронным рентген-аппаратом или с по Тойота для электронного АВС). И тут возникает диллема - выискивать и дальше источник ошибки, или же забить. В случае же, когда будущее проекта вообще непонятно (он может на старте никого не заинтересовать, пример - Фоллаут 76), можно выпустить сырой прототип, и если он выстрелит, чинить и добавлять функционал уже наживо.

Ответить
0

Не вижу здесь Rockstar'овцев, которые рассказали бы нам о интересной причине бага в RDR2: летающая бутылка виски. По-любому там какое-то Старое Приведение, просто я не смог быть внимательным к деталям и не нашел нужного квеста.

Ответить
0

Час уборки пылесосом возле PlayStation Eye воспринимался игрой как белый шум и вызывал потерю нескольких байтов памяти

А как шум может влиять на память?

Ответить
0

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

Ответить
0

Те́стер — бытовое название нескольких видов приборов: Мультиметр и Кабельный тестер
Тестиро́вщик — специалист, принимающий участие в тестировании компонента или системы

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } } ]
10 самых лучших блюд
(согласно инстаграму Хидео Кодзимы)
Подписаться на push-уведомления