ПРОГРАМИРУЕМ 3D ГРАФИКУ ИСПОЛЬЗУЯ DirectX




Расставляем декорации - часть 21


Переменная m_plMeshBld инициализируется при конструировании объекта C3dShape:

C3dShape::C3dShape() (

m_pIVisual = NULL;

C3dFrame::Create(NULL) ;

ASSERT(m_pIFrame) ;

m_pIFrame->SetAppData((OLONG)this) ;

Создание фигур '"^l 57

m strName = «3D Shape»;

m^pIMeshBId = NULL;

the3dEngine.CreateMeshBuilder(&m_pIMeshBld);

ASSERT(m_pIMeshBld) ;

AttachVisual(m_pIMeshBld) ;

}

Глобальный объект the3dEngine пользуется некоторыми глобальными функциями Direct3D для создания различных интерфейсов трехмерной графики. Чтобы вы не подумали, будто я от вас что-то скрываю, покажу, откуда возникает интерфейс IRLMeshBuilder:

BOOL C3dEngine::CreateMeshBuilder(IDirect3DRMMeshBuilder**

pIBId)

(

ASSERT(m_pIWRL) ;

ASSER'. 'oIBId) ;

m_hr = m_pIWRL->CreateMeshBuilder(pIBld) ;

if (FAILED(m_hr)) return FALSE;

ASSERT(*pIBld);

return TRUE;

Пока я не стану объяснять, откуда берется значение m_plWRL, но вы наверняка уловили общий принцип: обращения к СОМ-интерфейсам мало чем отличаются от вызовов функций объектов в C++. Сходство настолько велико, что я использую префикс р1 для СОМ-интерфейсов. Чтобы понять отличия между ними, давайте посмотрим, что происходит с указателями на СОМ-интерфейсы при уничтожении объекта C3dShape:

C3dShape : : --C3dShape () {

if (m_pIVisual) m_pIVisual->Release() ;

if (m_pIMeshBld) m_pIMeshBld->Release();

m ImgList.DeieteAll () ;

Как видите, наши действия сильно отличаются от обычного удаления объектов по указателям. Завершая работу с СОМ-интерфейсом, вы обязаны вызвать его функцию Release, чтобы уменьшить значение его счетчика обращений. Если не сделать этого, то СОМ-объект будет жить в памяти вечно.

Напоследок я бы хотел сделать одно замечание, относящееся к вызову функций из конструкторов объектов C++. Как нетрудно догадаться, попытка создать интерфейс внутри конструктора может кончиться неудачей — чаще всего это происходит из-за нехватки памяти. В своей программе я даже не пытаюсь обнаружить такую ситуацию. Проблемы с памятью вызывают исключение, которое, как я надеюсь, будет перехвачено в вашей программе! Конечно, с моей стороны




Содержание  Назад  Вперед