Пользователь
0,0
рейтинг
21 декабря 2010 в 15:21

Разработка → Как я наказал Firaxis или история о том, как перебрать бинарный движок через глушитель из песочницы

image

Речь пойдёт о далёком 2005 году, когда только-только вышла Civilization4 от Sid Meier. К тому времени я плотно висел в Civilization3, прошёл её раз дцать на самых разных картах, и тут вышла долгожданная четвёрка. Это были годы P3-512Mb для mid-end и P4-1Gb в hi-end. Только топовые конфиги в те годы имели два гига памяти на борту.

Civilization 4 вышла с графикой уровня года 2002-2003го, что в принципе нормально для мэинстрима тех времён, особенно учитывая что это пошаговая стратегия, а не шутер. Но жрала с течением игры до 900Mb оперативки, что приводило к жуткому свопу, особенно на больших картах, особенно к концу игры, особенно на ноутбуках. Народ недоумевал, я тоже. Учитывая, что в те же годы вышел Far Cry с куда более красивой графикой, и который вполне игрался на максимуме даже с 512Mb на борту, такое поведение Civilization 4 выглядело крайне странным. Захотелось разобраться и покарать…

Итак, я начал ковыряться. Первое подозрение пало на Python, т.к. Firaxis упоминала о его использовании как важной фиче на каждом шагу, а там и сборщики мусора, и неосвобождение памяти после пиковых нагрузок, и много разного веселья происходит. Это был кандидат номер один на обвинение в прожорливости. Был скачан исходник питоновской dll, в ней было добавлено логирование всех выделений памяти, dll была подсунута цивилизации вместо родной и… ничего интересного не проявилось. На питон уходило дай бог 25Mb памяти. Что-то другое драконовски поедало ресурсы.

image

Закралась идея утечки памяти в обычных C-шных выделялках памяти. Так как использовалась CRT (C runtime library) в DLL, был повешен ala-detours хук на все вызовы malloc, realloc, free и… тоже с нулевым результатом. Следом подумалось, что причиной всему фрагментация памяти на частых перевыделениях, может даже по вине питона. Написал свой менеджер, выделяющий всегда объём, кратный степени 2 — без толку. Цивилизация как ела по 800Mb, так и продролжала их жрать. Я немного впал в ступор — куда это девается столько памяти.

Повесил API хуки на все VirtualAlloc, с вычислениям CS:EIP caller'а, чтобы узнать civ4.exe или python24.dll выделяет большую часть адресного пространства. И тут выяснилось, что съедает её d3d9.dll. Это уже стало интересней, с чего бы это ему жрать ресурсы, если всё (или почти всё) должно лежать в видеопамяти. После этого я начал хучить DirectX'овые вызовы — начиная от создания девайса, и вплоть до создания текстур, вершинных и индексных буферов.

При изучении, что и как делает Civilization4 выяснилось, что некоторую часть ресурсов она держит в D3DPOOL_DEFAULT (позже выяснилось что это были ресурсы графического интерфейса, написанного сторонней компанией Scaleform, эти ребята сейчас неплохо развились, т.к. их продуктами пользуются даже чуваки из CryTek). Всё остальное Civilization4 хранила в MANAGED пуле, оно и жрало по 500mb памяти.

Небольшое отступление по поводу MANAGED и DEFAULT пула для ресурсов в DirectX. Видеопамять может использоваться сразу несколькими приложениями, и наличие или отсутствие в ней нужной текстуры или вершинного/индексного буфера является критичным для способности что-то нарисовать. В случае DEFAULT пула в случае вытеснения видеоресурсов одного процесса другим, видеопамять тупо затирается, а последующие операции отрисовки с использованием потерянной области возвращают ошибку, мол «объект утерян». Реакцией на такую потерю должно быть восстановление объекта путём перечитывания текстуры с диска и пересозданием текстуры в видеопамяти.

В случае MANAGED пула механизм примерно такой же, но все текстуры и остальные ресурсы кэшируются DirectX'ом в оперативной памяти, делая реакцию на ошибки прозрачной — он сам восстановит копию в видеопамяти из оперативки в случае её затёртости другими программами, по аналогии как для обычной памяти «бэкапом» выступает своп-файл. Это упрощает жизнь программисту, так как ему больше не надо заботиться о перечитывании видеообъектов во время цикла отрисовки, но неправданно увеличивает потребление оперативной памяти, особенно когда игра большую часть времени находится на переднем плане, ни с кем её не делит и если видеопамяти хватает с избытком.

Аналогия с обычной памятью и жёстким диском, к сожалению, до конца не работает. Объём жёсткого диска обычно раз в 100 больше объёма набортной памяти, поэтому нет ничего страшного в том, чтобы размер своп-файла равнялся объёму RAM. Соотношение же RAM и VIDEOMEM обычно порядка 4/1, а не 100/1. Поэтому MANAGED — это не продакшн решение, а скорее режим для ленивых, уместный для мелочей, которые много не весят. Если пихать всё подряд в MANAGED, будет как на картинке:

image

Все серьёзные движки работают с DEFAULT пулом, используя перечитывание объектов с диска или в крайнем случае используя своё кэширование в оперативной памяти, но только не MANAGED пул. Собственно, способность корректно обрабатывать ситуацию потери ресурсов при работе с DEFAULT пулом и является причиной (не)дружелбности игр к Alt-Tab.

Сначала через хуки на создание объектов я попробовал перевести всё в DEFAULT пул. Картинка посыпалась. Сначала не понял, в чём дело, потом сразу дошло… естественно 500Mb ни в какую видеопамять не влезет (в те годы топовые видяшки имели по 256Mb на борту). Стало понятно, почему они заюзали MANAGED пул — в видеопамять не влазили даже собственные графические объекты, даже не говоря о конкуренции за видеопамять с другими процессами при alt-tab!

Так же стало понятно почему своп никогда не утихал. В случае избытка видеопамяти managed часть из оперативки постепенно съехала бы в своп, вытесняясь реально используемыми страницами, и тормоза бы исчезли. Hо этого не происходило, потому что к этому managed кэшу постоянно шло обращение. В общем, понятно было всё. Коме одного. Far Cry хватало 512Mb RAM и 128Mb video без какого-то жуткого свопа. И это с той графикой! Civ4, если её перенести в наше время, имела графику уровня 2005го года при требовании 5Gb оперативки.

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

Проверка текстур привела к очередной неожиданности. Их было что-то около 50Mb на low и что-то около 120Mb на high. Куда же делись остальные 400mb? Начинаю логировать вообще всё что вызывается через Direct3D и нахожу… 400 мегабайт vertex buffer'ов! Vertex buffer — это данные о геометрии, трёхмерные модели юнитов, городов и ландшафта. В голову начинают лезть нехорошие мысли, что они прорисовали анимацию всех юнитов покадрово, и ничего с этим не сделать… для успокоения совести сортирую потребление памяти vertex buffer'ами по FVF (формат вершины — что в ней есть, а чего нет, к примеру координаты, освещённость, привязка к текстурам и т.п.). Находится несколько разновидностей вершинных буферов, все они много не едят, кроме одного, который жрёт аж 280Mb.

Как выяснить что это за буфер? При заполнении данных что текстур, что вершинных буферов делается сначала Lock, потом идёт заполнение данных, потом делается unlock. Туда и впаиваюсь — в unlock. Перед анлоком подмешиваю случайные величины в кооррдинаты вершин, и наблюдаю что поменялось. Ожидаю что у солдат начнут дёргаться руки-ноги. А вот хрен… земля поплыла! И тут на меня снисходит прозрение, почему оно тормозит к концу игры и чем больше карта, тем тормоза сильнее. Дело вовсе не в количестве разновидностей юнитов на карте. Дело в количестве обозримых тайлов карты! Ландшафт для каждой клетки игрового мира учитывает все близлежащие горы, реки, моря, типы поверхности (песок, трава, снег), и, таким образом, получается что на каждую клетку ландшафта влияют несколько соседних, что и затрудняет подготовить заранее все возможные геометрические конфигурации тайлов.

image

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

В качестве хэша была выбрано представление данных vertex buffer'а по основанию 5 на исходных байтах как цифрах. Это хорошо перемешало входные данные без коллизий, потому что 5 — простое число и не степень двойки и потому что умножение на 5 в процессоре реализуется как LEA EAX, [EAX*4+EAX], что шустро считается. Сам хэш был воткнут на тот же Unlock() vertex buffer'а. При unlock'е искался идентичный vertex buffer в хэшируемом кэше, и если он находился, данные анлокнутого буфера удалялись, а при рисовании через DrawIndexedPrimitive вместо моего IDirect3DVertexBuffer, который я подсовывал civ4.exe, использовался реальный буфер с закэшированными данными, один на все подобные буфера.

Пол дня я эту корягу писал из C++ шаблонов вперемешку с ассемблерными вставками и перехватом COM вызовов через detours хуки (патч vtbl почему-то не сработал), потом запустил… Вах! — потребление памяти снизилось с 800Mb до 300-400Mb! По меркам 2010го года — это равносильно снижению потребления памяти с 4х гигов до полутора.

Я наконец-то смог завершить начатую партию, не допивая чашку чая в течение каждого хода из-за дикого свопа. Выложил патч на civfanatics.com, народ был в восторге (link). 150k скачиваний в первые дни только с civfanatics, и патч был перевыложен на самых разных fan сайтах. Что я тогда испытал — словами тяжело описать… это был кайф! наконец-то удалось исправить эту серьёзную проблему, без сорса, да еще и являющуюся не банальной утечкой памяти, а серьёзным архитектурным изъяном. Firaxis несколько месяцев не мог повторить сей подвих, даже с собственным кодом на руках. Публичная порка за lame coding удалась на славу.

image

P.S: Как обстоят дела в Civilization 5, не смотрел.

P.P.S: Пока проходил StarCraft 2, не мог не сравнивать графику / потребление-памяти с Crysis. К счастью для моего сна и, возможно, для Blizzard, в ноутбуке оказалось 4Gb оперативки. Поэтому неоправданное поедание памяти SC2 вызвало недоумение, а не своп. Попадись он мне на 2Gb железке, пришлось бы взяться за старое :)
Денис Кошман @Harkonnen
карма
349,7
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (176)

  • +58
    Всегда поражали подобные энтузиасты. Отличная работа!
  • +36
    Отличный показатель: статья настолько хороша, что даже мне, человеку, который имеет к IT весьма опосредованное отношение, было интересно ее прочитать.
    • +3
      Оправдываете никнейм :)
  • +8
    Спасибо) Детектив настоящий получился.
  • +8
    вау! на одном дыхании прочитал
  • +2
    Ну Шерлок Холмс внатуре
  • +2
    Классно написано, и к тому же столько проделанной работы. На счет недоработок не удивлён, потому как желанием выпустить, да побыстрее, страдают не только наши компании.
    P.S. Civilization Forever!
    • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    Черт, да вы просто крут! Помню цивку4 играл на ноуте как только она вышла — точно так же плевался на своп. Не знал про ваш патч, и не знал, что фираксис это пофиксило в конце концов — ибо забил на 3 цивку и играл в старый добрый альфа центавр :)
  • +16
    Левша жив!
    • +5
      Ага =)
  • +1
    Гениально!
  • +4
    Детектив для ITшников со счастливым концом! бестселлер
  • +2
    ms-rem следит за этим постом.
    • +3
      угу, только написать не может
    • 0
      Гениальный человек был…
      • 0
        Я думаю с ним все хорошо.
  • 0
    Интересно, разработчики читают хабр? )

    Замечательная статья.
  • 0
    Выражаю свою уважение и яростно плюсую. Я думаю это было действительно интересно достичь такого результата!
  • +4
    Жаль у вас не дошли руки до Civ 5. Там после очередного патча, жутко долго ходил комп на последних стадиях игры. Но уже к следующему патчу ситуацию исправили. Видимо работали под страхом: «Что бы нас не обогнал тут русский» ))
    • +2
      Я думаю, что при разработке Civ 5, на патч автора статьи никто не смотрел
      На неслабой конфигурации

      Intel® Core™ i7-740QM processor
      NVIDIA® GeForce® GTS 360M
      4GB DDR3 1066MHz memory

      Тормоза к концу игры такие, что я успеваю пойти на кухню и налить чай, пока сходят противники
      • 0
        моя машина заметно хуже, но с последними патчами особых тормозов не наблюдалось, до этого да, нажимаешь конец хода и можно смело идти гулять.
        • +1
          Судя по отзывам на форуме издателя, данную проблему испытывают около 40—50% пользователей. И кому не повезло, тех мощный комп не спасает. :(
      • 0
        у меня ноут с Core 2 Extreme на 3,06, 8 гиг памяти и Quadro FX3700, был крайне удивлен тормозам. новых патчей не накатывал, купил в стиме в первый день продаж. до этого играл только во вторую)
  • +2
    Так это Вы были :D А я думал какой-то финн, а оказался наш россиянин :) Спасибо, в свое время очень помогло до выхода соответствующих патчей от Firaxis
    • +19
      Не, я не финн :) Harkonnen со времён DOS'овской классики Dune2.
      • +1
        Спасибо! Благодаря Вам я прошел Цив4 на ноутбуке с 1,5 Гб Рам.
        С Вами хоть разработчики связывались? Просили совета?

        Уверен, со StarCraft 2 та же ситуация, с 5 уровня начинается жёсткий своп на хард.
      • +1
        Можно поинтересоваться, сколько лет у вас опыт работы/сис программирования? =)
        • +2
          Профессионально ($) — около 10. Если брать вообще весь интервал знакомства с этим делом, то около 17.
  • 0
    такое ощущение, что игры и программы в последнее время никто не тестирует, а если и тестирует, то правит только те ошибки, которые делают работу невозможной.
    • 0
      Да, да, во времена Фамикомов такого не было =)
      На самом деле, проекты масштабнее становятся, оттого и сложно отловить все подобные ошибки на этапе тестирования. А тестировщикам игр (по крайней мере отечественных) приходится куда тяжелее, чем их собратьям из 1998-2000 годов.
  • +3
    мужик!.. что тут еще сказать)
  • +44
    Всем огромное спасибо за респекты! Та гонка длилась где-то четверо суток в режиме 6-через-6 (сон/кодинг). Очень хотелось выпустить патч раньше, чем это сделает Firaxis.
    • +2
      да, респектище!
    • 0
      А Фираксис таки выпустила патч?
      • +3
        Да, что-то они сделали. Мой патч при этом перестал работать (игра стала вылетать). Потребление памяти с их патчем снизилось. Не так радикально, как с моим, но для играбельности на 512Mb конфигах их патча тоже было вполне достаточно. Почему стал вылетать мой патч с этой их версией — я до конца не разобрался, то ли они применили какие-то нестандартные техники, то ли специально от него защитились. Во всяком случае в моём патче нет ничего специфического именно для Civilization4, там хэширование общего вида, которое можно натравить на любую игру.
        • 0
          Скорее всего таки заблочили Ваш патч. Чтоб не позорится=)
  • +25
    Переведите на английский и выложите на Hacker News, поднимите карму российских/постсссрских программистов!
    • +24
      will do :)
      • +1
        Если нужна помощь с переводом — пишите… :)
        • 0
          will consider :)
  • 0
    Всевозможные респекты вам.
  • +3
    Да вы просто маньяк!
    В хорошем, разумеется, смысле этого слова! ))
  • 0
    Скажите, а какой отладчик использовали?
    • +13
      Никакого :) Подменял вызываемые цивилизацией функции на свои через API хуки и логировал в файлы/на-экран что происходит. В Visual C++ всё было сделано, на голом WinAPI. На ранних этапах очень помог коммюнити civfanatics, чтобы собрать стату по потреблению памяти не только на своём компе, и чтобы потестировать на разных видеокартах. К примеру, выяснилось что мои хуки не дружили с RivaTuner OSD — те, видимо, тоже через API хуки что-то дорисовывали в кадр. С fraps'ом таких проблем не было. У самого тогда был несбалансированный конфиг: P3-1.3Ghz, 512Mb, Radeon 9800 Pro 128Mb.
  • 0
    посхальных яичек бы ещё добавить :)
    • +37
      Учитывая, что действие было в октябре-ноябре, я туда засунул рождественский Merry Christmas от Harkonnen'а на 25е декабря :) Во-первых прикола ради, во-вторых на случай если бы Firaxis в истерике законопатил мою dll внутрь exe своего официального патча. Из этих же соображений строки с поздравлением были зашифрованы чтобы не просматривались в hex редакторе.
      • +3
        молодца!
  • +16
    Я аж залогинился!
    Мужик!
    • +8
      <шутка>Залогинились, при людях? Как Вам не стыдно, разлогиньтесь немедленно ;)</шутка>

      Автору: присоединяюсь к предыдущим комментаторам — Вы молодец, однозначно!
      • +4
        > <шутка>Залогинились, при людях? Как Вам не стыдно, разлогиньтесь немедленно ;)</шутка>

        Эта капча при логине так раздражает, что для меня тоже «я аж на хабр залогинился».

        Автору дикий зачот. :)
        • +8
          hint: можно логиниться из почты, добавив в «избранное» любое письмо от хабра и жамкая на «ответить» в нём можно не вводить пароль и грёбаную каптчу.
          • 0
            Во-во, именно так и делаю с самого начала… :)
        • 0
          Harkonnen,
          Если подсчитать затраты сил всех залогинившихся то насобирается пожалуй на еще одну статейку. :)
          Ждем…
          • +2
            Вполне :) Уже думаю что это будет за статья. Но сначала попробую апгрейднуть civ5.
  • +18
    Ставлю бочонок черной крушовицы против бутылки жигулевского, что на этой неделе топикстартер будет завален приглашениями на работу безо всяких интервью и собеседований.
  • +5
    Респект OldSchool'еру!
    А сейчас модно прикупить пару планок памяти и не париться…

    Одну пожилую пару, прожившую 60 лет вместе, спросили: — Как вам удалось так долго прожить вместе? — Понимаете, мы родились и выросли в те времена, когда сломавшиеся вещи чинили
    • +5
      Я бы тоже бросил… но сложилось сразу несколько факторов — мой залипание на civ3 + выход civ4, которую я ОЧЕНЬ ждал + наличие свободного времени + приверженность к time-critical программированию, равная по силе приверженности к играм. Пришлось взяться :)
      • +5
        «приверженность к time-critical программированию»

        Вот за это особенный респект. А то последнее время цветет быдлокодерство под лозунгом «А хуле, железо то дешевое, че напрягаться?»
        • 0
          А то последнее время цветет быдлокодерство под лозунгом «А хуле, железо то дешевое, че напрягаться?»

          Это не то, чтобы быдлокодерство, просто так дешевле. Заказчик оптимизирует целевую функцию, ему не надо, чтобы было ВАХ, ему надо чтобы пипл хавал и при этом заплатил максимум денег при минимуме капиталовложений. Увы.
          • 0
            Всё верно, многие неприятности растут из расхождения целей.
  • +1
    Всегда считал людей, которые таким занимаются конченными психами! Но до чего же, чёрт побери, завидно! И хочется быть таким же фанатиком ))) Я бы просто бросил эту чёртову игрушку еще на пол-пути.

    В общем моё почтение и тонна белой зависти к вам. :)
  • +33
    Я ж говорил — народу статья понравится. Это лучшее моё вложение инвайта в песочницу.
    • +4
      Еще раз огромное спасибо! :)
    • 0
      Блин, жаль, что я бросил в песочницу заглядывать!
      • +1
        Очень зря. Последние где-то полгода только там умные технические статьи только и есть. На главной же — только про распилы, новую прошивку к айфону и классные ноутбуки от Асуса — читать нечего.
        • +2
          И про Михалкова… будь он неладен!
    • 0
      Еще бы,
      пост хорош, на одном дыханий как сказали ранее.
      за 1 пост сразу 20 место в рейтинг — отлично,
      Да и цивилизация форева)
      • 0
        Как раз в данном случае меня это не удивляет (и очень радует): это ведь не просто пост, это Пост! Не очередная бугагашенька из одной картинки, не очередной унылый обзор, не очередной репост и пр.
        Кстати, уже 14-е место. Так держать!
  • 0
    Вау, вы великолепны! Побольше бы таких людей!
    Как же хочется чтобы хоть кто-нибудь когда-нибудь довёл до ума Microsoft Flight Simulator X…
  • +2
    Вы не поверите… но для 5-ки они чинили абсолютно туже проблему в недавнем патче. :) Интересно — починили ли )
    • +5
      гкхм… :) надо будет попробовать этот патч с 5-кой. Привязка именно к civ4 там только в имени exe'шника, сам подход вполне универсален.
  • 0
    respect
  • +2
    Автор, мне тоже интересно будет, отправят ли вам приглашения на приличную работу?) Если вдруг выгорит, просто скажите здесь, да или нет, без названий имен)
    Ну уж очень интересно)
    • +1
      В те годы было предложение стать консультантом у одной из компаний, имеющих отношение к топику (не Firaxis)
      • +1
        ну интересно про «прямо сейчас» после этого топика)
      • 0
        Если не секрет, что вы ответили и как в итоге вообще сложился ваш профессиональный путь к текущему моменту?
        Сообществу нужны хорошие примеры )
        • 0
          Тогда для меня была эпоха перемен (не связанная с этим патчем), поэтому отказался. С тех пор поучаствовал в нескольких околостартапных коллективах на 5-20 человек. Карьеру «до пенсии» в гигантской корпорации для себя не ищу, т.к. это отвлечёт от создани одной штуки, которую я просто обязан сделать :) но толком пока еще не взялся.
  • 0
    Вы — молодец! Жму руку! А за цивку особенно тщательно! :)
    • +3
      За цивку всех порву! Даже создаталей :D

      Как бы там ни получилось с Firaxis'ом, Sid'у я премного благодарен за время, проведённое за Civ1 и Civ3. Остальные серии, включая четвёрку, к сож-ю попали мимо периодов с кучей свободного времени.
      • 0
        За пятую не брались?

        Я даже бокс-версию купил в первый же день продаж — хотел как-то Сиду Мейеру спасибо сказать. :)
        • 0
          Пока не брался, но в топике уже проскакивало упоминание схожих заморочек в civ5 :) постепенно зреет желание ковырнуть чё там как
          • 0
            Ну там, на самом деле, все весьма печально — на 2 Гб DDR3 и 2.8 ГГц дуалкоре расчёт хода неписей длится от минуты до пяти, в зависимости от размера карты.
            • 0
              Подобная болячка была и в civ3, кто-то даже бенчмарк на основании civ3 делал :) основные тормоза происходили при захвате городов, даже на собственных ходах. Скорее всего из-за пересчёта границ государств и пересчёта «торгового графа» — у каких городов с какими есть связь, по всем городам на карте.
              • 0
                Насколько я заметил, тормоза тем сильнее, чем больше паппет-городов у неписей под контролем. С ними весьма сложное дерево отношений есть, и оно просчитывается как для отдельного игрока, насколько я понял, копаясь в скриптах.
                • 0
                  Судя по тому что проблема не у всех и иногда оно даже вылетает, скорее всего имеют место обе болячки. С пересчётом городов без сорса вряд ли что-то получится сделать, если только там всю логику в скрипты не вынесли — тогда есть надежда. По графике — есть гипотеза, что страдают в первую очередь люди со встроенными видеокартами, т.к. они шарят видеопамять с основной. Либо упирается в 2Gb лимит для 32-битного адресного пространства, это и у второго старкрафта происходило на последних миссиях кампании — у меня иногда текстуры становились белыми.
                  • +1
                    Логика в Lua, кое-какая ерунда в XML. Местами есть внезапно SQL, который, как я понял, применяется как конфиг. Скрипты все, что есть, весьма неплохо прокомментированы.
        • 0
          Небольшой оффтоп:
          Тоже купил коллекционную бокс версию со всякими прибамбасами (книжкой красивой, деревом технологий и др.). И стоила она всего 800 р. за что большое им спасибо, или нашему издателю :)
  • +3
    Вот это называется хакер! Очень круто!
  • +1
    Вам предложили работу?
    • +7
      За те 2.5 часа что топик висит на главной — пока что нет… хотя с работой у меня проблем тоже нет :) Дабы утолить любопытство всех, кто интересуется вопросом влияния хабратопика на карьерную карму — я оповещу, когда/если подобные предложения поступят. Без паролей и явок естественно :) просто по факту да/нет.
      • 0
        да, вам там обещали боченок черной крушовицы в обмен на бутылку жигулевского, если не завалят предложениями
  • 0
    Ну вы даёте! Должно быть геймдевелоперские фирмы уже хотят вас к себе в штат :)
  • НЛО прилетело и опубликовало эту надпись здесь
    • +7
      По DirectX'у хватило MSDN'а, от корки до корки. По ASM'у — я уже и не помню… был лет 17 назад талмуд Джордейна еще на 8086 со 128kb памяти :) ПК «Ассистент» производства Смоленск, потом еще был киевский «Поиск» с 640Kb, которых на всё хватало :)
      По C/C++ точно не помню, разные были книги, очень хорошо подтянулся на ixbt'овском форуме программирования. По математике и алгоритмам — универ и ACM'овские олимпиады. Ну и сильно в своё время зацепила книга Майкла Абраша «Zen of Graphics Programming», который с Джоном Кармаком делал растеризатор для первого Quake. Хотя из неё в данном топике, да и вообще в современном мире с графическими ускорителями уже мало что применимо.
      • +1
        Какой универ?
        • 0
          Петрозаводский Государственный
          • +1
            Вот! А говорят, что в «глубинке» образования нет!

            Уроды! Выкусите!
            • +1
              Большая часть это всё таки само-образование думаю везде
              • +4
                В нашей айтишной сфере — да.
              • +2
                Что блестяще подтверждает фразу «кто хочет — ищет возможности, кто не хочет — оправдания».
                • –1
                  +
      • НЛО прилетело и опубликовало эту надпись здесь
  • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      Желание есть конечно :) нужен пример, когда детальность картинки явно не соответствует заявленным требованиям. Как если бы сапёр хотел кушать пол-гига. И есть еще желание апгрейднуть World of Warcraft по качеству картинки, добавив bump-mapping (шейдерные блики), а то вроде уже 2010й год заканчивается… а движок до сих пор без единого гвоздя, ак Unrel Tournament 2004 рядом с Far Cry. Как оно в Cataclysm сделано своими глазами еще не видел, но судя по скринам — воз и ныне там.
      • +1
        WoW я думаю будет всеми возможными способами детектить установку хуков и отказываться работать.
        • 0
          Есть такая опасность.
          • +1
            Если возьмётесь таки, логиньтесь триальным аккаунтом на всякий случай ;)
          • 0
            Он не будет отказываться работать. Просто как только ГМом будет обнаружено то, что бинарная часть клиента модифицирована — аккаунт будет моментально заблокирован без права на апелляцию. Плавали, знаем — приходилось делать такие гадости для того, чтоб просочиться в локацию Emerald Dream, которая в продакш так и не ушла.
      • +1
        посмотрите на любую Canvas-игрушку. Может выпустите патч для браузера?
        • 0
          В своё время таким патчем оказался Flash от Macromedia. Правда зря они ударились в кривые с антиалиасингом по умолчанию, основная причина тормозов во flash именно в этом.
      • 0
        Call of Duty: Black Ops на PC, например! графика не ахти, зато лагает игрушка будь здоров. разработчики до сих пор не пофиксили толком. правда, особенно там экзешник не модифицируешь — Valve Anti-Cheat сработает
        • 0
          В civ4 exe'шник не трогался. Была сделана прослойка между civ4 и DirectX вроде самопального compatibility mode.
  • +8
    Самое классное доказательство того, что исходники хакеру нафиг не сдались! Молодец!
    • 0
      Я бы не опошлял умение программировать и мыслить этим немного узковатым шаблоном. ;)
  • 0
    Аплодирую стоя! Триллер года!

    Почему разработчики не написали Harkonnen'у и не пригласили поучаствовать в разработке официального патча — загадка, ведь из возраста песочницы они, скорее всего, уже вышли.
    • +1
      Главный разработчик отписывал мне на civfanatics, просил перестать выпускать апдейты патча под новые версии уже после того как я его выложил для 1.07 и 1.08 (по-моему). Не думаю, что эта его просьба была связана исключительно с имиджевыми соображениями Firaxis, скорее всего они не хотели, чтобы мой патч мешал адекватной работе их собственных изменений, которые, судя по потреблению памяти версией 1.09, были достаточно радикальными.
  • +1
    В Civilization 5 таже проблема что и в 4, к концу игры даже на не слабом ПК начинает подвистаь при элементарном перемещении по карте.
    • 0
      Это радует. В том смысле, что тормозит не только во время хода противников, а и при обычном скролле. Это означает, что имеем дело не с civ3 болячкой (или не только с ней), но и с побеждённой однажды civ4 болячкой.
  • +3
    Уважаемый Harkonnen!

    В Civilization 5 та же самая проблема! Не знаю, откуда у нее растут ноги в этот раз, но начинается игра очень резво, а по мере открытия карты начинает невыносимо тормозить и вылетает/зависает через каждые несколько ходов.

    Данная проблема проявляется не у всех пользователей. По данным с форума издателя (2KGames), страдают 40—50% игроков. Но тем, кто страдает, не помогает ни мощный процессор, ни восемь гигов оперативки. :( Тормоза от уровня настроек графики никак не зависят, только от количества открытой территории.

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

    Вот, к примеру, моя ветка:
    forums.2kgames.com/showthread.php?100554

    Я уже три дня бьюсь над прохождением одной партии. Продвинуться удалось меньше, чем на сто ходов. :(

    Harkonnen, на вас вся надежда! О_О
    • +8
      понял, посмотрю
    • 0
      Что странно, но в Civilization 3 точно такая же проблема, игра непомерно жрала для двухмера и под конец игры тормозила жуть…
    • 0
      Вы — настоящий хакер :). Именно в изначальном значение это слова.
    • +1
      В режими долгой игры (маленькой скорости) вообще не возможно играть
  • +20
    До сих пор не появился «тот самый» комментарий?? Ну что ж, исправим сие недоразумение:

    Хабр — торт!!!

    Автору — нереальный респект как за настойчивость, так и за техническое исполнение.
  • +1
    Снимаю шляпу!
  • +1
    Настоящий геймер!) На что только не пойдешь ради любимой игры
    • +1
      > «На что только не пойдешь ради любимой игры»
      Во-во :)
  • 0
    эх, смахнул слезу)
  • +3
    Уважаемый, попилите пожайлуста Civilisation 5 — они и там похоже от детских болезней не избавились. Но теперь они тормозят 4х ядерный i5 c 8Гб ОЗУ… )))
    • +14
      всё-всё, уговорили :) уже кач... бегу в магазин.
      • +1
        *радностно потирает руки* Успехов! )
      • 0
        при выпуске патча можете указать адрес, куда присылать новогодние подарки ))
        • +2
          Для начала бы сам патч сделать :) далеко не факт что в civ5 всё так же хорошо сложится. В любом случае, уже в процессе.
          • +2
            Получится, хорошо, не получится, все-равно с удовольствие почитаем вести с фронта )
    • 0
      Сам не играю — друг жаловался. Припёр ко мне диск, ставим, грузим сэйв. Включаю режим разгона. Да, проц не верх новизны, q9550, штатная 2.86, 12 метров кеша l2. Открываю профили разгона, выставляю параметры для 4.4 ггц. Больше 20-25 минут даже с моим кулером (CoolerMaster V10) он не тянет, не самый удачный экземпляр. Да и память капризная.

      Уж не знаю, такие вычислительные мощности и настолько загружать… кхм. Такое ощуещение, что оно параллельно сворачиваемость белков просчитывало, ну или еще чего.

      Как итог — и вправду, никакие мощности не помогают от лагов цивилки 5ой.
      • 0
        Игра после входа в индустриальную эру ооооочень располагает к медитации и самосозерцанию… ))
        • 0
          Так а куда торопиться? Сидим, кушаем печеньку, слушаем хорошую музыку, радуемся жизни :3
          • 0
            Я не йог и столько медитировать не могу ) Также, в это время, динамика игры напротив раз повышается — обслуживание территории уже не требует столь пристального внимания и все стороны так или иначе начинают конфликтовать.
            • 0
              Ну вот примерно поэтому я отыграл до 1900-х и забросил партию. Уже второй месяц не могу закончить, тупо напрягает.
  • 0
    Конечно, вызывает при прочтении чувства вида «Автор — растакой! Автор — рассякой!!! Круче только горы!» :)

    Однако, дочитал не отрываясь, обнаружил, что рот открыт, закрыл, задумался, поставил заслуженный плюс.
    Уважение к подобным вещам все-же испытываешь.
  • +3
    Интересно, какой гад минус влепил?
    • +1
      Мог и промахнуться, бывает…
  • 0
    Статья, так статья. Здорово, слов нету.
  • 0
    Это восхитительно. Вы молодец :)
  • 0
    Думал что читаю статью Криса Касперски. Обалдеть…
  • +9
    помоему это рождение новой легенды на хабре :)
    из песочницы за 6 часов 150 кармы и 320 плюсов статье!

    автору вагон респекта, потерял понимание материала на вершинных буферах, дальше читал как детектив!
    • +8
      Хотелось выдержать баланс между размером, детальностью и «детективностью» :) если коротко на понятном — рисовалка кухни создавала в памяти каждую тарелку вместо того чтобы рисовать одну и ту же тарелку много раз. На то были, конечно, свои причины… но не достаточно веские, раз эту проблему удалось обрулить без исходника.
      • 0
        Еще проще: вместо того, чтобы делать каждый раз новое, сделаны все возможные «по одной штуке», а потом, по мере надобности, копировались.
  • 0
    Дайте два для StarCraft2!
  • 0
    типичный пример в чем разница между словами труд и работа, то есть между работой на себя ради удовольствия и работой на кого-то ради денег. Вы ожидали не сколько результата, сколько получали удовольствие от процесса. А теперь еще и куча комплиментов и слава — но это уже побочный эффект.

    Автор, как хоть называются такие профессии, что вы делали? С++программист?
    • 0
      Из классических категорий ближе всего будут «системное программирование», «оптимизация алгоритмов» и «проектирование».
  • 0
    <offtopic>
    Автор, почините пожалуйста 100% потребление процессора в Master of Orion 2 :) Невозможно играть на лаптопе, всю батарею сжирает :)
    </offtopic>

    Статья — супер, был бы инвайт — дал бы не задумываясь.
    • 0
      Спасибо :) инвайт был получен от tangro
    • 0
      По поводу MOO2 — уважаю космическую тематику :) Сам залипал что на MOO2, что на Ascendancy. Проблема в том, что MOO2 досовский, как там сделан Win95 вариант точно не знаю. Думаю у него цикл переопроса пашет с такой скоростью с какой может процессор. В качестве полумеры может помочь DosBox с DOS'овской версией MOO2 и заниженными тактами процессора. Главное чтобы музыка не лагала.

      P.S: Сам пытаюсь с Amnesty Design (ныне Digital Reality) исходники Reunion выцыганить (предшественник Imperium Galactica I,II, Haegemonia). Есть у меня фетиш раз в год Reunion проходить, но его глюки — это п… ц какой-то. Уже и на мыло им писал, и в офис звонил, и на социалках разработчиков искал — всё без толку. Хоть в Будапешт за сорсом едь :)
      • 0
        ДосБокс и есть, на современных виндах (виста и семёрка) особо нативно не поиграешь…
        • 0
          Ок. Тогда варианта два:
          1. [del]Попинать шины[/del] попробовать режимы совместимости с Win95 версией MOO2 (была такая).
          2. Когда первый вариант не поможет, снизить количество тактов процессора в DosBox'е на DOS версии MOO2, пока заргузка процессора не упадёт до 5-10% (через CTRL-F11 в DosBox). Оценить играбельность при таком способе.
      • +1
        Ооо, Reunion любимая игра тех времён, но багов там действительно немеряно.
  • +3
    Пост в топ-20 популярных за всё время!
  • 0
    Отличный дебют на Хабре!
  • 0
    да! Если чел талант, то талантлив во всем.
    Автор — пиши роман про хакеров — будешь современным Львом Толстым)
  • 0
    Отличный пост!
    Правда я Цив забросил после второй версии, как-то в герои меча и магии ударился.
  • 0
    респект! наконец-то узнал причину тормозов по alt-tab.
    а старик второй препаририуйте, пожалуйста, мне тоже не понятно ЧТО там может жрать столько памяти.
  • +1
    Снимаю шляпу, увлекательнейшее чтиво, лучший пост хабра за последнюю пару месяцев
  • +2
    В далеких 90=х я на подобии такого какой-то телеметрию пытался взломать. Идет с датчиков сигнал и фиг его поймет какой… Ужасные воспоминания… В данном посте меня больше всего поражает как выяснить что за данные в структурах. Ну выделил ты кусок памяти который что-то там зажевал. И что это? Ну допустим понятно что что-то графическое. Но как понять что?! Текстура, геометрия, где Х, где Y? сколько значащих цифр и где размерность??? В общем у меня любопытства до такого уровня копать не хвалатоло… Автору респект! Теперь я верю, что компьютерные игры это не только утилизация времени и отупление подрастающего поколения!
    • +2
      В civ4, к счастью, угадывать байты не пришлось. В DirectX всё стандартизировано, а для координат вершин тот самый FVF из статьи (flexible vertex format) и определяет размерности и что к чему. По поводу игр — они мне дали как минимум отличный уровень английского. Но, разумеется, зависал не из-за этого :)
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    Совершенно нормальная ситуация для геймдева, как по мне — сталкивался на практике с написанием и даже использованием подобного кода. Сейчас гиг памяти стоит гораздо дешевле часа времени хорошего программиста, потому так все.
    • 0
      Есть так же ноутбуки, в которые память не довставить или тяжело/влом искать нужную планку. К тому же игры не под один комп пишут, если умножить стоимость планки на кол-во компов, которым она нужна для запуска цивки, там не один программеро-год получится.
  • 0
    очень круто! прочитал с огромным удовольствием. Civ5 видимо имеет похожие проблемы, т.к. начинает заметно притормаживать на поздних стадиях игры.
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    А я вот только через 5 лет до civ5 добрался (купил на стиме BNW) чего-то через столько лет после civ3 вдруг пробила ностальгия. Так даже со всеми патчами на ноуте с 4Gb по мере открытия карты оно дико тупит. И некому полечить…
  • 0
    Классный трюк с умножением на 5! Люблю в разумных пределах оптимизировать код, но до такого бы никогда не додумался.

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