Skip to content

Commit

Permalink
メモリリークのさらなる対策
Browse files Browse the repository at this point in the history
テクスチャが解放されていない状態で同じオブジェクトにテクスチャを読み込んでいる箇所を、一度解放してから読み込むように修正
OnManagedリソース生成メソッドに2回侵入している場所があったので修正
ノート番号の表示条件を「DEBUGビルドでかつ演奏情報を表示している」に変更
readme.txtの加筆、また一部項目の位置を変更
  • Loading branch information
kairera0467 committed May 3, 2018
1 parent d6a09bd commit 49491d4
Show file tree
Hide file tree
Showing 28 changed files with 566 additions and 507 deletions.
2 changes: 2 additions & 0 deletions DTXManiaプロジェクト/DTXManiaプロジェクト.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<NoWarn>0219</NoWarn>
<UseVSHostingProcess>false</UseVSHostingProcess>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<OutputPath>bin\x86\Release\</OutputPath>
Expand All @@ -61,6 +62,7 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<NoWarn>0219</NoWarn>
<UseVSHostingProcess>true</UseVSHostingProcess>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="DirectShowLib-2005, Version=2.1.0.0, Culture=neutral, PublicKeyToken=67e7b740cdfc2d3f, processorArchitecture=MSIL">
Expand Down
9 changes: 6 additions & 3 deletions DTXManiaプロジェクト/Properties/Resources.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions DTXManiaプロジェクト/Properties/Settings.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ public override int On進行描画()
this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );

#region[ バージョン表示 ]
string strVersion = "KTT:J:A:I:2018040600";
string strVersion = "KTT:J:A:I:2018050300";
#if DEBUG
strVersion += " DEBUG";
#endif
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1542,6 +1542,8 @@ public override void OnManagedリソースの解放()
CDTXMania.tテクスチャの解放( ref this.tx通常項目行パネル );
CDTXMania.tテクスチャの解放( ref this.txその他項目行パネル );
CDTXMania.tテクスチャの解放( ref this.tx三角矢印 );

this.OnListMenuの解放(); //2018.04.29 kairera0467 設定画面から抜ける時にテクスチャ解放しておく(本体終了時に解放するだけでもいいのですが...)

base.OnManagedリソースの解放();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,21 @@ public void Initialize( List<CItemBase> menulist, bool showAllItems, string titl
n現在の選択行 = defaultPos;
}

public void finallize() //2018.04.29 kairera0467 テスト。終了時の解放漏れ防止用(コンストラクタでInitializeが行われているので選曲に行かないと一部オブジェクトが開放されずに終わる)
{
if( this.lciMenuItems != null )
{
for( int i = 0; i < this.lciMenuItems.Length; i++ )
{
CDTXMania.t安全にDisposeする( ref this.lciMenuItems[ i ].txName );
this.lciMenuItems[ i ].cItem = null;
}
}
CDTXMania.t安全にDisposeする( ref this.prvFont );
CDTXMania.t安全にDisposeする( ref this.font );
this.stqMenuTitle.cItem = null;
CDTXMania.t安全にDisposeする( ref this.stqMenuTitle.txName );
}

public void tEnter押下()
{
Expand Down Expand Up @@ -206,6 +221,7 @@ public override void On非活性化()
{
this.ctキー反復用[ i ] = null;
}
this.finallize();
base.On非活性化();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -304,10 +304,10 @@ public bool tBOXを出る()
public void t現在選択中の曲を元に曲バーを再構成する()
{
this.tバーの初期化();
for( int i = 0; i < 13; i++ )
{
this.t曲名バーの生成( i, this.stバー情報[ i ].strタイトル文字列, this.stバー情報[ i ].col文字色 );
}
//for( int i = 0; i < 13; i++ )
//{
// this.t曲名バーの生成( i, this.stバー情報[ i ].strタイトル文字列, this.stバー情報[ i ].col文字色 );
//}
}
public void t次に移動()
{
Expand Down Expand Up @@ -438,6 +438,8 @@ public void Refresh(CSongs管理 cs, bool bRemakeSongTitleBar ) // #26070 2012.
if ( cs != null && cs.list曲ルート.Count > 0 ) // 新しい曲リストを検索して、1曲以上あった
{
CDTXMania.Songs管理 = cs;
if( CDTXMania.r現在のステージ.eステージID == CStage.Eステージ.選曲 )
this.On活性化();

if ( this.r現在選択中の曲 != null ) // r現在選択中の曲==null とは、「最初songlist.dbが無かった or 検索したが1曲もない」
{
Expand All @@ -462,7 +464,7 @@ public void Refresh(CSongs管理 cs, bool bRemakeSongTitleBar ) // #26070 2012.
}
this.On非活性化();
this.r現在選択中の曲 = null;
this.On活性化();
//this.On活性化();
}


Expand Down Expand Up @@ -610,12 +612,6 @@ public override void OnManagedリソースの作成()
this.txカーソル左 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_cursor left.png" ) );
this.txカーソル右 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_cursor right.png" ) );

for( int i = 0; i < 13; i++ )
{
this.t曲名バーの生成( i, this.stバー情報[ i ].strタイトル文字列, this.stバー情報[ i ].col文字色 );
this.stバー情報[ i ].txタイトル = this.t曲名テクスチャを生成する( this.stバー情報[ i ].strタイトル文字列 );
}

int c = ( CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja" ) ? 0 : 1;
#region [ Songs not found画像 ]
try
Expand Down Expand Up @@ -682,9 +678,10 @@ public override void OnManagedリソースの解放()

for( int i = 0; i < 13; i++ )
{
CDTXMania.t安全にDisposeする( ref this.stバー情報[ i ].txタイトル名 );
CDTXMania.t安全にDisposeする( ref this.stバー情報[ i ].txタイトル );
}
CDTXMania.t安全にDisposeする( ref this.tx選択している曲の曲名 );
CDTXMania.t安全にDisposeする( ref this.tx選択している曲のサブタイトル );

//CDTXMania.t安全にDisposeする( ref this.txスキル数字 );
CDTXMania.t安全にDisposeする( ref this.txEnumeratingSongs );
Expand Down Expand Up @@ -867,7 +864,6 @@ public override int On進行描画()
this.stバー情報[ index ].strジャンル = song.strジャンル;
this.stバー情報[ index ].strサブタイトル = song.strサブタイトル;
this.stバー情報[ index ].ar難易度 = song.nLevel;
this.t曲名バーの生成( index, this.stバー情報[ index ].strタイトル文字列, this.stバー情報[ index ].col文字色 );
for( int f = 0; f < 5; f++ )
{
if( song.arスコア[ f ] != null )
Expand All @@ -886,8 +882,8 @@ public override int On進行描画()
int n = ( ( ( this.n現在の選択行 - 5 ) + i ) + 13 ) % 13;
this.stバー情報[ n ].eバー種別 = this.e曲のバー種別を返す( song2 );
song2 = this.r次の曲( song2 );
CDTXMania.t安全にDisposeする( ref this.stバー情報[ i ].txタイトル );
this.stバー情報[ i ].txタイトル = this.t曲名テクスチャを生成する( this.stバー情報[ i ].strタイトル文字列 );

}


Expand Down Expand Up @@ -944,7 +940,6 @@ public override int On進行描画()
this.stバー情報[ index ].strサブタイトル = song.strサブタイトル;
this.stバー情報[ index ].strジャンル = song.strジャンル;
this.stバー情報[ index ].ar難易度 = song.nLevel;
this.t曲名バーの生成( index, this.stバー情報[ index ].strタイトル文字列, this.stバー情報[ index ].col文字色 );
for( int f = 0; f < 5; f++ )
{
if( song.arスコア[ f ] != null )
Expand All @@ -962,6 +957,7 @@ public override int On進行描画()
int n = ( ( ( this.n現在の選択行 - 5 ) + i ) + 13 ) % 13;
this.stバー情報[ n ].eバー種別 = this.e曲のバー種別を返す( song2 );
song2 = this.r次の曲( song2 );
CDTXMania.t安全にDisposeする( ref this.stバー情報[ i ].txタイトル );
this.stバー情報[ i ].txタイトル = this.t曲名テクスチャを生成する( this.stバー情報[ i ].strタイトル文字列 );
}

Expand Down Expand Up @@ -1449,10 +1445,7 @@ public override int On進行描画()
if( this.tx上部ジャンル名 != null )
this.tx上部ジャンル名.t2D描画( CDTXMania.app.Device, 496, 63, new Rectangle( 0, 60 * this.nStrジャンルtoNum( this.r現在選択中の曲.strジャンル ), 288, 60 ) );
}





return 0;
}

Expand Down Expand Up @@ -1510,7 +1503,6 @@ private struct STバー情報
{
public CActSelect曲リスト.Eバー種別 eバー種別;
public string strタイトル文字列;
public CTexture txタイトル名;
public STDGBVALUE<int> nスキル値;
public Color col文字色;
public int[] ar難易度;
Expand Down Expand Up @@ -1756,6 +1748,7 @@ private void tバーの初期化()
for( int j = 0; j < 3; j++ )
this.stバー情報[ i ].nスキル値[ j ] = (int) song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.最大スキル[ j ];

CDTXMania.t安全にDisposeする( ref this.stバー情報[ i ].txタイトル );
this.stバー情報[ i ].txタイトル = this.t曲名テクスチャを生成する( this.stバー情報[ i ].strタイトル文字列 );

song = this.r次の曲( song );
Expand Down Expand Up @@ -1897,7 +1890,7 @@ private CTexture t曲名テクスチャを生成する( string str文字 )
{
Bitmap bmp;

bmp = pfMusicName.DrawPrivateFont( str文字, Color.White, Color.Black, true );
bmp = this.pfMusicName.DrawPrivateFont( str文字, Color.White, Color.Black, true );

CTexture tx文字テクスチャ = CDTXMania.tテクスチャの生成( bmp, false );

Expand All @@ -1906,15 +1899,15 @@ private CTexture t曲名テクスチャを生成する( string str文字 )
tx文字テクスチャ.vc拡大縮小倍率.Y = (float)( 380.0f / tx文字テクスチャ.szテクスチャサイズ.Height );
}

bmp.Dispose();
CDTXMania.t安全にDisposeする( ref bmp );

return tx文字テクスチャ;
}
private CTexture tサブタイトルテクスチャを生成する( string str文字 )
{
Bitmap bmp;

bmp = pfSubtitle.DrawPrivateFont( str文字, Color.White, Color.Black, true );
bmp = this.pfSubtitle.DrawPrivateFont( str文字, Color.White, Color.Black, true );

CTexture tx文字テクスチャ = CDTXMania.tテクスチャの生成( bmp, false );

Expand All @@ -1928,58 +1921,6 @@ private CTexture tサブタイトルテクスチャを生成する( string str
return tx文字テクスチャ;
}

private void t曲名バーの生成( int nバー番号, string str曲名, Color color )
{
if( nバー番号 < 0 || nバー番号 > 12 )
return;

try
{
SizeF sz曲名;

#region [ 曲名表示に必要となるサイズを取得する。]
//-----------------
using( var bmpDummy = new Bitmap( 1, 1 ) )
{
var g = Graphics.FromImage( bmpDummy );
g.PageUnit = GraphicsUnit.Pixel;
sz曲名 = g.MeasureString( str曲名, this.ft曲リスト用フォント );
}
//-----------------
#endregion

int n最大幅px = 392;
int height = 25;
int width = (int) ( ( sz曲名.Width + 2 ) * 0.5f );
if( width > ( CDTXMania.app.Device.Capabilities.MaxTextureWidth / 2 ) )
width = CDTXMania.app.Device.Capabilities.MaxTextureWidth / 2; // 右端断ち切れ仕方ないよね

float f拡大率X = ( width <= n最大幅px ) ? 0.5f : ( ( (float) n最大幅px / (float) width ) * 0.5f ); // 長い文字列は横方向に圧縮。

using( var bmp = new Bitmap( width * 2, height * 2, PixelFormat.Format32bppArgb ) ) // 2倍(面積4倍)のBitmapを確保。(0.5倍で表示する前提。)
using( var g = Graphics.FromImage( bmp ) )
{
g.TextRenderingHint = TextRenderingHint.AntiAlias;
float y = ( ( ( float ) bmp.Height ) / 2f ) - ( ( CDTXMania.ConfigIni.n選曲リストフォントのサイズdot * 2f ) / 2f );
g.DrawString( str曲名, this.ft曲リスト用フォント, new SolidBrush( this.color文字影 ), (float) 2f, (float) ( y + 2f ) );
g.DrawString( str曲名, this.ft曲リスト用フォント, new SolidBrush( color ), 0f, y );

CDTXMania.t安全にDisposeする( ref this.stバー情報[ nバー番号 ].txタイトル名 );

this.stバー情報[ nバー番号 ].txタイトル名 = new CTexture( CDTXMania.app.Device, bmp, CDTXMania.TextureFormat );
this.stバー情報[ nバー番号 ].txタイトル名.vc拡大縮小倍率 = new Vector3( f拡大率X, 0.5f, 1f );
}

//Bitmap bmpSongTitle = new Bitmap(1, 1);
//bmpSongTitle = pfMusicName.DrawSongNameFont( str曲名, Color.White, Color.Black );
//this.stバー情報[ nバー番号 ].txタイトル名 = new CTexture( CDTXMania.app.Device, bmpSongTitle, CDTXMania.TextureFormat, false );
}
catch( CTextureCreateFailedException )
{
Trace.TraceError( "曲名テクスチャの作成に失敗しました。[{0}]", str曲名 );
this.stバー情報[ nバー番号 ].txタイトル名 = null;
}
}
private void tアイテム数の描画()
{
string s = nCurrentPosition.ToString() + "/" + nNumOfItems.ToString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -797,7 +797,7 @@ public CCounter this[ int index ]
private CActSelect難易度選択画面 act難易度選択画面;

public CActSortSongs actSortSongs;
private CActSelectQuickConfig actQuickConfig;
public CActSelectQuickConfig actQuickConfig;

private bool bBGM再生済み;
private STキー反復用カウンタ ctキー反復用;
Expand Down
Loading

0 comments on commit 49491d4

Please sign in to comment.