2012-02-01 17 views
5

Tôi muốn sử dụng DirectX 11 từ mã C++ không được quản lý và sử dụng WFP cho GUI. SlimDX không phù hợp với tôi. tôi đã tìm thấy các giải pháp để làm cho WPF làm việc với DirectX 10:WPF và DirectX 11 qua D3DImage

WPF & DirectX 10 via D3DImage

Nhưng tôi không thể quản lý để làm việc đó với DirectX 11. Màn hình Just trống với hai nút. Có ai biết cách làm cho WPF hoạt động với DirectX 11.

Ngoài ra tôi đã thấy rằng khi tôi chỉ chạy ví dụ này, CPU sử dụng khoảng 4-5% cho Intel i5 750 (Windows 7 64 bit, NVidia Geforce 430). Tôi nghĩ rằng nó quá nhiều .. Có thể giảm sử dụng CPU?

Bạn có thể tìm mã của tôi ở đây: http://www.gamedev.net/topic/619534-wpf-directx-11-via-d3dimage/

+0

Bạn có nhận được bất kỳ thông báo lỗi nào không? Bạn có thể đăng thiết lập và hiển thị mã không? –

+0

Bạn có thể tìm thấy mã của tôi ở đây: http://www.gamedev.net/topic/619534-wpf-directx-11-via-d3dimage/ – Alex

Trả lời

1

Tôi không thể bình luận về cách làm cho DirectX11 làm việc với ví dụ đó, nhưng CPU 5% bạn đang chứng kiến ​​có lẽ là làm cho vòng lặp trong DirectX quay nhưng không có làm việc.

Vòng kết xuất thường được sử dụng trong trò chơi để hiển thị "nhanh nhất có thể" trong khi cập nhật cảnh/vật lý/AI trên một chuỗi khác. Trong các ứng dụng trực quan hóa máy tính để bàn, điều này thường không cần thiết. Đối với các ứng dụng trực quan hóa khoa học, các bản cập nhật cho GUI chỉ xảy ra khi người dùng tương tác (ví dụ: kéo một mục, mở khung nhìn) Tôi đã thiết kế lại vòng kết xuất để chỉ hiển thị khi có bản cập nhật. tức là: sau khi công việc của bạn xoay khung nhìn trong mousemove, bạn buộc DirectX vẽ lại bằng cách đặt cờ hoặc tương tự. Bằng cách này "vẽ khi bạn cần nó" sẽ giảm CPU của bạn gần bằng không trong khi ứng dụng đang chạy không tải và phù hợp hơn cho các ứng dụng máy tính để bàn.

+0

Có, bạn đã đúng. Bây giờ WPF vẽ lại ~ 60 khung hình/giây. Tôi chỉ có thể vẽ lại bằng thông báo. Nhưng nếu GUI phức tạp hơn hai nút, thì việc sử dụng CPU tăng lên đến 10-15%, ngay cả khi chỉ vẽ lại khi tôi cần. – Alex

2

Bạn đang thiếu một cuộc gọi đến D3DImage.AddDirtyRect. Sau khi bạn hoàn thành cảnh của mình bằng Direct3D11, bạn cần thông báo cho WPF biết rằng có một hình ảnh mới sẵn sàng được hiển thị. Để làm điều đó, bạn thực hiện những điều sau đây, nơi d3dimage là dụ D3DImage của bạn:

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(); 

này cần phải được thực hiện mỗi khung.

Additional info about AddDirtyRect

+0

Không, tôi làm điều đó trong tệp Window1.xaml.cs. Tôi đã tìm thấy sai lầm của mình. Tôi đã sử dụng định dạng sai cho bố cục {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}. Tôi đã sử dụng DXGI_FORMAT_B8G8R8A8_UNORM nhưng phải: DXGI_FORMAT_R32G32B32_FLOAT – Alex

3

Tôi đã sử dụng định dạng sai cho bố cục bộ đệm đỉnh. Tôi đã sử dụng DXGI_FORMAT_B8G8R8A8_UNORM, nhưng phải sử dụng DXGI_FORMAT_R32G32B32_FLOAT trong trường hợp của tôi.