2009-09-03 40 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,會發生什麼情況。