2012-02-01 21 views
5

DirectX 11'i yönetilmeyen C++ kodundan kullanmak ve GUI için WFP'yi kullanmak istiyorum. SlimDX benim için uygun değil. Ben DirectX 10 ile WPF çalışma yapmak için bir çözüm bulduk:WPF ve DirectX 11 via D3DImage

WPF & DirectX 10 via D3DImage

Ama iki düğmeli DirectX ile 11. Sadece boş ekran onu işe yönetmek olamazdı. herkes ben sadece bu örneği koşturup dururken CPU kullanımı Intel i5 750 (Windows 7 64 bit, NVidia için yaklaşık 4-5% olduğunu görmüştü DirectX Ayrıca 11.

ile çalışan WPF nasıl biliyor mu Geforce 430). Bence çok fazla .. CPU kullanımını azaltmak mümkün mü?

Burada kodumu bulabilirsiniz

: http://www.gamedev.net/topic/619534-wpf-directx-11-via-d3dimage/

+0

Herhangi bir hata mesajı alıyor musunuz? Kurulumunuzu ve işlem kodunuzu gönderir misiniz? –

+0

Kodumu burada bulabilirsiniz: http://www.gamedev.net/topic/619534-wpf-directx-11-via-d3dimage/ – Alex

cevap

1

O örnekle DirectX11 çalışmasının nasıl yorum yapamam, ancak şahit oluyoruz% 5 işlemci muhtemelen iplik DirectX'te döngü içinde oluşturulur, ancak hiçbir ile yapılacak iş.

Bir işlem döngüsü, oyunlarda sahneleri/fiziği/AI'yi farklı bir iş parçacığı üzerinde güncellerken "yapabileceğiniz kadar hızlı" hale getirmek için yaygın olarak kullanılır. Masaüstü görselleştirme uygulamalarında bu genellikle gerekli değildir.

GUI'deki güncelleştirmelerin yalnızca kullanıcı etkileşimde bulunduğunda oluştuğu bilimsel görselleştirme uygulamaları için (ör., Bir öğeyi sürükler, görünüm penceresini tarar) Oluşturma döngüsünü yalnızca bir güncelleştirme olduğunda oluşturulacak şekilde yeniden tasarladım. Yani: iş yerinizde mousemove'u kaydırmak için DirectX'i bir bayrak veya benzeri ayarlayarak yeniden çizmeye zorlarsınız. Bu şekilde "ihtiyacınız olduğunda çizme", uygulama rölantide iken CPU'nuzu sıfıra indirecek ve masaüstü uygulamaları için daha uygun olacaktır.

+0

Evet, haklısınız. Şimdi WPF ~ 60 fps'yi yeniden çiziyor. Sadece bildirim ile yeniden çizebilirim. Ancak, GUI iki düğmeden daha karmaşıksa, yalnızca ihtiyacım olduğunda yeniden çizilse bile, CPU kullanımı% 10-15'e çıkar. – Alex

2

D3DImage.AddDirtyRect bir çağrıyı kaçırıyorsunuz. Sahnenizi Direct3D11 ile oluşturduktan sonra, WPF'ye gösterilmeye hazır yeni bir görüntü olduğunu söylemeniz gerekir.

d3dimage.Lock(); 

//... 
//your render code 
///... 

var surface = renderTexture.GetSurfaceLevel(0); 

d3dimage.SetBackBuffer(D3DResourceType.IDirect3DSurface9, surface.ComPointer); 

var rect = System.Windows.Int32Rect(0, 0, width, height); 

d3dimage.AddDirtyRect(rect); 

d3dimage.Unlock(); 

Bu, her kareyi yapılması gereken: d3dimage sizin D3DImage örneğidir nerede yapmak için, şunları yapın.

Additional info about AddDirtyRect

+0

Hayır, bunu Window1.xaml.cs dosyasında yapıyorum. Hatamı buldum. {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0} düzeni için yanlış format kullanmıştım. DXGI_FORMAT_B8G8R8A8_UNORM kullandım, ancak şunu yapmak zorundayım: DXGI_FORMAT_R32G32B32_FLOAT – Alex

3

Ben köşe tampon düzeni için yanlış biçimde kullandı. DXGI_FORMAT_B8G8R8A8_UNORM kullandım, ancak benim durumumda DXGI_FORMAT_R32G32B32_FLOAT kullanmalıyım.