#24820 ウインドウを動かしたりVSyncWaitを変更するとエラーになる問題を修正。
描画遅延対策のOcclusion Query実装を、CActivityクラスの継承クラス内で行うようにして、Device Lost対策とした。
@@ -166,6 +166,11 @@ | ||
166 | 166 | get; |
167 | 167 | private set; |
168 | 168 | } |
169 | + public static CActFlushGPU actFlushGPU | |
170 | + { | |
171 | + get; | |
172 | + private set; | |
173 | + } | |
169 | 174 | |
170 | 175 | public static CSound管理 Sound管理 |
171 | 176 | { |
@@ -265,11 +270,6 @@ | ||
265 | 270 | { |
266 | 271 | get { return base.GraphicsDeviceManager.Direct3D9.Device; } |
267 | 272 | } |
268 | - public SlimDX.Direct3D9.Query IDirect3DQuery9 | |
269 | - { | |
270 | - get; | |
271 | - set; | |
272 | - } | |
273 | 273 | public CPluginHost PluginHost |
274 | 274 | { |
275 | 275 | get; |
@@ -1256,10 +1256,9 @@ | ||
1256 | 1256 | break; |
1257 | 1257 | } |
1258 | 1258 | } |
1259 | - DWM.Flush(); | |
1260 | - IDirect3DQuery9.Issue( Issue.End ); | |
1261 | - IDirect3DQuery9.GetData<int>(true); // flush GPU queue | |
1259 | + actFlushGPU.On進行描画(); // Flush GPU | |
1262 | 1260 | this.Device.EndScene(); |
1261 | + | |
1263 | 1262 | #region [ 全画面・ウインドウ切り替え ] |
1264 | 1263 | if ( this.b次のタイミングで全画面・ウィンドウ切り替えを行う ) |
1265 | 1264 | { |
@@ -1518,16 +1517,7 @@ | ||
1518 | 1517 | base.Window.ClientSize = new Size(ConfigIni.nウインドウwidth, ConfigIni.nウインドウheight); // #23510 2010.10.31 yyagi: to recover window size. width and height are able to get from Config.ini. |
1519 | 1518 | base.InactiveSleepTime = TimeSpan.FromMilliseconds((float)(ConfigIni.n非フォーカス時スリープms)); // #23568 2010.11.3 yyagi: to support valiable sleep value when !IsActive |
1520 | 1519 | // #23568 2010.11.4 ikanick changed ( 1 -> ConfigIni ) |
1521 | - try | |
1522 | - // #xxxxx 2012.12.31 yyagi: to prepare flush, first of all, I create q queue to the GPU. | |
1523 | - { | |
1524 | - IDirect3DQuery9 = new SlimDX.Direct3D9.Query( Device, QueryType.Occlusion ); | |
1525 | - } | |
1526 | - catch ( Exception e ) | |
1527 | - { | |
1528 | - Trace.TraceError( e.Message ); | |
1529 | - } | |
1530 | - | |
1520 | + actFlushGPU = new CActFlushGPU(); | |
1531 | 1521 | //--------------------- |
1532 | 1522 | #endregion |
1533 | 1523 |
@@ -1777,6 +1767,7 @@ | ||
1777 | 1767 | this.listトップレベルActivities.Add( stage結果 ); |
1778 | 1768 | this.listトップレベルActivities.Add( stageChangeSkin ); |
1779 | 1769 | this.listトップレベルActivities.Add( stage終了 ); |
1770 | + this.listトップレベルActivities.Add( actFlushGPU ); | |
1780 | 1771 | //--------------------- |
1781 | 1772 | #endregion |
1782 | 1773 | #region [ プラグインの検索と生成 ] |
@@ -0,0 +1,60 @@ | ||
1 | +using System; | |
2 | +using System.Collections.Generic; | |
3 | +using System.Text; | |
4 | +using System.Diagnostics; | |
5 | +using SlimDX.Direct3D9; | |
6 | +using FDK; | |
7 | + | |
8 | +namespace DTXMania | |
9 | +{ | |
10 | + /// <summary> | |
11 | + /// 描画フレーム毎にGPUをフラッシュして、描画遅延を防ぐ。 | |
12 | + /// DirectX9の、Occlusion Queryを用いる。(Flush属性付きでGetDataする) | |
13 | + /// Device Lost対策のため、QueueをCActivitiyのManagedリソースとして扱う。 | |
14 | + /// On進行描画()を呼び出すことで、GPUをフラッシュする。 | |
15 | + /// </summary> | |
16 | + internal class CActFlushGPU : CActivity | |
17 | + { | |
18 | + // CActivity 実装 | |
19 | + | |
20 | + public override void OnManagedリソースの作成() | |
21 | + { | |
22 | + if ( !base.b活性化してない ) | |
23 | + { | |
24 | + try // #xxxxx 2012.12.31 yyagi: to prepare flush, first of all, I create q queue to the GPU. | |
25 | + { | |
26 | + IDirect3DQuery9 = new SlimDX.Direct3D9.Query( CDTXMania.app.Device, QueryType.Occlusion ); | |
27 | + } | |
28 | + catch ( Exception e ) | |
29 | + { | |
30 | + Trace.TraceError( e.Message ); | |
31 | + } | |
32 | + base.OnManagedリソースの作成(); | |
33 | + } | |
34 | + } | |
35 | + public override void OnManagedリソースの解放() | |
36 | + { | |
37 | + IDirect3DQuery9.Dispose(); | |
38 | + IDirect3DQuery9 = null; | |
39 | + base.OnManagedリソースの解放(); | |
40 | + } | |
41 | + public override int On進行描画() | |
42 | + { | |
43 | + if ( !base.b活性化してない ) | |
44 | + { | |
45 | + IDirect3DQuery9.Issue( Issue.End ); | |
46 | + DWM.Flush(); | |
47 | + IDirect3DQuery9.GetData<int>( true ); // flush GPU queue | |
48 | + } | |
49 | + return 0; | |
50 | + } | |
51 | + | |
52 | + // その他 | |
53 | + | |
54 | + #region [ private ] | |
55 | + //----------------- | |
56 | + private SlimDX.Direct3D9.Query IDirect3DQuery9; | |
57 | + //----------------- | |
58 | + #endregion | |
59 | + } | |
60 | +} |