Archive for December 2007

one-liner

Trunk me tender, trunk me sweet, never let me branch.

Немного о прекрасном

А еще в MS бывают девушки-программисты, на удивление вменяемые. Я вот все искал умных и классных девочек-программистов в Новосибирске, нифига не находил и стал отчаиваться и сомневаться в существовании. Утешьте меня, я же плохо искал?

А тут они бывают. У меня вот есть клевая тиммейтша, Andi Fein. Фотко инсайд!
Continue reading ‘Немного о прекрасном’ »

Кровавое месиво в памяти (часть 2)

Монитор понемногу расширяется, хотя для мониторинга произвольных приложений надо решить еще несколько проблемных вопросов с перехватом вызовов в системные dll. Впрочем, при наличии перехваченных malloc/new создание файла монитора является простым, приятным и дает сильно больше информации, чем трассировка системных адресов.
Continue reading ‘Кровавое месиво в памяти (часть 2)’ »

Component-oriented design на консолях, лобзиком по шаблонам

Сегодня в нашей постоянной рубрике “классические отжыги на конале” будут Борины сказки про компонентные системы, 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 текстура, могли бы не заметить до сих пор.

Мораль? Надо быть аккуратнее с мусорными текстурами!!!

Кровавое месиво в памяти (часть 1)

Несколько недель назад я уже писал про исследование оперативной памяти. На этих выходных набросал небольшое приложение для того, чтобы промониторить результаты более подробно. Результаты, в общем-то, ожидаемые, но все равно, картинка перемещения блоков завораживает точно также, как и в свое время магическая работа встроенного дефрагментатора жестких дисков под Windows 98 :)

Continue reading ‘Кровавое месиво в памяти (часть 1)’ »

Восход солнца вручную.

Проект libps3rsx цветет и пахнет. Аккуратно прикручиваю ништяки. Радуюсь разному. Под катом – отчет о проделанной работе. 

Continue reading ‘Восход солнца вручную.’ »

Цена абстракции-3 (или все, что мама не рассказывала про C++)

Сразу обнадежу 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 секунд.

Скорость работы конечного кода сравнивать страшно. Да и опять некогда, в общем-то, тк. жизненно необходимо срочно изгрызть подушку.