• R/O
  • SSH
  • HTTPS

dtxmaniaxg-verk: Commit


Commit MetaInfo

Revision574 (tree)
Time2019-04-27 00:19:46
Authorkairera0467

Log Message

#35379 テクスチャの致命的な解放漏れを修正
#xxxxx 曲選択画面で選択中の曲を移動した時に一部の変数が初期化されていなかったのを修正
#xxxxx DTXMania rev:693bf14b0d83efc770235c788117190d08a4e531の変更(CTextureの解放漏れログ)を取り込み

Change Summary

Incremental Difference

--- trunk/DTXManiaプロジェクト/コード/ステージ/05.選曲/CActSelectステータスパネル.cs (revision 573)
+++ trunk/DTXManiaプロジェクト/コード/ステージ/05.選曲/CActSelectステータスパネル.cs (revision 574)
@@ -158,9 +158,13 @@
158158 this.b現在選択中の曲がフルコンボ難易度毎[j][i] = c曲リストノード.arスコア[j].譜面情報.フルコンボ[i];
159159 this.b現在選択中の曲に譜面がある[j][i] = c曲リストノード.arスコア[j].譜面情報.b譜面がある[i];
160160 }
161- else
161+ else //2018.03.18 kairera0467 #38056
162162 {
163+ this.n現在選択中の曲のレベル難易度毎DGB[j][i] = 0;
164+ this.n現在選択中の曲のレベル小数点難易度毎DGB[j][i] = 0;
165+ this.n現在選択中の曲の最高ランク難易度毎[j][i] = 99;
163166 this.b現在選択中の曲がフルコンボ難易度毎[j][i] = false;
167+ this.b現在選択中の曲に譜面がある[j][i] = false;
164168 }
165169 }
166170 }
--- trunk/DTXManiaプロジェクト/コード/ステージ/05.選曲/CActSelect曲リスト.cs (revision 573)
+++ trunk/DTXManiaプロジェクト/コード/ステージ/05.選曲/CActSelect曲リスト.cs (revision 574)
@@ -486,10 +486,35 @@
486486 }
487487 this.On非活性化();
488488 this.r現在選択中の曲 = null;
489- this.On活性化();
490- }
489+ //this.On活性化();
490+ #region[ 再度活性化処理を行う ]
491+ this.b登場アニメ全部完了 = false;
492+ this.n目標のスクロールカウンタ = 0;
493+ this.n現在のスクロールカウンタ = 0;
494+ this.nスクロールタイマ = -1;
491495
496+ // フォント作成。
497+ // 曲リスト文字は2倍(面積4倍)でテクスチャに描画してから縮小表示するので、フォントサイズは2倍とする。
498+ if( this.ft曲リスト用フォント == null )
499+ {
500+ FontStyle regular = FontStyle.Regular;
501+ if( CDTXMania.ConfigIni.b選曲リストフォントを太字にする ) regular |= FontStyle.Bold;
502+ this.ft曲リスト用フォント = new Font( CDTXMania.ConfigIni.str選曲リストフォント, (float) ( CDTXMania.ConfigIni.n選曲リストフォントのサイズdot * 2 ), regular, GraphicsUnit.Pixel );
503+ //this.prvFont = new CPrivateFont( new FontFamily( CDTXMania.ConfigIni.str選曲リストフォント ), 28, FontStyle.Regular );
504+ }
492505
506+ if( ( this.r現在選択中の曲 == null ) && ( CDTXMania.Songs管理.list曲ルート.Count > 0 ) )
507+ this.r現在選択中の曲 = CDTXMania.Songs管理.list曲ルート[ 0 ];
508+ if( CDTXMania.r現在のステージ.eステージID == CStage.Eステージ.選曲 )
509+ this.tバーの初期化();
510+
511+ //base.On活性化();
512+
513+ this.t選択曲が変更された(true); // #27648 2012.3.31 yyagi 選曲画面に入った直後の 現在位置/全アイテム数 の表示を正しく行うため
514+ #endregion
515+ }
516+
517+
493518 /// <summary>
494519 /// 現在選曲している位置を検索する
495520 /// (曲一覧クラスを新しいものに入れ替える際に用いる)
@@ -564,12 +589,14 @@
564589
565590 // フォント作成。
566591 // 曲リスト文字は2倍(面積4倍)でテクスチャに描画してから縮小表示するので、フォントサイズは2倍とする。
592+ if( this.ft曲リスト用フォント == null )
593+ {
594+ FontStyle regular = FontStyle.Regular;
595+ if( CDTXMania.ConfigIni.b選曲リストフォントを太字にする ) regular |= FontStyle.Bold;
596+ this.ft曲リスト用フォント = new Font( CDTXMania.ConfigIni.str選曲リストフォント, (float) ( CDTXMania.ConfigIni.n選曲リストフォントのサイズdot * 2 ), regular, GraphicsUnit.Pixel );
597+ //this.prvFont = new CPrivateFont( new FontFamily( CDTXMania.ConfigIni.str選曲リストフォント ), 28, FontStyle.Regular );
598+ }
567599
568- FontStyle regular = FontStyle.Regular;
569- if( CDTXMania.ConfigIni.b選曲リストフォントを太字にする ) regular |= FontStyle.Bold;
570- this.ft曲リスト用フォント = new Font( CDTXMania.ConfigIni.str選曲リストフォント, (float) ( CDTXMania.ConfigIni.n選曲リストフォントのサイズdot * 2 ), regular, GraphicsUnit.Pixel );
571- //this.prvFont = new CPrivateFont( new FontFamily( CDTXMania.ConfigIni.str選曲リストフォント ), 28, FontStyle.Regular );
572-
573600 // 現在選択中の曲がない(=はじめての活性化)なら、現在選択中の曲をルートの先頭ノードに設定する。
574601
575602 if( ( this.r現在選択中の曲 == null ) && ( CDTXMania.Songs管理.list曲ルート.Count > 0 ) )
@@ -603,11 +630,11 @@
603630 if( this.b活性化してない )
604631 return;
605632
606- this.tx選曲パネル = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_image_panel_guitar.png" ) );
633+ if ( this.tx選曲パネル == null && CDTXMania.ConfigIni.bDrums有効 )
634+ this.tx選曲パネル = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_image_panel.png" ) );
635+ else if( this.tx選曲パネル == null && CDTXMania.ConfigIni.bGuitar有効 )
636+ this.tx選曲パネル = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_image_panel_guitar.png" ) );
607637
608- if ( this.tx選曲パネル == null || CDTXMania.ConfigIni.bDrums有効 )
609- this.tx選曲パネル = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_image_panel.png"));
610-
611638 this.txパネル = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_music panel.png"));
612639 //this.tx帯 = CDTXMania.tテクスチャの生成Af( CSkin.Path( @"Graphics\5_backpanel.png" ) );
613640 this.txパネル帯 = CDTXMania.tテクスチャの生成Af( CSkin.Path( @"Graphics\5_Backbar.png" ) );
@@ -627,7 +654,7 @@
627654 {
628655 //this.t曲名バーの生成(i, this.stバー情報[i].strタイトル文字列, this.stバー情報[i].col文字色);
629656 this.tアーティスト名テクスチャの生成( i, this.stバー情報[ i ].strアーティスト名 );
630- this.tパネルの生成( i, this.stバー情報[ i ].strタイトル文字列, this.stバー情報[ i ].strアーティスト名, this.stバー情報[ i ].col文字色 );
657+ //this.tパネルの生成( i, this.stバー情報[ i ].strタイトル文字列, this.stバー情報[ i ].strアーティスト名, this.stバー情報[ i ].col文字色 );
631658 //this.tパスを指定してサムネイル画像を生成する(i, this.stバー情報[i].strDTXフォルダのパス, this.stバー情報[i].eバー種別);
632659 if( this.stバー情報[ i ].strPreimageのパス != null )
633660 {
@@ -710,6 +737,7 @@
710737
711738 for ( int i = 0; i < 15; i++ )
712739 {
740+ CDTXMania.t安全にDisposeする( ref this.stバー情報[ i ].txパネル );
713741 CDTXMania.t安全にDisposeする( ref this.stバー情報[ i ].txタイトル名 );
714742 CDTXMania.t安全にDisposeする( ref this.stバー情報[ i ].txアーティスト名 );
715743 CDTXMania.t安全にDisposeする( ref this.stバー情報[ i ].txカスタム曲名テクスチャ );
@@ -918,16 +946,8 @@
918946 this.n目標のスクロールカウンタ -= 100;
919947
920948 this.t選択曲が変更された( false ); // スクロールバー用に今何番目を選択しているかを更新
921- if( this.tx選択されている曲の曲名 != null )
922- {
923- this.tx選択されている曲の曲名.Dispose();
924- this.tx選択されている曲の曲名 = null;
925- }
926- if( this.tx選択されている曲のアーティスト名 != null )
927- {
928- this.tx選択されている曲のアーティスト名.Dispose();
929- this.tx選択されている曲のアーティスト名 = null;
930- }
949+ CDTXMania.t安全にDisposeする( ref this.tx選択されている曲の曲名 );
950+ CDTXMania.t安全にDisposeする( ref this.tx選択されている曲のアーティスト名 );
931951
932952 if( this.n目標のスクロールカウンタ == 0 )
933953 CDTXMania.stage選曲.t選択曲変更通知(); // スクロール完了=選択曲変更!
@@ -997,16 +1017,8 @@
9971017
9981018
9991019 this.t選択曲が変更された( false ); // スクロールバー用に今何番目を選択しているかを更新
1000- if( this.tx選択されている曲の曲名 != null )
1001- {
1002- this.tx選択されている曲の曲名.Dispose();
1003- this.tx選択されている曲の曲名 = null;
1004- }
1005- if( this.tx選択されている曲のアーティスト名 != null )
1006- {
1007- this.tx選択されている曲のアーティスト名.Dispose();
1008- this.tx選択されている曲のアーティスト名 = null;
1009- }
1020+ CDTXMania.t安全にDisposeする( ref this.tx選択されている曲の曲名 );
1021+ CDTXMania.t安全にDisposeする( ref this.tx選択されている曲のアーティスト名 );
10101022
10111023 if( this.n目標のスクロールカウンタ == 0 )
10121024 CDTXMania.stage選曲.t選択曲変更通知(); // スクロール完了=選択曲変更!
@@ -1840,7 +1852,12 @@
18401852
18411853 this.stバー情報[ i ].strDTXフォルダのパス = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].ファイル情報.フォルダの絶対パス;
18421854 this.stバー情報[ i ].strPreimageのパス = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].ファイル情報.フォルダの絶対パス + song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.Preimage;
1843- this.tパネルの生成(i, song.strタイトル, this.stバー情報[ i ].strアーティスト名, song.col文字色);
1855+
1856+ // 2019.4.26 kairera0467 バーの初期化は複数回行われる場合があるので、再構築する時には一度解放してから構築するほうが解放漏れは少なくなるはず。
1857+ CDTXMania.tテクスチャの解放( ref this.stバー情報[ i ].txパネル );
1858+ CDTXMania.tテクスチャの解放( ref this.txTumbnail[ i ] );
1859+
1860+ this.tパネルの生成( i, song.strタイトル, this.stバー情報[ i ].strアーティスト名, song.col文字色 );
18441861 if( this.stバー情報[ i ].strPreimageのパス != null )
18451862 {
18461863 if( !this.dicThumbnail.ContainsKey( this.stバー情報[ i ].strPreimageのパス ) )
@@ -1869,14 +1886,15 @@
18691886 {
18701887 //if ( this.stバー情報[ nバー番号 ].eバー種別 == Eバー種別.Score || this.stバー情報[ nバー番号 ].eバー種別 == Eバー種別.Box)
18711888 {
1872- if (!File.Exists(strDTXPath))
1873- {
1874- this.txTumbnail[nバー番号] = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_preimage default.png"), false);
1875- }
1876- else
1877- {
1878- this.txTumbnail[nバー番号] = CDTXMania.tテクスチャの生成(strDTXPath);
1879- }
1889+ // 2019.04.27 kairera0467 使っていないようなのでコメントアウト
1890+ //if (!File.Exists(strDTXPath))
1891+ //{
1892+ // this.txTumbnail[nバー番号] = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_preimage default.png"), false);
1893+ //}
1894+ //else
1895+ //{
1896+ // this.txTumbnail[nバー番号] = CDTXMania.tテクスチャの生成(strDTXPath);
1897+ //}
18801898 }
18811899 //else if( this.stバー情報[ nバー番号 ].eバー種別 == Eバー種別.Random)
18821900 //{
--- trunk/DTXManiaプロジェクト/コード/ステージ/07.演奏/ドラム画面/CAct演奏DrumsチップファイアD.cs (revision 573)
+++ trunk/DTXManiaプロジェクト/コード/ステージ/07.演奏/ドラム画面/CAct演奏DrumsチップファイアD.cs (revision 574)
@@ -514,10 +514,10 @@
514514 {
515515 if( !base.b活性化してない )
516516 {
517- for (int tx1 = 0; tx1 < 9; tx1++)
517+ for (int tx1 = 0; tx1 < 10; tx1++)
518518 {
519- CDTXMania.tテクスチャの解放(ref this.tx火花[tx1]);
520- CDTXMania.tテクスチャの解放(ref this.tx青い星[tx1]);
519+ CDTXMania.tテクスチャの解放( ref this.tx火花[tx1] );
520+ CDTXMania.tテクスチャの解放( ref this.tx青い星[tx1] );
521521 }
522522 CDTXMania.tテクスチャの解放( ref this.tx大波 );
523523 CDTXMania.tテクスチャの解放( ref this.tx細波 );
--- trunk/DTXManiaプロジェクト/コード/ステージ/08.結果/CActResultImage.cs (revision 573)
+++ trunk/DTXManiaプロジェクト/コード/ステージ/08.結果/CActResultImage.cs (revision 574)
@@ -262,6 +262,7 @@
262262 CDTXMania.tテクスチャの解放( ref this.tx曲名 );
263263 CDTXMania.tテクスチャの解放( ref this.r表示するリザルト画像 );
264264 //CDTXMania.tテクスチャの解放( ref this.txSongLevel );
265+ CDTXMania.tテクスチャの解放( ref this.txLevel );
265266
266267 base.OnManagedリソースの解放();
267268 }
--- trunk/DTXManiaプロジェクト/コード/ステージ/08.結果/CActResultRank.cs (revision 573)
+++ trunk/DTXManiaプロジェクト/コード/ステージ/08.結果/CActResultRank.cs (revision 574)
@@ -169,7 +169,9 @@
169169 {
170170 CDTXMania.tテクスチャの解放( ref this.txFullCombo );
171171 CDTXMania.tテクスチャの解放( ref this.txExcellent );
172- CDTXMania.t安全にDisposeする( ref this.txランク文字 );
172+ CDTXMania.t安全にDisposeする( ref this.txランク文字.Drums );
173+ CDTXMania.t安全にDisposeする( ref this.txランク文字.Guitar );
174+ CDTXMania.t安全にDisposeする( ref this.txランク文字.Bass );
173175 base.OnManagedリソースの解放();
174176 }
175177 }
--- trunk/DTXManiaプロジェクト/コード/ステージ/CActFIFOBlackStart.cs (revision 573)
+++ trunk/DTXManiaプロジェクト/コード/ステージ/CActFIFOBlackStart.cs (revision 574)
@@ -30,6 +30,7 @@
3030 if( !base.b活性化してない )
3131 {
3232 CDTXMania.tテクスチャの解放( ref this.tx黒タイル64x64 );
33+ CDTXMania.tテクスチャの解放( ref this.tx黒幕 );
3334 base.On非活性化();
3435 }
3536 }
--- trunk/FDK17プロジェクト/コード/04.グラフィック/CTexture.cs (revision 573)
+++ trunk/FDK17プロジェクト/コード/04.グラフィック/CTexture.cs (revision 574)
@@ -66,6 +66,7 @@
6666 protected set;
6767 }
6868 public Vector3 vc拡大縮小倍率;
69+ public string filename;
6970
7071 // 画面が変わるたび以下のプロパティを設定し治すこと。
7172
@@ -86,10 +87,12 @@
8687 this.szテクスチャサイズ = new Size( 0, 0 );
8788 this._透明度 = 0xff;
8889 this.texture = null;
90+ this.bSlimDXTextureDispose完了済み = true;
8991 this.cvPositionColoredVertexies = null;
9092 this.b加算合成 = false;
9193 this.fZ軸中心回転 = 0f;
9294 this.vc拡大縮小倍率 = new Vector3( 1f, 1f, 1f );
95+ this.filename = ""; // DTXMania rev:693bf14b0d83efc770235c788117190d08a4e531
9396 // this._txData = null;
9497 }
9598
@@ -120,6 +123,7 @@
120123 stream.Seek( 0L, SeekOrigin.Begin );
121124 int colorKey = unchecked( (int) 0xFF000000 );
122125 this.texture = Texture.FromStream( device, stream, this.szテクスチャサイズ.Width, this.szテクスチャサイズ.Height, 1, Usage.None, format, poolvar, Filter.Point, Filter.None, colorKey );
126+ this.bSlimDXTextureDispose完了済み = false;
123127 }
124128 }
125129 catch ( Exception e )
@@ -213,6 +217,7 @@
213217 #endif
214218 // 中で更にメモリ読み込みし直していて無駄なので、Streamを使うのは止めたいところ
215219 this.texture = Texture.FromStream( device, stream, n幅, n高さ, 1, usage, format, pool, Filter.Point, Filter.None, 0 );
220+ this.bSlimDXTextureDispose完了済み = false;
216221 }
217222 }
218223 }
@@ -247,6 +252,7 @@
247252 throw new FileNotFoundException( string.Format( "ファイルが存在しません。\n[{0}]", strファイル名 ) );
248253
249254 Byte[] _txData = File.ReadAllBytes( strファイル名 );
255+ this.filename = Path.GetFileName( strファイル名 );
250256 MakeTexture( device, _txData, format, b黒を透過する, pool );
251257 }
252258
@@ -272,6 +278,7 @@
272278 // {
273279 //Trace.TraceInformation( "CTexture() start: " );
274280 this.texture = Texture.FromMemory( device, txData, this.sz画像サイズ.Width, this.sz画像サイズ.Height, 1, Usage.None, format, pool, Filter.Point, Filter.None, colorKey );
281+ this.bSlimDXTextureDispose完了済み = false;
275282 //Trace.TraceInformation( "CTexture() end: " );
276283 // }
277284 }
@@ -337,6 +344,7 @@
337344 #endif
338345 texture.UnlockRectangle( 0 );
339346 bitmap.UnlockBits( srcBufData );
347+ this.bSlimDXTextureDispose完了済み = false;
340348 }
341349 //Trace.TraceInformation( "CTExture() End: " );
342350 }
@@ -738,17 +746,40 @@
738746 //-----------------
739747 public void Dispose()
740748 {
741- if( !this.bDispose完了済み )
749+ this.Dispose(true);
750+ GC.SuppressFinalize(this);
751+ }
752+ protected void Dispose(bool disposeManagedObjects)
753+ {
754+ if (this.bDispose完了済み)
755+ return;
756+
757+ if (disposeManagedObjects)
742758 {
743- // テクスチャの破棄
744- if( this.texture != null )
759+ // (A) Managed リソースの解放
760+ // テクスチャの破棄 (SharpDXのテクスチャは、SharpDX側で管理されるため、FDKからはmanagedリソースと見做す)
761+ if (this.texture != null)
745762 {
746763 this.texture.Dispose();
747764 this.texture = null;
765+ this.bSlimDXTextureDispose完了済み = true;
748766 }
767+ }
749768
750- this.bDispose完了済み = true;
769+ // (B) Unamanaged リソースの解放
770+
771+
772+ this.bDispose完了済み = true;
773+ }
774+ ~CTexture()
775+ {
776+ // ファイナライザの動作時にtextureのDisposeがされていない場合は、
777+ // CTextureのDispose漏れと見做して警告をログ出力する
778+ if (!this.bSlimDXTextureDispose完了済み)
779+ {
780+ Trace.TraceWarning("CTexture: Dispose漏れを検出しました。(Size=({0}, {1}), filename={2})", sz画像サイズ.Width, sz画像サイズ.Height, filename );
751781 }
782+ this.Dispose(false);
752783 }
753784 //-----------------
754785 #endregion
@@ -759,7 +790,7 @@
759790 #region [ private ]
760791 //-----------------
761792 private int _透明度;
762- private bool bDispose完了済み;
793+ private bool bDispose完了済み, bSlimDXTextureDispose完了済み;
763794 private PositionColoredTexturedVertex[] cvPositionColoredVertexies;
764795 protected TransformedColoredTexturedVertex[] cvTransformedColoredVertexies = new TransformedColoredTexturedVertex[]
765796 {
Show on old repository browser