2009-09-03 43 views
1

作为一种优化,我决定将一个我经常需要的对象 - 一个SDL表面与全局级的预渲染图像(称为S_AreaBMP) - 放在全局范围内。
现在,它不必在每个画面的DrawScreen函数中创建和销毁。我只需要配置和更改它,当一个新的水平或GFX片装,这是我通过这个功能做的事:VB/C#:在全球范围内放置可处理对象:这样好吗?

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是一项成本高昂的操作? Dispose正在做一些清理,但并不一定是昂贵的。无法看到每帧一次新配置/配置如何以任何方式影响性能。特别是在避免它弄乱代码时。 – adrianm 2009-09-03 20:29:48

+0

糟糕,我被混淆了。我回头看看给了我印象的页面,它有一个昂贵的Finalize方法,而不是Dispose。我会适当地解决这个问题。 – 2009-09-03 20:47:23

回答

1

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

+0

我知道你在说什么,但我希望GoF从未写过关于Singleton的文章。每个人和他们的狗都认为这是解决他们的静态变量问题。 – 2009-09-03 20:11:27

+0

是的 - 我同意,但有时单身人士至少有一些意义。在这种情况下,它可能会被重构为以某种形式的高级屏幕类来保存位图,但这超出了问题的范围。我认为singleton比单一的静态全局更好,因为你至少可以提供一些控制和线程同步。 – 2009-09-03 20:14:59

0

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