簡體   English   中英

Lua的GC和實時游戲

[英]Lua's GC and realtime game

據我所知,跟蹤GC無法避免在完成GC期間阻塞線程。

我使用過XNA + C#,GC時間無法刪除。 所以我切換到了較低級別的語言C,但我意識到我需要腳本語言。 我在考慮Lua,但我擔心Lua的GC機制。 Lua正在使用增量跟蹤GC,並且線程阻塞也應該如此。

那我該如何在實時游戲中處理這個呢?

Lua的力量在於它不受你的影響。 想上課嗎? 這可以用metatables構建。 想要沙箱嗎? 使用lua_setfenv

至於垃圾收集器。 首先使用它。 如果以后發現性能問題,請使用lua_gc來微調其行為。

一些例子:

  • 在減速會出現問題的那些時候禁用垃圾收集器。

  • 保持垃圾收集器禁用,只有當游戲邏輯說你的FPS計數有一些空間時才會執行它。 您可以預先調整步長,或在運行時發現最佳步長。

  • 禁用收集器並在停止點執行完整收集,即加載屏幕或剪切場景或在熱門座位游戲中輪流更改。

您可能還會考慮使用其他腳本語言。 松鼠非常努力成為第二代Lua。 它試圖保留Lua的所有優點,同時放棄任何設計錯誤。 兩者之間的一個重大區別是松鼠使用引用計數而不是垃圾收集。 事實證明,引用計數可能比垃圾收集慢一點,但它是非常確定的(AKA實時)。

處理這個問題的正確方法是:

  1. 編寫一個小型原型,只包含您想要測試的核心內容。
  2. 詳細介紹它,重現游戲中可能發生的不同場景(可用的內存很多,可用的內存很少,線程的數量不同,那種東西)
  3. 如果您沒有找到可見的瓶頸,可以使用Lua。 否則,您將不得不尋找替代解決方案(可能是Lisp或Javascript)

您可以修補Lua GC,以便限制每個收集周期。 例如: http//www.altdevblogaday.com/2011/07/23/predictable-garbage-collection-with-lua/

我相信在收集非常大的表時,仍然可能有很長的GC步驟時間。 因此,您需要采用避免大表的編程風格。

下面的文章討論了使用Lua進行實時機器人控制的兩種策略(1.不生成垃圾,或者2.使用O(1)分配器並在運行GC集合時進行調整): https://www.osadl .ORG /?ID = 1117

暫無
暫無

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

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