Pertanyaan Rendering dari internal WPF ke aplikasi DirectX


Saya memiliki aplikasi WPF yang dimaksudkan untuk melapisi HUD dalam streaming langsung. Ide awalnya adalah membuat plugin untuk xsplit (aplikasi populer untuk menyajikan streaming langsung) untuk menampilkan konten aplikasi WPF. Masalah dengan pendekatan ini adalah rendering bitmap ke antarmuka COM xsplit jauh merusak kinerja CPU untuk melepaskan aplikasi (Karena saya yakin ada masalah dalam antarmuka COM xsplit serta menggunakan RenderTargetBitmap membebani CPU).

Saya telah melihat langsung rendering overlay ke dalam permainan (Aplikasi DirectX target) karena memberikan sejumlah manfaat. Terutama itu mengatasi masalah kinerja di xsplit, tetapi juga membuka aplikasi hingga berbagai streaming dan menangkap aplikasi.


Saya tidak berpengalaman dengan DirectX tapi saya pikir ini adalah garis besar solusi

  1. Menginisialisasi aplikasi WPF dan menangkap perangkat Direct3d WPF (melalui metode ini)

  2. Temukan dan kaitkan panggilan EndScene aplikasi DirectX target (menggunakan EasyHook + Slimdx)

  3. Menampilkan konten permukaan Perangkat WPF ontop aplikasi DirectX yang doyan


Pertanyaan utama yang saya miliki adalah bagaimana menyelesaikan langkah 3 menggunakan SlimDX. Saya berharap suatu solusi bisa menggunakan kembali permukaan dan tidak bergantung pada penyalinan karena tujuannya adalah untuk tidak mempengaruhi kinerja aplikasi yang doyan. Saya juga ingin dapat membatasi wilayah dan mendukung transparansi. Saya juga bertanya-tanya apakah menggunakan perangkat Direct3d WPF di perangkat aplikasi DirectX yang doyan dapat menyebabkan ketidakstabilan apa pun.

Wawasan apa pun akan dihargai, terima kasih.


7
2018-04-29 21:13


asal


Jawaban:


Saya mencoba melakukan hal yang sama. Apa yang saya temukan sejauh ini adalah Anda dapat membuat wpfvisualtree Anda menjadi bitmap dan setelah itu menulis bitmap ke perangkat d3d yang ditangkap di poin 2.

void render(Direct3D.Device device)
{

wpfRenderTargetBitmap.Render(WpfVisualTree);
wpfRenderTargetBitmap.CopyPixels(devicePtr);

}

Saya belum menguji ini tapi saya pikir saya berada di jalur yang benar dengan ini. Satu-satunya masalah yang saya miliki sekarang adalah bahwa saya kehilangan semua interaktivitas dari jendela saya. Klik tombol dan seterusnya tidak akan lagi ditangkap ...

Setiap bantuan itu akan menyenangkan.


1
2018-06-21 09:07