one-liner
Trunk me tender, trunk me sweet, never let me branch.
the place where select game development veterans rant about life, universe, and everything
Archive for December 2007
Trunk me tender, trunk me sweet, never let me branch.
А еще в MS бывают девушки-программисты, на удивление вменяемые. Я вот все искал умных и классных девочек-программистов в Новосибирске, нифига не находил и стал отчаиваться и сомневаться в существовании. Утешьте меня, я же плохо искал?
А тут они бывают. У меня вот есть клевая тиммейтша, Andi Fein. Фотко инсайд!
Continue reading ‘Немного о прекрасном’ »
Монитор понемногу расширяется, хотя для мониторинга произвольных приложений надо решить еще несколько проблемных вопросов с перехватом вызовов в системные dll. Впрочем, при наличии перехваченных malloc/new создание файла монитора является простым, приятным и дает сильно больше информации, чем трассировка системных адресов.
Continue reading ‘Кровавое месиво в памяти (часть 2)’ »
Сегодня в нашей постоянной рубрике “классические отжыги на конале” будут Борины сказки про компонентные системы, console-style. Сказки долгие и хорошие, как раз на ночь.
Отжыг давний, еще с 2005-го года.
Continue reading ‘Component-oriented design на консолях, лобзиком по шаблонам’ »
Бывают решения правильные, а бывают верные. Местами они совпадают; местами нет. Надысь случился настолько наглядный пример несовпадения, что я не могу им не поделиться.
В порядке борьбы с FPS три месяца назад прикрутил к игре простенький shader LOD (Level-of-Detail). Он убирает параллакс в самом “тяжелом” шейдере, и только. Тупо щелчком; тупо по дальности. Все остальные опробованные упрощения слишком сильно ломали картинку в отдельных местах; а надо было, как всегда, срочно. Но свои несколько важных миллисекунд этот LOD дал и так.
“Правильным” решением было бы вывести настройки дальности для каждого объекта отдельно, подобрать более-менее годные дефолтные настройки, и тщательно проинструктировать художников. Затем они по мере обнаружения тех мест, где переключение LOD заметно на глаз, подправляли бы дальность переключения – где-то поднимали, где-то снижали…
В теории. На практике, как известно, художник думает в первую очередь исключительно о качестве картинки – как ты ни бей его палкой про FPS. Где есть настройки дальности, там через неделю будет порог переключения LOD-а для параллакса на дистанции в 500 метров для бочки высотой 0.5 метра, потому что иначе в разрешении 1920×1080 блик съезжает на целый экранный пиксель!!!
Поэтому было принято “верное” решение – никаких настроек не давать, и… (барабанная дробь) художникам ничего не говорить.
Ровно через три месяца один из художников наконец-то случайно заметил, что параллакс местами отключается. Подчеркиваю, случайно – если бы не мусорная bump+height текстура, могли бы не заметить до сих пор.
Мораль? Надо быть аккуратнее с мусорными текстурами!!!
Несколько недель назад я уже писал про исследование оперативной памяти. На этих выходных набросал небольшое приложение для того, чтобы промониторить результаты более подробно. Результаты, в общем-то, ожидаемые, но все равно, картинка перемещения блоков завораживает точно также, как и в свое время магическая работа встроенного дефрагментатора жестких дисков под Windows 98 :)
Проект libps3rsx цветет и пахнет. Аккуратно прикручиваю ништяки. Радуюсь разному. Под катом – отчет о проделанной работе.
Сразу обнадежу MS андроидов, сегодня bashing-у подвергнется gcc. Я ж ничуть не расист, ненавижу всех взаправду одинаково.
Итак, вводная: делаем выборку top-N объектов из M по заданному критерию. Нужна приоритетная очередь с разными видами тех самых критериев (иногда сортируем по одному полю, иногда по другому, когда и по выражению). Как должен реализовывать критерии сортировки грамотный студент? Как мама учила, параметризующим шаблон функциональным объектом, с целью заинлайнить функцию сравнения.
Усложняем вводную: очередь не просто сортирует объекты, а еще и группирует их. Критериев становится два, для сортировки групп на выходе и для сортировки объектов внутри групп. Как должен реализовывать? Ну, понятно.
Маленькое лирическое отступление для тех, кому небезразличен SQL. Первая очередь – это действительно реализация ORDER BY … LIMIT N; вторая – соотв-но GROUP BY … ORDER BY … CHOOSE BEST IN GROUP BY …; с небольшим милым расширением про CHOOSE BEST.
В итоге рождается шаблон с двумя параметрами, и где-то так около 256 разных инстансов. Код про инстанциирование, кстати, заслуживает отдельной небольшой заметки. Много, ну да пусть с ним. Компилируется все еще за приемлемое время (десятки секунд), и теория гласит, что есть надежда на небольшой performance boost. Мерить boost при этом лень и некогда.
Потом в один прекрасный день пользователь сообщает: все отлично, но на моем VPS с 256 метрами памяти оно компилировалось 3 часа.
Небольшое расследование по мотивам немедленно выявляет прекрасное: на компиляцию 40K исходника с теми шаблонами gcc (под Linux) отжирает… 500 MB памяти и 80 секунд. MSVC при этом тратит 20 секунд, и 30 MB памяти в прыжке.
Поскольку так дальше жить можно, но не хочется, предпринимаются меры. После внимательного перечитывания кода оказывается, что один из вызовов в принципе не терминально частый, и пусть его будет виртуальный. Число инстансов резко снижается, gcc теперь начинает отжирать “всего” 200 MB памяти и 8 секунд. MSVC укладывается в 2 секунды, высота прыжка снижается до 10 MB.
На весь проект gcc после правок требует до 350 MB (уже на другой файл) и суммарно 40 секунд. MSVC в пике потребляет 20 MB памяти и справляется за 12 секунд.
Скорость работы конечного кода сравнивать страшно. Да и опять некогда, в общем-то, тк. жизненно необходимо срочно изгрызть подушку.