Поделиться

вторник, 13 декабря 2011 г.

Игры и скрипящий Skyrim

Дожили. Игра Elder Scrolls 5: Skyrim получила по версии VGA (Video Games Awards - Spike TV) приз как игра года. И это при преотвратительнейшей реализации. Сначала нарастающие тормоза, падение фреймрейта и увеличивающийся размер файла сохраненной игры заметили владельцы Playstation 3 (и я в их числе). Затем появились сообщения о пропадающих текстурах на Xbox и каких-то проблемах на ПК. Ждали патча. Дождались патча, который ничего не исправил, да и не мог ничего исправить - я думаю, что его выпустили специально до VGA, чтобы таки взять приз, отрапортовав о решении проблемы. Настоящего же решения проблемы, полагаю, мы будем дожидаться где-то полгода...

У меня сейчас в игре накручено где-то 200 часов, размер файла сохранения превышает 12 мегабайт. Играть из-за тормозов становится н-е--во---з-м-ож-----н-о где-то через 2 часа после начала, но это не значит, что эти 2 часа все замечательно... просто если не заходить в города и вообще какие-либо обитаемые людьми, способными говорить, места, не пытаться разговаривать с NPC в принципе, а еще, если повезет? и я не встречу ни одного дракона, то кое-как передвигаться по огромному открытому миру (вот, БЛИН!) можно. Это первая игра в моей жизни, в которую я по вечерам перестаю играть не потому, что надоело, а потому, что не могу больше этого делать. Творцы-создатели мифов, много раз мною воспетые, мать вашу!

Почему не стоит ждать спасения быстро? Если верить анализу Digital Foundry и Джоша Савье (режиссера Fallout: New Vegas, который, кстати, вообще вис как сумасшедший, хотя в последний раз, когда я его переигрывал - тормозил, но не так сильно, как Skyrim, и ни разу не завис) проблема Skyrim-a фундаментальна - она в движке и в том, как оный обращается с памятью.

Представим себе, что в мире лежит некий предмет. Для простоты представим, что мир - двумерный. Тогда предмет, помимо всяких его характеристик должен быть представлен в программе и своими координатами (x;y). Опять-таки рассматривая простейший случай безликих камней, кои все одинаковые, безымянные, и коих превеликое множество в мире, мы можем описать все это множество массивом структур:

typedef struct _Item
{
long id;
long x,y;
} StructItem;

StructItem items[N];


при этом каждый предмет имеет некие начальные координаты. Я понимаю, что там не статический массив, но суть не в этом.

Теперь представим себе, что игрок переместил предмет-камень i в точку (x1;y1). Что должно произойти в программе? Те, кто скажут, что в программе должно произойти нечто вроде:

items[i].x=x1;
items[i].y=y1;


будут логичны, но это не то, что происходит в Skyrim-e. Там создается новая переменная типа структуры выше и добавляется в массив, так что в итоге оказывается:

StructItem items[N+1];

и при этом:

items[N].id=items[i].id;
items[N].x=x1;
items[N].y=y1;


И так каждый раз при перемещении предмета (с оговоркой: если я правильно понял то, о чем говорят Digital Foundry и Джош Савье) программа съедает еще кусочек памяти... опаньки! Когда человек играет, программа постепенно и непрерывно "загаживает" память до постепенно, но неотвратимо приближающегося состояния стагнации. Когда человек сохраняет игру на диск, все вот это вот на него записывается (отсюда рост файла), а когда загружает - все это также подряд и загружается, не говоря уж о том, что на перебор таких вот записей нужна уйма времени и со временем (пардон за каламбур) - все большая.

Если дело действительно в этом, то глупо ждать быстрого решения: нужно весь движок перебирать. Наивно также полагать, что серьезные проблемы были и останутся только у владельцев Playstation 3 - у данной приставки специфическая архитектура памяти и маловат ее объем, но в перспективе "все там будут": и игроки на ПК, и владельцы Xbox360.

Меня раздражает даже не это все. Меня раздражает, что я был прав... Годы напролет я вел дистанционные и очные споры и с людьми, которые разбираются в образовании и программировании, и с людьми, которые не разбираются ни в том, ни в другом относительно необходимости продолжения преподавания программистам Ассемблера и низкоуровневых аспектов функционирования машин. "Java!" - кричали они. "C#!" - кричали они...

Вот вам и Java, вот вам и C#, и автоматическая сборка мусора, и незнание фундаментальных аспектов управления памятью, и забивание на оптимизацию и анализ алгоритмов, вот она виртуальная память, фиговое проектирование и современное образование в целом. Вот поколение "специалистов", у которых в Turbo Pascal-e 7.0 никогда стек не переполнялся!

Мы же видим перед собой в красивой упаковке с надписью Elder Scrolls 5: Skyrim живейший (хоть и медленный) пример НАИТУПЕЙШЕГО метода организации работы с памятью по принципу "всем хватит". Я сказал, что я раздражен? Боже, да я ликую! Точнее мне грустно и весело одновременно.

11 комментариев:

  1. Хахаха! Да здравствует криворукость индусов! Да здравствует беспечность высокоуровневых программистов, ни разу не писавших на асме под х51!

    Помнится мне одна история про программиста микроконтроллера - называлась она как так: "Как мне не хватило одного байта".

    Интересно, при разработке движка, они хотя бы структурным проектированием и анализом движка занимались? :-)

    Или писали как обычно, как бог на душу положит.

    ОтветитьУдалить
  2. Да, да, да, помню эту трогательную историю про 1 байт. :)

    Если я правильно понял, то (цитата): "У них этот движок был всего 18 месяцев, поэтому они не успели разобраться". :) Я бы, ей Богу, подождал бы еще 18 месяцев, потому что все равно теперь неизвестно сколько ждать спасения.

    ОтветитьУдалить
  3. Вот подтверждение того, что консоли это фигня :) 16 гигов рам стоят не так уж дорого и вставить их в комп дело 5 минут. А с консолями вот такие проблемы.

    ОтветитьУдалить
  4. Владимир - вставить 16 гиг памяти - это не наш метод и неправильный выход. К тому же на 32-х битных ОС это вообще не работает.

    Валерий Викторович, так это купленный движок получается? Не смогли за 18 месяцев разобраться, что ж они там делали 1,5 года ?!?

    ОтветитьУдалить
  5. Владимир, ну Боже ж мой - мир в глазах смотрящего! :) Во-первых, по статистике (по одному из исследований - оговорюсь) 86% людей играют в Skyrim на консолях и только 14 % - на ПК. Во-вторых, да на сегодняшний день современные компьютеры мощнее консолей, но давайте смотреть правде в глаза - какой % ПК в мире таковы? Вот реально работающих по домам? В-третьих, пост вообще не об этом.

    Конечно, давайте под каждую кривую программу "довставлять" дополнительную память: "Купи Windows Х и получишь в качестве бонуса плату на 64 метра RAM"! :) "Skyrim collectors edition - new motherboard with Intel CPU included"?

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

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

    ОтветитьУдалить
  6. TO JSC: Насчет движка точно не уверен - у них же там большая компания, в ее рамках студии, сотрудники и проекты кочуют периодически, так что уже не поймешь - я просто процитирую слова Джоша Савье:

    "Obsidian also only had that engine for a total of 18 months prior to F:NV being released, which is a relatively short time to understand all of the details of how the technology works".

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

    ОтветитьУдалить
  7. ну они хоть как-то догадались что-то сделать
    уже небольшой прогресс

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

    ОтветитьУдалить
  8. Привет, этот пост попал в Топ каталога Russian Top Blogspot

    ОтветитьУдалить
  9. Вчера было очередное обновление - игра "ускорилась"... как обычно не сильно и, видимо, как обычно, не надолго. :)

    ОтветитьУдалить
  10. я сегодня опросил ПКшника, который играет в скурим, и который знает других ПКшников играющих в него

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

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

    Да и объемы памяти современных и даже полусовременных ПК нынче больше, чем на приставках, чего не скажешь о сравнении ходового процессора современного ПК, например, и PS-шного cell-a. Так что если глюк в менеджменте памяти, то его можно долго не увидеть, но если он в том, о чем я говорил, то рано или поздно он станет заметен обязательно.

    ОтветитьУдалить