簡體   English   中英

重用對象實例與每次更新創建新對象

[英]Reusing instances of objects vs creating new ones with every update

每次交換緩沖區時,重用對象實例與創建新實例之間的差異和缺陷是什么?

背景:

這是我的游戲引擎項目。

我正在編寫一個TripleBuffer ,其中我有三個版本的每個對象: 舊版本當前版本未來版本 將通過從當前版本讀取狀態並將更改應用於將來的版本來對這些對象進行更改。 在對所有對象(如果適用)進行更改之后,將交換緩沖區:將來的對象成為當前對象,當前對象成為舊對象,還是舊對象?

  • 要么被丟棄,要通過迭代現在的對象來分配新對象
  • 或者成為現在的未來對象,並通過迭代現在的對象來更新它們的值(重新覆蓋)。

說明:

  • “重用”:用新值覆蓋舊實例的值,有效地改變實例的狀態
  • “new ones / cloning”:使用舊實例的數據創建新實例,並對其應用更改

使用案例:

假設大約1000個對象以30Hz交換,這意味着它們需要每秒重建30次,方法是克隆現有的對象,或者重用現在過時的舊對象(覆蓋其所有狀態)。

它們的復雜程度可以從大約5個屬性到數百個屬性,並且總是具有至少2個級別深度

深度至少為2級 =緩沖對象本身只包含其他唯一對象的地圖,這些對象組成了它們)

重新創建和重用都需要迭代當前對象及其組件 (短於: 反過來構成它們的對象 )。

進一步考慮:

在引擎的其他部分,將有事件觸發和其他魔法,它們將使用對象的及時快照。 因此,重新創建或重用的決定將導致:

  • 重新創建意味着我可以安全地傳遞對象的引用,因為對象在成為當前對象時將變為不可變
  • 重用意味着我將不得不創建當前對象的副本或我需要的任何部分的副本,因為我不能保證在對象被重用之前將處理事件(或其他)

除非您有充分的理由不這樣做,否則丟棄舊對象並創建新對象。

這將減少您遇到各種錯誤的機會。 例如,如果在其他地方有對舊對象的引用,則重新使用它可能會產生不良副作用。 丟棄和創建新對象在概念上更清晰,可能使代碼更易於閱讀,調試和維護。

在一般情況下,垃圾收集器也足夠聰明,可以丟棄並重新創建不那么昂貴的對象。

在這種情況下我要做的是編寫最清晰,最直接的代碼,這意味着在需要時創建一個新對象。 然后我會測試它,看看這是否是一個性能瓶頸,只有它是,我會看優化。 換句話說,我會盡量避免過早優化

在圖形中使用緩沖區,以便在嘗試更新時不會逐個像素地“繪制”到屏幕。 相反,您繪制到緩沖區,然后您可以一次交換整個圖像。

我假設你使用緩沖區有類似的原因。 在處理它們時,您不希望使用新更新的對象修改“當前”對象,因為它會破壞當前對象的“圖像”。

重用的好處:

  • 您不會丟棄盡可能多的內存,需要更少的垃圾回收
  • 您只需要更新已更改的對象

重新創造的優勢

  • 必須創建每個對象
  • 更簡單,更清潔

您的最終決定將基於性能與清晰度。 重新創建所有對象有多貴? 比較每個對象並僅構建所需的對象更便宜嗎?

即使比較對象或跟蹤哪些已經發生變化更便宜,但為了更加簡單,創建新的成本可能是值得的,這正是@ DaphnaShezaf的答案所在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM