1

作为优化,我决定在全局范围内放置一个我经常需要的对象 - 具有整个关卡的预渲染图像的 SDL 表面(称为 S_AreaBMP)。
现在不必每帧都在 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

您基本上是在全局范围内创建一个静态变量。这样做在技术上没有什么不正确的,但是使用像Singleton 模式这样的东西来包装它通常是一个更好的选择。这将使控制对它的访问变得更容易,并且可能更容易以提供更好的线程安全性、封装此逻辑等的方式包装资源。

于 2009-09-03T19:48:59.480 回答
0

线程安全将是我最关心的问题。特别是,如果 PrepareAreaImage 已经在执行时被调用,或者在 PrepareAreaImage() 执行期间的某个时间访问了 S_AreaBMP,会发生什么情况。

于 2009-09-03T20:05:26.477 回答