2012-11-07 4 views
0

Например, в следующем коде:Что происходит, когда мы называем IUknown :: Release

ID3D11Texture2D* texture2d; 

    HRESULT result = mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*) &texture2d);//mSwapChain is a swap chain, as obvious 

    result = mDevice->CreateRenderTargetView(texture2d, 0, &mTargetView); 

    texture2d->Release(); 

Я действительно путают то, что будет происходить с BackBuffer в swapchain после вызова освобождения. На данный момент я думаю, что это может произойти, указатель освобождается, не затрагивая самого бэкбуфера. Мне нужен более сложный ответ, потому что я с трудом понимаю концепцию.

ответ

3

Объект текстуры поддерживает внутренний подсчет числа «ссылок», которые он имеет. Первоначально, когда ваш код запускается, swapchain внутренне имеет указатель на текстуру, поэтому он имеет счетчик ссылок.

Когда он возвращает указатель на вас, теперь есть две ссылки на объект.

Обратите внимание, что код внутри swapchain :: GetBuffer делает это вручную, вызывая функцию AddRef текстуры перед возвратом указателя к вам.

Поэтому, когда вы вызываете Release, все это уменьшает счетчик ссылок на единицу, а затем говорит: «Ах, есть еще одна ссылка, поэтому я ничего не буду делать».

Если объект цепочки подкачки был удален до того, как вы назвали свое освобождение на текстуре, он бы «высвободил» его ссылку на текстуру, поэтому, когда вы позвонили в свою версию, это уменьшило бы количество ссылок на текстуру до нуля и он сказал бы: «Ах, никто меня больше не использует, я удалю себя!».

Так что в основном вы называете Release на текстуре, просто вы говорите текстуре, что вы ее больше не интересуете. Он по-прежнему будет висеть в памяти, хотя пока все это не сказали.

Смежные вопросы