gpt4 book ai didi

java - 实时应用程序中的 JRuby、大型数组和性能问题

转载 作者:行者123 更新时间:2023-11-30 07:33:17 25 4
gpt4 key购买 nike

我正在开发一个实时游戏应用程序。它大部分是用 Java 编写的,但最近我决定尝试将一些初始化过程移到 JRuby 脚本中,以便最大限度地方便玩家修改世界的生成方式。

首先,我决定将 map 生成移动到 JRuby 脚本中。目前,这归结为以下 Java 代码:

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

数据包包含 Java 程序生成最终地形并渲染它所需的所有信息,它还包含必要的数据,以便 Ruby 脚本能够制作各种 map 。特别是,它包含一个相当大的数组(目前为 1000 x 1000 x 15)。为了测试 Ruby 脚本是否正常工作,我剥离了整个 map 生成算法并进行了以下极其简单的测试:

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 map 的旧笔记本电脑上以非常高分辨率以每秒数百帧的速度流畅运行。然而,当 Java 生成代码被上面的 JRuby 脚本替换时,该程序似乎遇到了一些内存消耗问题:帧速率下降了大约 30-40 fps,并且程序以非常一致的速度卡住了大约十分之一秒大约每三秒一次的周期性速率。分析和各种测试表明,唯一可能的罪魁祸首是 Ruby 脚本。

此外,如果 map 的尺寸​​大幅缩小,比如缩小到 100 x 100 x 15,那么这些问题或多或少会消失。

我尝试了各种方法,例如在 Java 代码之后添加 container.terminate();container.clear(); 来执行脚本,但我真的不了解问题的根源或解决方法。如果有人能解释这里出了什么问题以及是否可以解决这个问题,我将不胜感激!

最佳答案

最好使 map 创建例程成为一个完全链接到 Java 应用程序的单独应用程序。

我很确定 JRuby 中数组的内存布局会有所不同,这可能会导致您的问题—— map 对象本身可能是使用不同的内存布局创建的,无论何时都需要进行一些持续的 JRuby 交互它被访问,或者它可能像创建整数而不是整数一样简单,并且由于自动装箱而您没有注意到它(再次,总猜测,因为我看不到数据类型)

关于java - 实时应用程序中的 JRuby、大型数组和性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5957120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com