WPF ウィンドウまたは WinForm でレンダリングするレンダリング ループを作成したいと考えています。したがって、SharpGL ( https://sharpgl.codeplex.com/ )を使用したいと考えています。ループを作成するために、スレッドを作成しました:
public void Run()
{
IsRunning = true;
this.Initialize();
while (IsRunning)
{
Render(/* arguments here */);
// pausing and stuff
}
Dispose();
}
Render では、描画呼び出しを GPU に送信したいと考えています。これまでのところ問題はありません。ただし、Winforms と WPF には独自のスレッドとループが必要です。そのため、以前に使用した LWJGL ( https://www.lwjgl.org/ ) を使用して Java のように Window を作成して描画することはできません。アプリケーションでフォームを実行する別のスレッドを開始する必要があります (短くするためにエラー処理を切り取りました)。
[STAThread]
private void HostWinFormsApplication()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(true);
// get Display
Display = Engine.MainModule.Resolve<IDisplay>();
Display.Initialize();
Display.Closing += (s, e) => Stop();
Application.Run(Display as Form);
}
レンダラーがフォームの OpenGL コントロールにアクセスして使用しようとすると、エラーが発生します。これは、WinForms (および WPF) がそのコントロールを他のスレッドで操作することを望まないためです。したがって、Invoke はオプションかもしれませんが、これはドローコールを遅らせ、ボトルネックになります。タイマーも正確ではなく、柔軟性がないため、オプションではありません...そして、私はそれが好きではありません. そして、ウィンドウコード内ですべてを行うことは可能かもしれませんが、アプリケーションをそのディスプレイから独立させて、変更できるようにしたいと考えています。アプリケーションを実行するディスプレイではなく、ディスプレイを持つアプリケーションである必要があります。LWJGL では、ディスプレイを作成して初期化し、それを使用することができました。考慮すべき唯一のことは、それを更新することであり、すべてがうまくいきました. したがって、レンダリングスレッドでウィンドウを作成して描画したいだけです。このようにすると、この .Net-Loop が必要なため、ウィンドウが使用できなくなり、灰色がかってしまいます。それを実現する可能性はありますか、またはWindowsを作成する別の方法を知っている人はいますか? ウィンドウループを手動で処理できますか?
どんなアイデアでも大歓迎です。
WPF ウィンドウでこれを行う方法があれば、それは素晴らしいことです。次に、OpenGL コントロールとすべての WPF スタッフを使用して、エディターを作成できます。