簡體   English   中英

實時應用程序中的JRuby,大型數組和性能問題

[英]JRuby, large arrays, and performance issues in a real-time application

我正在開發一個實時游戲應用程序。 大部分代碼都是用Java編寫的,但是最近我決定嘗試將一些初始化過程移到JRuby腳本中,以使玩家輕松地修改世界的生成方式。

首先,我決定將地圖生成移入JRuby腳本。 目前,這可以歸結為以下Java代碼:

ScriptingContainer container = new ScriptingContainer();
container.put("$data", dataPackage);
container.runScriptlet(PathType.RELATIVE, scriptName);
dataPackage = (BlockMapGenerationDataPackage)container.get("$data");

數據包包含Java程序生成最終地形並進行渲染所需的所有信息,並且還包含必需的數據,以便Ruby腳本能夠制作所有形式的地圖。 特別是,它包含一個相當大的數組(當前為1000 x 1000 x 15)。 為了測試Ruby腳本是否正常工作,我剝離了整個地圖生成算法,並進行了以下極其簡單的測試:

require 'java'
Dir["../../dist/\*.jar"].each { |jar| require jar }

for i in (0...$data.getWidth())
  for j in (0...$data.getDepth())
    $data.blocks[i][j][0] = Java::BlockMap::BlockType::GRASS
  end
end

這僅在初始化時執行一次。 現在,當所有這些都用Java實現時,使用了更多的內存密集型生成算法,就沒有任何性能或內存問題。 在具有1000 x 1000 x 15地圖的舊筆記本電腦上,游戲可以以非常高的分辨率以每秒數百幀的速度平穩運行。 但是,當Java生成代碼被上述JRuby腳本替換時,該程序似乎會遇到一些內存消耗問題:幀速率下降了約30-40 fps,並且該程序凍結了十分之一秒,並且保持了令人印象深刻的一致性。周期性速率大約每三秒鍾一次。 分析和各種測試表明,唯一可能的罪魁禍首是Ruby腳本。

此外,如果將地圖的尺寸​​大大減小,例如縮小到100 x 100 x 15,那么這些問題或多或少就會消失。

我已經嘗試過各種方法,例如添加container.terminate(); container.clear(); Java代碼執行腳本之后,但我真的不了解問題的根源或解決方法。 如果有人可以解釋這里出了什么問題以及是否可以解決問題,我將不勝感激!

最好使地圖創建例程成為一個單獨的應用程序,並將其鏈接到Java應用程序。

我非常確定JRuby中數組的內存布局將有所不同,並且可能會導致您的問題-映射對象本身可能是使用不同的內存布局創建的,只要訪問它就需要進行一些JRuby交互,或者就像創建Integers而不是ints一樣簡單,並且由於自動裝箱而沒有引起您的注意(同樣,總計TOTAL猜測,因為我看不到數據類型)

您至少應該試驗一下下標的順序:[i] [j] [0]與[0] [i] [j]和[0] [j] [i]的比較。

暫無
暫無

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

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