• R/O
  • SSH
  • HTTPS

dtxmania: 提交


Commit MetaInfo

修订版480 (tree)
时间2013-01-01 14:24:12
作者yyagi

Log Message

#24820 ウインドウを動かしたりVSyncWaitを変更するとエラーになる問題を修正。
描画遅延対策のOcclusion Query実装を、CActivityクラスの継承クラス内で行うようにして、Device Lost対策とした。

更改概述

差异

--- branches/120724(DTXMania with #24820)/DTXManiaプロジェクト/コード/全体/CDTXMania.cs (revision 479)
+++ branches/120724(DTXMania with #24820)/DTXManiaプロジェクト/コード/全体/CDTXMania.cs (revision 480)
@@ -166,6 +166,11 @@
166166 get;
167167 private set;
168168 }
169+ public static CActFlushGPU actFlushGPU
170+ {
171+ get;
172+ private set;
173+ }
169174
170175 public static CSound管理 Sound管理
171176 {
@@ -265,11 +270,6 @@
265270 {
266271 get { return base.GraphicsDeviceManager.Direct3D9.Device; }
267272 }
268- public SlimDX.Direct3D9.Query IDirect3DQuery9
269- {
270- get;
271- set;
272- }
273273 public CPluginHost PluginHost
274274 {
275275 get;
@@ -1256,10 +1256,9 @@
12561256 break;
12571257 }
12581258 }
1259- DWM.Flush();
1260- IDirect3DQuery9.Issue( Issue.End );
1261- IDirect3DQuery9.GetData<int>(true); // flush GPU queue
1259+ actFlushGPU.On進行描画(); // Flush GPU
12621260 this.Device.EndScene();
1261+
12631262 #region [ 全画面・ウインドウ切り替え ]
12641263 if ( this.b次のタイミングで全画面・ウィンドウ切り替えを行う )
12651264 {
@@ -1518,16 +1517,7 @@
15181517 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.
15191518 base.InactiveSleepTime = TimeSpan.FromMilliseconds((float)(ConfigIni.n非フォーカス時スリープms)); // #23568 2010.11.3 yyagi: to support valiable sleep value when !IsActive
15201519 // #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();
15311521 //---------------------
15321522 #endregion
15331523
@@ -1777,6 +1767,7 @@
17771767 this.listトップレベルActivities.Add( stage結果 );
17781768 this.listトップレベルActivities.Add( stageChangeSkin );
17791769 this.listトップレベルActivities.Add( stage終了 );
1770+ this.listトップレベルActivities.Add( actFlushGPU );
17801771 //---------------------
17811772 #endregion
17821773 #region [ プラグインの検索と生成 ]
--- branches/120724(DTXMania with #24820)/DTXManiaプロジェクト/コード/全体/CActFlushGPU.cs (nonexistent)
+++ branches/120724(DTXMania with #24820)/DTXManiaプロジェクト/コード/全体/CActFlushGPU.cs (revision 480)
@@ -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+}
Show on old repository browser