2014-10-17 33 views
5

Directx 11'i bir süredir çalışıyorum ama Directx 11'in belleği nasıl yönettiğine dair hala kafam karışık. Örneğin, ID3D11Device :: CreateBuffer kullanarak bir köşe tamponu oluşturursam, yeni arabellek nerede saklanır? Tampona bir işaretçi döndürdüğünü biliyorum, yani CPU RAM'de saklanması gerektiği anlamına mı geliyor? Ancak, bu ID3D11DeviceContext :: IASetVertexBuffers yapmak çok yavaş bir işlem olacağını düşündüm, çünkü bu arabayı CPU RAM'den GPU RAM'e kopyalamak zorunda kalacaktı. Ancak, ID3D11Device: CreateBuffer ile oluşturulan tüm arabelleklerin GPU RAM'de saklanması durumunda, GPU RAM gerçekten hızlı bir şekilde dolmuyor mu? Temel olarak şunu bilmek isterim: Bir arabellek oluşturduğumda, bu veri nerede saklanır? CPU RAM veya GPU RAM? Ayrıca, ID3D11DeviceContext :: IASetVertexBuffers, arabelleği (copying/setting?) Ile ne yapıyor.Directx 11 Bellek Yönetimi

cevap

7

Genel cevap, "sürücünün istediği her yer" dir. "DYNAMIC" kaynakları için, genellikle hem CPU hem de GPU için erişilebilir olan belleğe alınırlar (bu, PCIe veri yolu üzerinden paylaşılan modern bilgisayarlarda). "STATIC" kaynakları için, bunlar yalnızca "paylaşılan" bellek penceresiyle kopyalanan GPU tarafından erişilebilen veya "paylaşılan" bellek penceresine yerleştirilen sınırlı bir alan varsa, video RAM üzerinde olabilir. Render Hedefleri genellikle video RAM'e de yerleştirilir.

Direct3D video bellek yönetimi hakkında daha derin bir dalış için, "Windows Oyununuz 2,147,352,576'da Neden Çalışmıyor?" Konusuna bakın. Artık MSDN Yüklemelerinde değil, blog adresinde bulunabilir.

En cesur donanım ayrıntılarını isterseniz, driver writer's documentation'u okuyun.

Ayrıca MSDN Code Gallery eğitiminde Video Memory örneğini de bulabilirsiniz.