Archive for the ‘tips-n-tricks’ Category.

Publish: Про спеки iPad

Одна из самых важных повседневных функций Кружочков – практические вопросы. Чат – очень быстрый и интерактивный медиум, прямо чувствуешь доступ к коллективному разуму.

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

Continue reading ‘Publish: Про спеки iPad’ »

Коэффициент пидорастичности файла.

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

напр. если файл в 800 байт сжимается до 400, то его коэффициент равен 800/(400/800) = 1600

Скрипт для нахождения самых пидорских текстур (напр. одноцветного голубого неба 2048×2048 в RGBA формате):
Continue reading ‘Коэффициент пидорастичности файла.’ »

Best tools no one uses: DOT (овалы со стрелками)

Иногда при копании в текстовых файлах, в которых хранится дерево зависимостей или граф, хочется получить наглядное представление этого файла.  Это могут быть зависимости между данными или промежуточное состояние программы при отладке сложного алгоритма на графе/дереве.
Есть простой инструмент, DOT language, который по текстовому файлу сгенерирует рисунок.
Например, по описанию

digraph graphname {
  a -> b -> c;
  b -> d;
}

будет построен рисунок:

Continue reading ‘Best tools no one uses: DOT (овалы со стрелками)’ »

Это страшное слово setlocale

История эта случилась достаточно давно, но до сих пор она продолжает преследовать меня страшными кошмарами, связанными в основном с локализациями наших замечательных игр. Об этих проблемах многие даже и не задумываются, а, тем не менее, они могут серьезно подорвать вашу уверенность в светлом будущем.
Continue reading ‘Это страшное слово setlocale’ »

Про Unit тесты вообще и TDD в частности

Я уже говорил ранее – я не отношу себя к поклонникам test driven development (TDD), но в то же время считаю, что Unit tests – это вещь, которая архиважна практически для любой разработки.

Любовь к написанию юнит тестов начала формироваться уже давно. Еще в тот день, когда я бегал по стенам Creat Studio, топал ногами и кричал, почему для того, чтобы проверить, что функция подсчета выпуклой оболочки множества точек (не та, про которую я писал ранее, а другая) снова дала сбой, надо проводить 20-минутный полный цикл экспорта от редактора до игры и по визуальным артефактам во время игры убеждаться, что снова что-то пошло не так.

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

Потом любовь стала взаимной, когда я начал делать нагрузочные тесты на собственную подсистему аллокации мелких блоков. Я ставил рандомайзнутый тест на ночной прогон, с утра приходил на работу и смотрел, смогла ли система выдержать испытание в виду нескольких миллиардов тестовых аллокаций/деаллокаций. Иногда с утра система висела в ассертах. Иногда – в access violation. Именно тогда специфика юнит тестирования начала оформляться в какие-то взаимные прочные и долговременные отношения.

Continue reading ‘Про Unit тесты вообще и TDD в частности’ »

Сказ про то, как American Chopper сам восстановился

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

В Крейтовском коде еще с прошлого века существовал блок функций SetIdle()/ClearIdle()/IsIdle(). Эти функции предназначены для работы с режимом паузы. SetIdle() увеличивает счетчик паузы, ClearIdle() – уменьшает. Если счетсик равен 0, игра находится в рабочем состоянии. Если > 0, игра находится в режиме паузы. Внутриигровое меню, например, на конструкторе ставит режим паузы, на деструкторе ее снимает. Железобетонно? Вроде как да.

Continue reading ‘Сказ про то, как American Chopper сам восстановился’ »

Чем должна и не должна заниматься игра на старте?

Спасибо огромное всем, кто проголосовал в опросе (увы, пока движок блога не позволяет размещать опросы здесь, приходится их делать у себя в ЖЖ).

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

Я озвучу свою собственную точку зрения на вопрос “требуется ли такая диагностика в игре и если да, то каким образом ее делать”. Кстати судя по ответам, по состоянию на 11:47 24 апреля я должен растаться с 29 литрами пива (именно столько людей проголосовало за пункт 1). Впрочем, пиво почти наверняка останется при мне, потому что я готов привести конфигурации компьютеров и настроек, на которых ваша версия GetTotalVideomem() даст неправильный ответ.

А раз вы не можете быть уверены в результате, то что же делать?

Continue reading ‘Чем должна и не должна заниматься игра на старте?’ »

Теория ошибок. Нестабильности первого рода.

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

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

Continue reading ‘Теория ошибок. Нестабильности первого рода.’ »

Рецепты отладки. 40 минут до сбоя.

Эта история тоже довольно старая, произошла она во времена первой крейтовской разработки, и произошла на совершенно ровном месте. Мы делали отличную игру за инопланетянина, который мог вселяться в одного из четырех персонажей (паук, прыгун, летун, и большая обезьяна с присосками), камера от третьих глаз, большие природные пространства, 100% алгоритмичность прохождения, ну и, разумеется, полное отсутствие геймплея как такового. К слову сказать, ситуация была настолько типовой для нашего “савеццкаго геймдева”, что уже сильно позднее, работая в 1С, я “для себя” классифицировал множество наших разработчиков как например “Крейт образца 1998 года” или “Крейт образца 2001 года”. Впрочем, суть не в этом, а в баге, который был внедрен в систему за несколько месяцев до проявления.

Continue reading ‘Рецепты отладки. 40 минут до сбоя.’ »

Рецепты отладки. 3 типа нестабильностей.

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

Но для начала – ещё одно лирическое отступление на несколько страниц.

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

Все возникающие в программе нестабильности можно разделить на 3 главных типа. Это:

  1. Нестабильности по входным данным.
  2. Нестабильности по внешним вызовам.
  3. Внутренние нестабильности модуля.

Рассмотрим подробнее.

Continue reading ‘Рецепты отладки. 3 типа нестабильностей.’ »