1

最適化として、頻繁に必要とするオブジェクト (レベル全体のレンダリング済みイメージ (S_AreaBMP と呼ばれる) を持つ SDL サーフェス) をグローバル スコープに配置することにしました。
これで、フレームごとに DrawScreen 関数で作成および破棄する必要がなくなりました。新しいレベルまたは GFX シートがロードされたときにのみ破棄して変更する必要があります。これは、次の関数を使用して行います。

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 はグローバル スコープです)

質問:これは根本的に健全ですか?

それはうまく機能しますが、私はこの種のことが落胆しているように感じずにはいられません...

4

2 に答える 2

1

基本的に、グローバルスコープで静的変数を作成しています。これを行うのに技術的に間違っていることは何もありませんが、通常、シングルトンパターンのようなものを使用してこれをラップする方が良いオプションです。これにより、これへのアクセスの制御が容易になり、スレッドセーフの向上、このロジックのカプセル化などを提供する方法でリソースをラップすることが容易になる可能性があります。

于 2009-09-03T19:48:59.480 に答える
0

スレッドの安全性は私の最大の関心事です。特に、既に実行されているときに PrepareAreaImage が呼び出されたり、PrepareAreaImage() の実行中に S_AreaBMP がアクセスされたりするとどうなりますか。

于 2009-09-03T20:05:26.477 に答える