воскресенье, 17 октября 2010 г.

Семинар Страуструпа "Виртуозное программирование"

Посетили еще на этой неделе семинар Бьярн Страуструп "Виртуозное программирование".  Так как в докладе ничего особенно нового не было основной целью похода было посмотреть на легенду :-).

Организаторы оплошали, у них какие то там были проблемы с аудиотрией и по этому доклад перенесли на 8:30, а регистрация должна была начаться в 7:30. Мы собрались с силами, приехали к 7:30, но оргонизаторы приехали намного позже. Хотя Страуструп был ровно в 7:30. В итоге семинар начался на час позже, при этом организаторы где-то полчаса в начале распинались какие они хорошие что смогли найти новую аудитории для семинара. Страуструпу пришлось выкинуть часть доклада по C++0x, самое интересное для меня. Предлагали всем в пятницу приехать на эту часть доклада, но мы уже не выбрались.

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

Фотографии с семинара

Отзыв с предыдущего его семинара от bishop-it.ru

среда, 12 мая 2010 г.

Профайлер для DX приложений

Наткнулся на профайлер для приложений под DX9-11. Возможно кому окажется полезен. Есть некоторые баги, но с ними можно жить :-).

http://busyray.com/dxprof/index.html

воскресенье, 25 апреля 2010 г.

Visual Leak Detector for Visual C++ 2008/2010

Поиск утечек памяти порой очень непростая задача, а стандартная CRT функциональность для их поиска (Memory Leak Detection Enabling) часто не дает полезной информации.

Из бесплатных средств я нашел для Visual C++ только Visual Leak Detector.

Основные его плюсы:
* Поиск утечек памяти и в сторонних библиотеках
* Вывод стека программы для каждой утечки памяти с указанием имени файла и номера строки

Но VLD к сожалению не поддерживал 64-битные приложения и Visual Studio 2010.

Я добавил поддержку 64-битных приложений и Visual Studio 2010, но автор VLD, Dan Moulding, не ответил на мои письма и решил самостоятельно выпустить версию 2.0 на новом сайте http://vld.codeplex.com/ с Wiki и баг трекером. Пользуйтесь :-).

понедельник, 22 марта 2010 г.

Подсчет ссылок в D3D8 и D3D9

Казалось бы что может быть сложного, на AddRef() увеличиваем кол-во ссылок, в Release() уменьшаем. Но в Diretct3D 8 и 9, как обычно, не все так просто и чтобы создать полноценный Direct3D Wrapper необходимо это все учитывать, иначе некоторые игры начнут с ни падать.

Вот некоторые особенности:
  • Автоматически созданные IDirect3DDevice9 ресурсы (BackBuffer, автоматически созданный depth-stencil surface, основной SwapChain) нельзя удалить, т.е. Release() можно вызывать хоть до бесконечности он будет возвращать кол-во ссылок 0 и не удалит ресурс.
  • Само устройство не увеличивает кол-во ссылок на автоматически созданные ресурсы.
  • Пока ресурс забинджен в устройство (с помощью SetTexture, SetRenderTarget или SetDepthStencilSurface) его нельзя удалить, при попытке удалить его счетчик ссылок не будет опускать ниже 0. После того устройство освободит ресурс если кол-во ссылок ресурса равно нулю он будет удален.
  • У текстуры и её поверхностей общий счетчик ссылок.
Вот так то :-)

воскресенье, 22 ноября 2009 г.

Переход с Direct3D9 на Direct3D9Ex

Была необходимость воспользоваться Shared ресурсами в D3D9 под Vist'ой/Win 7, для этого решили переписать приложение чтобы оно вместо интерфейса IDirect3DDevice9 стало использовать IDirect3DDevice9Ex. Казалось бы что может быть проще, у IDirect3DDevice9Ex родительский интерфейс IDirect3DDevice9.

Но как всегда всплыли некоторые подводные камни:

Под D3D9Ex не поддерживаются Pool Managed для ресурсов, поэтому пришлось их все перевести в Pool Default. Так как ресурсы в Pool Default можно лочить только установить Usage Dynamic, пришлось его установить у соответствующих ресурсов.

  • Так как для Managed ресурсов LockRect всегда возвращал Pitch равный ширине поверхности в байтах, т.е. строки не выравниваются, а строки в динамических ресурсах в Pool Default наоборот всегда выравниваются до следующего значения кратно степени двойки. Поэтому пришлось переписать места где текстуры заливались одним memcpy без учета Pitch, так чтобы они корректно работали с выравненными строками.
  • Выяснилось ещё для Volume текстур в Pool Default в LockBox есть баг в Direct3D9 и Direct3D9Ex, он напрочь игнорирует параметры Front, Back и всегда лочит весь объем полностью. Для Volume текстур в Pool Managed все работает правильно в Direct3D9. Переписали код чтоб обновляли содержимое объема всегда полностью.


Может кому будет интересен или даже полезен этот опыт.

пятница, 20 ноября 2009 г.