среда, 22 августа 2012 г.

Driving Licence

Ну вот, после 5-ти месяцев мучений я стал обладателем водительских прав:


В начале обучения я решил сдавать на права "по-честному", но после того, как насмотрелся на  цирк со сдачей экзамена по вождению в автошколе с участием пацанвы и студентоты, осознал что эта коррупционная схема приведёт только к потере личного времени и нервов, а они мне дороже "зелёнки". В итоге решил закрыть вопрос с преподавателем по-быстрому. Кстати, вот интересная статья от овечки, которая решила отбиться от стада и сдавать на права отдельно:

Осторожно – автошкола! или Как получают права
И вот ещё:
Автошкола

В самом конце, после оплаты 249 грн (~30$) в кассе МРЭО (а в прошлом году было дороже!), мне выдали:
  • Водительское удостоверение
  • Экзаменационную карточку водителя
  • Свидетельство об окончании автошколы
  • Копию мед. справки
P.S.

Учите билеты!
И не ждите "покращень", а готовьте трактор :)

пятница, 10 августа 2012 г.

I leave Ubisoft

Сегодня был мой последний день в Ubisoft Kiev.
:(

понедельник, 6 августа 2012 г.

Direct2D interop

Всё началось с того, что из Direct3D 11 исключили классы наподобии ID3DXFont для работы с текстом. Это очень неудобно для маленьких приложений, когда некогда писать собственный фреймворк для текстурных шрифтов, а вывести простейший текст надо.

Как быстрое решение, можно выводить текст, используя старый добрый software GDI API, указав флаг DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE при создании swap chain-а, но это решение серьёзно роняет fps - чем больше размеры бэк-буфера, тем дольше выполняются методы GetDC/ReleaseDC, т. к. происходит трансфер буфера из видеопамяти.

С выходом DirectX 11 Microsoft представила новые API на замену GDI/GDI+ - это Direct2D и DirectWrite, которые подразумевалось использовать в том числе и для вывода текста. Эти API используют преимущества аппаратного ускорения, но беда в том, что сами они были написаны на базе Direct3D 10.x, и поэтому несовместимы с интерфейсами Direct3D 11. Подробнее об этом можно прочитать здесь: Hacking Direct2D to use directly Direct3D 11 instead of Direct3D 10.1 API.

Решение этой проблемы, представленное там, мне понравилось, но я был не удовлетворён его реализацией - она написана на скорую руку, как proof of concept. Решение построено на оборачивании интерфейса IDXGISurface в промежуточную оболочку, которая подставляется вместо реального интерфейса. Я решил займствовать идею, и создал свою реализацию proxy-интерфейсов, заключив всё в отдельную dll. Чтобы понять, какие вызовы Direct3D делаются из Direct2D, каждый метод логируется и проверяются коды возврата (HRESULT).

Это решение отлично работает в независимом приложении, но при попытке отладить его в PIX происходит крэш (на вызове D3D10CreateStateBlocks). Сложно сказать, из-за чего именно - возможно, на уровне d3d10.dll используются какие-то недокументированные особенности COM-интерфейсов Direct3D 10, которые не учитываются в proxy-интерфейсах. Также грядущий DirectX 11.1 содержит обновление Direct2D 1.1, которое работает с последней версией Direct3D API, делая хак несколько устаревшим. Впрочем, если приложение должно работать на чистой Windows 7 (которая будет жить ещё долго и счастливо), решение может оказаться очень полезным.

Update Aug 21, 2012

Обнаружил, что использование библиотеки приводит к утечке памяти - не все созданные объекты корректно удаляются, поэтому Direct3D debug layer рапортует о "live objects" после удаления устройства. Проанализировал код и дописал ->Release() к некоторым объектам. Также от меня ускользнуло то, что Direct2D пытается запросить интерфейс ID3D10InfoQueue, поэтому добавил обёртку и для него (хотя это не обязательно). В конце упростил функцию D2DXCreateInteroperableSurface() - теперь она принимает всего два параметра, а интерфейсы устройства и контекста получает через методы API. Поправил инкапсуляцию в классе-обёртке устройства Direct3D.

Ссылки на исходный код на Google Code:
d2dx.zip
d2d_interop.zip

пятница, 3 августа 2012 г.

Drive

Один из трэков к фильму "Drive", который мне ну очень понравился.