2011-06-14 15 views
12

msdn documentation ait directx 11 dokular, olumlu ve olumsuz yanlarını oluştururken DirectX 11'de programlı bir DirectX 11 doku doldurmak için birden çok yolu olduğunu açıklıyor:Programlı üç farklı yöntemlerle

(1) varsayılan kullanım dokulu bir doku oluşturma ve bellekten veriyle başlat

(2) Dokuyu dinamik kullanımla oluşturun, doku belleğine bir işaretçi almak için DeviceContext Map'i kullanın, ona yazın, sonra tamamlandığını belirtmek için Unmap'i kullanın (bu noktada tahmin ediyorum) gpu'ye kopyalanır)

(3) Dokuyı stagin ile oluştur g kullanımı ve dinamik doku ile aynı adımları izleyin, ancak bu evreleme dokusunu kullanmak için ID3D11DeviceContext.CopyResource çağrısıyla sırayla (değişmez) varsayılan veya dinamik doku doldurun. Bununla birlikte, dokümantasyon her yöntemin artılarını ve eksilerini açıklamıyor ve ben hala directx konusunda oldukça yeniyim, bu yüzden bana açık değil.

Doğrudan bu 11 biçiminde programlı olarak doku oluşturma yollarının her birinin artıları ve eksileri nelerdir?

Yan Not: Ben kendi çift ara belleğe alma yapmak zorunda böylece evreleme dokular bağlamında, içinde geri gpu dan okuma tamponlu olmadığını okudum. Fakat bunun doğru olup olmadığını ve evrelendirme dokular (hatta gerçekten ne anlama geldiğini) kullanarak yazıp yazmayacağını bilmiyorum.

İkinci taraf notu: Harita yöntemi belgelerinde, bir alt kaynaktaki verilere işaretçi gösterdiği ve bu alt kaynağa GPU erişimini reddettiği bildiriliyor. GPU, temel verileri Harita ile adlandırılmış bir dokuya erişmek istediğinde, ne yapar? Ahır? (Ben soruyorum çünkü bu artıları ve ben soruşturdu eksileri bir parçası gibi geliyor)

+0

Öğrendiğim gibi notlar ekliyorum. Görünüşe göre, yukarıdaki (1) yöntemini kullanarak programlı olarak çok örnekli bir varsayılan doku oluşturamazsınız. –

+0

DirectX 11'de eşleştirilecek aramada D3D11_MAP_FLAG derece belirsiz olsa da, GPU'ya eşlenen kaynağa gereksinim duyulduğunda ne yapması gerektiğini anlatıyor. Şu anda yalnızca bir bayrak belgelenmiştir ve 0 kullanımının duraklama anlamına gelip gelmediği açık değildir. –

+2

Görünüşe göre bir D3D11_USAGE_DYNAMIC kaynağı, 1'e eşit miplevellere sahip olmalıdır. –

cevap

17

Doğru cevap, doku için ne kullanacağınıza bağlıdır. Bu üç seçenek, CPU'dan dokuya veri almanın farklı yollarıdır. Bu bir rendertarget ise, genel olarak CPU'dan ilk verileri sağlamazsınız, böylece bunları göz ardı edebilirsiniz: dokuyu oluşturun ve hazır hale getirdiğinizde (belki de ilk önce Clear()). Bu Bununla ben doku o yazılır çok daha fazla okunur demek (sadece statik bir doku ise

:

Yani doku içine almak istediğiniz uygulama bellekte veriler var mı varsayarak), daha sonra bir USAGE_DEFAULT veya USAGE_IMMUTABLE doku istersiniz. Bunlar genellikle USAGE_DYNAMIC ile karşılaştırıldığında GPU okuma performansı için optimize edilmiştir. Dokuyu oluştururken elinizde kullanışlı veriler varsa, (1) seçeneği en kolay olanıdır, en az ara belleği kullanır ve DX11'de GPU'ya veri aktarımı, görüntü parçacığınızdan ayrı bir iş parçacığı üzerinde yapılabilir. Verileri doku oluşturduğunuz anda elinizde yoksa, verdiğinizde verileri sağlamak için UpdateSubresource() veya option (3) seçeneğini kullanın.

Dinamik bir yapı ise, CPU'dan sık sık yeni içerikler sağlamanız anlamına gelir (CPU tabanlı video oynatma kural dışı durumdur: veriler her kare için bir kez CPU tarafından sağlanır, sonra kare başına bir kez GPU tarafından okunur) muhtemelen USAGE_DYNAMIC ve seçeneğini (2) kullanmak istersiniz. USAGE_DYNAMIC dokular, GPU okumaları için değil, CPU'dan GPU'ya veri akışı için optimize edilmiştir. Ayrıntılar (ve performans sonuçları) donanım satıcıları arasında değişiklik gösterir, ancak genellikle yalnızca CPU'dan GPU'ya veri akışı yapıyorsanız, yalnızca statik veriyi yüklemek için uygun bir yol olduğundan, yalnızca USAGE_DYNAMIC kullanmak istersiniz.

Seçenek (3) daha özeldir ve başlangıçtaki veri yükünün statik bir dokuya (çok sayıda doku için veri yüklemek için kullanılan yüzeyleri yeniden kullanması) veya nispeten dinamik kullanım için veri akışı için kullanılabilir. GPU/CPU senkronizasyonu üzerinde ve transferler için kullanılan ara bellek üzerinde tam kontrol sağlar. Genellikle her bir arabelleğin hala bir önceki CopyResource tarafından kullanılmakta olup olmadığını kontrol etmek için bir dizi aşamalı önbellek ve D3D11_MAP_FLAG_DO_NOT_WAIT kullanırsınız. Bunu uzman bir seçenek olarak görüyorum - dikkatli değilseniz, CPU ve GPU'nun senkronize olmayan bir şekilde çalışmasını engelleyerek çok kötü bir şekilde incinebilirsiniz.

Tam açıklama: Nvidia'daki D3D sürücüsünde çalışıyorum, ancak bunlar benim kişisel görüşlerim.