среда, мая 27, 2009

понедельник, мая 25, 2009

Статья 18 Embarrassing Game AI Bugs Caught On Tape...

В статье 18 Embarrassing Game AI Bugs Caught On Tape... Алекс разобрал несколько AI багов, выложенных на YouTube, и высказал предложения по тому как их фиксить. На мой взгляд фиксить баги по записи на YouTube - это все равно что лечить по фотографии, но, тем не менее, статья очень хорошая. Там в комментариях отметился разработчик, который за некоторые из этих багов ответственнен, интересно почитать.

Баги, в которых юниты идут в стену или ходят кругами выглядят скучно. Вот самые на мой взгляд интересные баги (по ссылке больше и подробнее :-) ).

Crysis, 2007
NPC исследует упавшую бочку, не обращая внимания на то, что она горит и вот-вот взорвется. Бочка в итоге взрывается, NPC погибает.


Crysis, 2007
Два NPC беседуют, игрок стреляет в одного из них усыпляющей пулей, один из NPC засыпает. Второй NPC продолжает беседу.




Grand Theft Auto San Andreas, 2004
Полицейские бросаются в воду, забыв что они не умеют плавать.


Ссылки по теме:
Avoiding Ten Common Game AI Mistakes

вторник, мая 19, 2009

Задачка про зеркало

Задачка, которая способна занять отдел программистов как минимум на час.

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

Небольшое замечание - первая мысль, что это из-за расположения глаз на голове. В таком случае предлагается повернуть голову набок и посмотреть в зеркало. :-)

Updated 19.05.2009:
Документ с подробным ответом здесь. Цитата оттуда "Надо снабдить зеркального двой­ника не нашей собственной координатной системой, а систе­мой координат, отраженной в зеркале".

воскресенье, мая 17, 2009

КРИ-2009. День третий

Сегодня был последний день КРИ, я была на двух докладах.

Роман Лут, Deep Shadows
Внедрение многопоточного рендеринга в игровой движок

Полезный вдумчивый доклад. Начался с общих рассуждений о многопоточности. Что вот, бывает "плохая" многопоточность, это когда создаем несколько потоков и делаем в них что-нибудь. Так лучше не делать, лучше анализировать код и разделять его на независимые компоненты с минимальным, четко описанным взаимодействием. Говорил про task parallel, data parallel и построение task dependency graph'а.
Что сделали у себя. Хотели task dependency graph, но было понятно, что это займет сильно много времени поэтому сделали вот что: обход сцены в одном поток, они пишет все в ring buffer, откуда читает код рендеринга, который находится в другом потоке. Заняло это 2 недели разработки и 3 месяца отладки. Получили увеличение производительности в 1.5 раза.
По ходу рассказа хвалил Intel TBB. Они даже портировали TBB под XBOX. Рассказывал, что пользовались Intel Thread Checker'ом. Все это вызвало оживление в стане Интела :-).
Упомянул emergent DirectX command buffer library, которая позволяет распараллелить работу с DirectX версии ниже одиннадцатой, который, как известно, не поддерживает работу с многопоточностью.

Евгений Макаров, NVIDIA
NVIDIA APEX - широкий взгляд на технологии PhysX

Доклад был в разделе арт, пошла на него, потому что его рекомендовали на лекции по CUDA. Но был действительно в основном арт, много красивых картинок, по программингу практически ничего. Для себя узнала, что все это есть и под Nintendo Wii.


Давайте в заключение скажу пару слов об организации КРИ. Организовано все было хорошо. Мест всем хватало, возникавшие на докладах проблемы с слайдами разрешались быстро (и было их мало, надо признать). Не тесно, не душно, чего еще надо...

Updated 18.05.2009: В комментариях поправляют, мест хватало не всегда.

Итог дня: Есть TBB под XBOX, есть PhysX под Wii

КРИ-2009. День второй

Доклады, на которых я побывала сегодня.

Константин Колчин, NVidia
Краткий обзор Direct3D 11

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

Александр Харламов, NVIDIA
GPU computing или параллельные вычисления в играх

Сначала долго рассказывал, что такое CUDA и как она работает. По-моему, это было невозможно усвоить, не зная ничего про CUDA до этого. Очень уж запутанная и неочевидная штука. Я знала, поэтому более-менее следила за ходом доклада. В самом конце Александр предложил на CUDA обсчитывать системы частиц в играх. Его спрашивали, чего еще там можно хорошо посчитать - он предложил посетить доклад по PhysX. Он будет завтра, я туда схожу.
Про архитектуру CUDA информации полно, это не очень интересно. Чего было, о чем я раньше не знала - CUDA работает на том же устройстве, что и OpenGL/Direct3D. Поэтому, когда используешь CUDA одновременно с ними, надо как можно реже переключаться между CUDA и графическим API.
На основе CUDA строятся новые API - DirectX Compute и OpenCL, но, как я поняла из дальнейшего обсуждения, они находятся в зачаточном состоянии.

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

Тут настало время обеда, поэтому о еде на КРИ. Еда не входит в те 6000 рублей, что я заплатила, ее можно было купить отдельно, я пожадничала, да и поздно было уже. Поэтому я питаюсь в окрестностях, и я такая не одна. Во время обеда к ларькам с хотдогами стоят очереди. В местном Макдональдсе тоже очень много участников КРИ :-). Поела в каком-то итальянском ресторанчике рядом с Макдональдсом, там тоже был народ с КРИшными бэджиками.

Владимир Ческис, Nival Online
Тюнинг красивого боя в MMORPG

Владимир показывал записанные анимационные ролики из Аллодов Онлайн, рассказывал где чего было не так как правили. Тут важно, чтобы анимации атаки одного персонажа и защиты другого работали синхронно, чтобы не было такого, что один еще не ударил, а второй уже заблокировал удар. Но перессказывать это бессмысленно, смотреть надо.
Было много вопросов, особенно народ заинтересовался роликом с некромантом, он там красиво так летучих мышей на жертву направлял. Вопрошающие пытались выяснить, возможна ли ситуация, когда мыши жертву не настигнут. Ответ - нет, не возможна.
Это был самый зрелищный доклад из тех, что я видела. Однако при этом создавалось впечатление, что докладчика читать доклад заставили силой и он этому явно не рад. Говорил тихо, часто вздыхал. Доклад осилили не все.


Да, WiFi на КРИ таки есть. В районе Кракена-Нивала-далее везде, wifi есть в комнате аструма. Но сама я не проверяла.

Вчера не было фоток, сегодня будет много.

Nova Online, самый красивый стенд:



Акелла, Left4Dead стерео. Я поиграла, прикольно. Нужны специальные очки и монитор с разверткой не меньше 120Гц.


Стенд Сталкера


Ярмарка проектов


Еще стенды




А Микрософт просто поставили два XBox'а. Народу - не протолкнешься.


Фотография специально для Джима


Итог дня: NVidia хорошо подготовлена, мыши некроманта неизбежны.

пятница, мая 15, 2009

КРИ-2009. День первый.

Как и обещала, буду рассказывать о конференции разрабочиков игр, которая проходит в Москве прямо сейчас. В прошлый раз я была на КРИ в далеком 2005 и буду сравнивать с ним, больше мне сравнивать не с чем.

Стендов очень мало. Народу тоже сильно меньше, чем в 2005. WiFi'я нет. Вернее есть, но какой-то Comstar за деньги, это не интересно.

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

После посещения КРИ вы твердо усвоите одну вещь - Аструм нанимает.

Об этом висят плакаты у входа, рекламные листовки кидают в пакет участников. Объявления висят даже на дверях туалета. HRы Аструма сидят в отдельном зале (!). Меня этот факт несколько удивил. Обычно на конференциях запрещают хантить народ, потому что тогда компании отказываются присылать туда своих сотрудников. На HighLoad2007 очень по этому поводу наезжали на Яндекс, даже заставили убрать один слайд.

Собственно доклады, на которых я была сегодня.
Илья Пшеничный, Creat Studios
Разговоры про жизнь


Илья попробовал активно в доклад вовлечь зал. Программеры из зала реагировали вяло, доклад тянулся медленно. Но зато доклад отличался от других, потому Илье бонус за смелость. Что запомнилось из полезного - рассказал, что FMOD+многопоточность - это тяжело, что просто так Хавок для физики машинки прикрутить не удастся, надо будет много тюнить...

Александр Лазарев, Intel
Многопоточный интеллект - это победа! Построение N-поточной масштабируемой оболочки.


На синтетическом примере показывал, что код AI можно распараллелить. Меня по этому поводу обеспокоил один вопрос - как это все отлаживать. Александр посоветовал Intel Thread checker и добавил, что да, проблем прибудет, потому решение параллелить AI должно быть очень оправдано.

Задача Интела понятна - им надо железо и тулзы продавать. И железо, и тулзы у Интела традиционно хорошие. (Intel vTune - супервещь). Но распараллеливая AI вы открываете ящик Пандорры. И оттуда такое полезет - мало не покажется. И отлаживать код придется вам, а не Интелу.

Арсений Капулкин (AKA Zeux), Creat Studios
SPU Render

Гвоздь программы. Большой подробный рассказ по делу, поэтому тут будет много.
Вообще обычно организаторы выкладывают записи выступлений на КРИ и это тот случай, когда доклад следует послушать целиком, а не довольствоваться перессказом. Мой перессказ - он для того, чтобы понять интересна вам вообще эта тема или нет.
Zeux сказал, что доклад большой, слайдов много и времени на вопросы не останется. И понеслась.
Если совсем кратко, то доклад о том, как в игре Smash Cars 2 под PS3 код рендеринга переносили с PPU на SPU.

Рендеринг, который работал на PPU, занимал 12 ms. Что было много и они решили перенести его на SPU.

Немножко информации про SPU, чтобы дальше было понятнее. SPU всего шесть штук. Речь идет о работе на одном из них. У SPU есть Local Storage (дальше LS) 256 Кб памяти под код и данные. Код не может работать с данным, которые лежат не в LS.
256 Кб - это не много, но у них код занимал максимум 80 Кб в дебаге, так что все влезало.
Доступ к внешней памяти через DMA.

Перенос кода происходил в три этапа.

Этап 1. Собрали прототип.
Цель - чтобы рендеринг заработал хоть как-то. Использовали пока синхронные DMA вызовы.
В силу особенностей архитектуры возникли проблемы с виртуальными фукнциями и инкапсуляцией. С тем, что vptr'ы не туда показывали, разобрались так: вообще отказались от виртуальных функций и использовали enum'ы.
Проблему с инкапсуляцией решили волшебной строкой

#define private public

Как происходит синхронизация PPU и SPU. У них PPU всегда ждет SPU. А SPU - достаточно быстрый.

Этап занял 3 дня. Время рендеринга 25 ms.

Этап 2. Оптимизация данных
Синхронные DMA вызовы, понятное дело, тормозили.
Начали они с того, что переуложили данные, чтобы их можно было загрузить все за один запрос. Сделали software cache. И сделали вызовы DMA асинхронными. В процессе работы время рендеринга уменьшилось сначала до 12ms, потом до 8ms. Сколько времени заняла работа не помню, по-моему тоже 3 дня.

Этап 3. Оптимизация кода.
Использовали SNTuner, SPUsim.
Этот кусок доклада похож на экскурсию в восьмидесятые. Использовали loop unrolling, branch flattering, ибо ветвления дорогие и они пытались уменьшить их число. Заменили switch по числам 0..N на function pointer table, получили ускорение в полтора раза.
Еще использовали branch hinting, который Zeux назвал шагом отчаяния и который принес десятипроцентный прирост производительности. Для branch hinting есть такой gcc-specific синтаксис, который говорит, что "вот этот if скорее всего не сработает".
Меняли работу с LS. Запись/чтение только по 16 байт.
Времени это у них заняло 5 дней. Время рендеринга стало 2 ms.


Итог дня: без WiFi'я плохо, Creat - молодцы.

вторник, мая 12, 2009

Собираюсь на КРИ

После некоторых раздумий решила сходить-таки на КРИ. Раздумья были связаны с тем, что там будет не так много интересных докладов да и стоит безумно дорого - 6000 рублей.

Наиболее интересные на мной взгляд выступления, на которые я точно пойду.
15-го мая
Арсений Капулкин (AKA Zeux), Creat Studios - SPU render. Заинтересовалась этим докладом, когда он в блоге своем намекал, что будет выступать на КРИ.

16-го
Константин Колчин, NVIDIA- Краткий обзор Direct3D 11.
Александр Харламов, NVIDIA - GPU computing или параллельные вычисления в играх

17-го
Роман Лут, Deep Shadows - Внедрение многопоточного рендеринга в игровой движок.

Все остальное время (кроме первой половины дня 17-го) похожу по другим программерским выступлениям (может посоветуете чего, а?). Если у вас есть желание пообщаться со мной в оффлайне - welcome.

После напишу обзор по тем докладам, на которые схожу.

17-го с утра будет лекция Кристофера Ллевеллина Смита по термоядерной энергетике и я пойду туда.

воскресенье, мая 10, 2009

Взрыв газопровода (Москва, Юго-Запад)

Обычно я не делаю посты не по теме, однако тут такое дело...
Недалеко от меня взорвался газопровод, горит теперь. В момент взрыва я как раз смотрела в окно и видела огненный шар, поднимавшийся над домами.


Везде пишут "прогремел взрыв", но звуков я вообще никаких не слышала. Было тихо. И страшно.
Про то, что это газопровод, узнала из новостей.
Муж сделал несколько фотографий, лежат тут.
Попытки дозвониться по 01 успеха не принесли. Было беспробудно занято.

Мастер-класс по искусственному интеллекту в играх

Алекс Шампандар (Alex J. Champandard) будет вести мастер-класс "Behavior Tree Blueprints for Action & Combat Game AI" 10 мая в 22:00 по Москве.
Подробности здесь. Там же будет ссылка на видеопоток за 15 минут до начала мастер-класса. Никаких упоминаний типа "деньги класть сюда" я не вижу, то есть мастер-класс бесплатный и доступный всем.

пятница, мая 08, 2009

Материалы с BoostCon 2009

Материалы с BoostCon 2009. Там не только про boost. О С++0x есть доклады. Про C++0x говорят, что он уже никак не выйдет в 2009 году.

По ссылке с Raider's Programming Blog

вторник, мая 05, 2009

Your computer desktop

Все phdcomics'ы неплохие, но сегодняшний выпуск особенно прекрасен.



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

понедельник, мая 04, 2009

delete this

Конструкция delete this вполне себе легальна, однако может привести к удивительно неприятным последствиям. Вот здесь написано, что нужно проверить при ее применении: Is it legal (and moral) for a member function to say delete this?. Особенно интересен предпоследний пункт - надо быть уверенным, что после удаления с объектом никто работать не будет.

Вот так вы напишете вряд ли


class CBase
{
int m_i;
public:
...
void MyFunction();
};

void CBase::MyFunction()
{
delete this;
m_i = 5;
}


Однако вот так, очень может быть

void CBase::MyFunction()
{
innocentLookingFunction();
m_i = 5;
}


Т.е. возможно, что строки delete this нет, но innocentLookingFunction() таки ведет к удалению объекта через лихо закрученные вызовы.

Что будет дальше? Ничего хорошего. Access violation, порча чужой памяти, как повезет.

Еще одна известная особенность языка C++ может усугубить проблемы, возникающие при вызове delete this. После удаления объекта можно продолжить с ним работать, вызывать те его функции, что не работают с данными и не подозревать о том, что он вообще удален.

Пример:

class CBase
{
int m_i;
public:
CBase() : m_i (0){}
void printBase() { cout<<"CBase"<<endl; }
};

int main()
{
CBase* b = NULL;
b->printBase();
return 0;
}


Экземпляр объекта CBase никогда даже и не создавался, но код будет шикарно работать годами до тех пор, пока вы не обратитесь к данным класса как-нибудь так:

void printBase() { m_i++; cout<<"CBase"<<endl; }