Archive for the ‘problems’ Category.

это очень интересно, что там спрятано внутри

Это страшное слово 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 минут до сбоя.’ »

Рецепты отладки. Позор для математика.

Эта история не является большим секретом, я её озвучивал в своё время на канале #ff и на GDP, но за истечением срока давности (10 лет) за сделанное мною математическое преступление хочется покаяться перед всем читающим меня сообществом и раскрыть страшную правду об одном алгоритме. Речь сегодня пойдет о вещественной арифметике в самом худшем её проявлении – двоичном.
Continue reading ‘Рецепты отладки. Позор для математика.’ »

Рецепты отладки. Зависший 3D редактор.

Несмотря на то, что правильные пацаны советуют очень правильный тулсет, а другие правильные пацаны смотрят на это крайне позитивно, я продолжаю трахаться с разными неприкольными ситуациями, которые вряд ли отловит PREfast. Поэтому пользуясь случаем, отвлекусь от избитой темы ошибок в памяти и переключусь на ошибки другого рода – это нарушения последовательности вызова функций внешнего middleware. Уважающие себя пакеты предпочитают проверять состояние объекта или модуля перед вызовом функций и информировать програмистов о нарушениях логики. Неуважающие себя пакеты такими мелочами не занимаются, в крайнем случае пишут в документации что-то типа “никакие функции библиотеки не могут быть вызваны до вызова xxx() или после вызова yyy()).

Исходные данные: имеется мощный пакет моделирования под названием XSI (который кстати теперь тоже аутодесковский). Имеется плагин к нему. При выгрузке плагина XSI зависает вусмерть (а плагин загружается и выгружается довольно регулярно – на каждый “чих”).

Continue reading ‘Рецепты отладки. Зависший 3D редактор.’ »

И снова задачки

А задачек поднакопилось. Не будем писать, с чьих собеседований, будем просто радоваться. Задачки хорошие, такие, по мне, можно смело спрашивать.
Сегодня у меня аж целых три, признайтесь, вы их ждали!

Continue reading ‘И снова задачки’ »