2009-09-03 1 views
1

は、私が頻繁に必要とするオブジェクトを置くことを決めました。
今ではDrawScreen機能ですべてのフレームを作成および破棄する必要はありません。私は、私はこの機能を経由して行うれ、新しいレベルやGFXシートがロードされるときに、それを配置し、変更する必要があります。VB/C#:ディスポーザブルオブジェクトをグローバルスコープに配置:これは問題ありませんか? (S_AreaBMP呼ばれる)全体レベルのレンダリング済み画像とSDL表面 - - グローバルスコープに最適化として

Public Sub PrepareAreaImage() 

    ''#dispose old image before it becomes unreferenced 
    If AreaBMPExists 
     S_AreaBMP.Dispose() 
    End If 
    AreaBMPExists = True 

    ''#declare an appropriately sized bitmap w/ a GDI Graphics object 
    Dim AreaBMP As Bitmap = New Bitmap(Area.W * TLDIM, Area.H * TLDIM) 
    Dim AreaGrph As Graphics = Graphics.FromImage(AreaBMP) 

    ''#...(omitted: iterate through Area and draw each tile to AreaBMP) 

    ''#Store to the SDL surface 
    S_AreaBMP = New SdlDotNet.Graphics.Surface(AreaBMP) 

    ''#Dispose 
    AreaBMP.Dispose() 
    AreaGrph.Dispose() 
End Sub 

(AreaBMPExistsとS_AreaBMPはグローバルスコープです)

質問:は、このですが基本的には健全ですか?

あなたは基本的にグローバルスコープで静的変数を作っているそれは正常に動作しますが、私は助けるが、この種のものが推奨されていることを感じることができない...

+0

はなぜ廃棄が高価な操作であると思いますか? Disposeはいくらかのクリーンアップを行っていますが、必ずしも高価ではありません。フレームごとに新しい/廃棄がどのようにパフォーマンスに影響するかを見ることはできません。特にそれを避けると、コードが壊れます。 – adrianm

+0

おっと、私は混ざりました。私はその印象を与えたページを振り返りました。そして、Disposeではなく、コストがかかるFinalizeメソッドを持っています。私は適切に問題を解決します。 –

答えて

1

。これを行うには技術的に間違ったことは何もありませんが、普通はSingleton patternのようなものを使ってこれをラップする方が良いでしょう。これは

+0

私はあなたが言っていることを知っていますが、私はGoFがシングルトンについて書かなかったことを望みます。すべての人とその犬は、静的な変数の問題に対する解決策だと考えています。 –

+0

ええ - 私は同意しますが、シングルトンが少なくともある意味で成立する時があります。この場合、ビットマップを高級スクリーンクラスの何らかの形で保持するためにリファクタリングされている可能性がありますが、これは問題の範囲を超えています。私はシングルトンが単一の静的なグローバルよりもはるかに優れていると思いますが、少なくとも制御とスレッドの同期化を行うことができます。 –

0

スレッドの安全性が私の最大の関心事だろうなど、それが簡単にこれへのアクセスを制御するために行い、潜在的により良いスレッドの安全性を提供する方法でリソースをラップしやすく、このロジックをカプセル化します。特に、PrepareAreaImageがすでに実行されているときにPrepareAreaImageが呼び出されるか、PrepareAreaImage()の実行中にS_AreaBMPがいつかアクセスされるとどうなりますか。