1
0
mirror of synced 2024-11-28 17:31:00 +01:00
OpenTaiko/TJAPlayer3/Common/CActFlushGPU.cs

62 lines
1.6 KiB
C#
Raw Normal View History

2021-09-21 00:16:38 +02:00
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using SharpDX.Direct3D9;
2021-09-21 00:16:38 +02:00
using FDK;
namespace TJAPlayer3
{
/// <summary>
/// 描画フレーム毎にGPUをフラッシュして、描画遅延を防ぐ。
/// DirectX9の、Occlusion Queryを用いる。(Flush属性付きでGetDataする)
/// Device Lost対策のため、QueueをCActivitiyのManagedリソースとして扱う。
/// On進行描画()を呼び出すことで、GPUをフラッシュする。
/// </summary>
internal class CActFlushGPU : CActivity
{
// CActivity 実装
public override void OnManagedリソースの作成()
{
if ( !base.b活性化してない )
{
try // #xxxxx 2012.12.31 yyagi: to prepare flush, first of all, I create q queue to the GPU.
{
IDirect3DQuery9 = new Query(TJAPlayer3.app.Device, QueryType.Occlusion);
2021-09-21 00:16:38 +02:00
}
catch ( Exception e )
{
Trace.TraceError( e.ToString() );
Trace.TraceError( "例外が発生しましたが処理を継続します。 (e5c7cd0b-f7bb-4bf1-9ad9-db27b43ff63d)" );
}
base.OnManagedリソースの作成();
}
}
public override void OnManagedリソースの解放()
{
IDirect3DQuery9.Dispose();
IDirect3DQuery9 = null;
base.OnManagedリソースの解放();
}
public override int On進行描画()
{
if ( !base.b活性化してない )
{
IDirect3DQuery9.Issue( Issue.End );
DWM.Flush();
IDirect3DQuery9.GetData<int>( out int _, true ); // flush GPU queue
2021-09-21 00:16:38 +02:00
}
return 0;
}
// その他
#region [ private ]
//-----------------
private Query IDirect3DQuery9;
//-----------------
#endregion
}
}