gpt4 book ai didi

Java - 读取和存储数据最快且使用率最低的方式

转载 作者:行者123 更新时间:2023-12-02 09:02:53 25 4
gpt4 key购买 nike

我正在使用 java (LWJGL) 创建某种游戏,我想知道在硬盘驱动器中读取和存储数据的最快方法。游戏的世界是某种代表 3D 世界的网格,我需要存储有关每个 1x1x1 大小的立方体的数据(或者将来可能会更低以获得更好的分辨率)。我目前正在将多维数据集的每个记录保存在文本文件中。每条记录存储 32x32x32 立方体的数据。

现在,每条记录占用硬盘内存 625 KB,读取文件需要 16 毫秒(在我的电脑中,不做其他事情,只是读取它)。

我想知道是否有更好的方法来做到这一点,因为我可能每 3 秒使用一次此方法(大多数不会,但有时会 - 需要将帧速率保持在 60)。一种获取相同数据的方法,因此消耗更少的内存并且读取速度更快。文本文件仅使用数字、英文字母和一些特殊字符(',' '(' ')' '{' '}' '-' '.' ':' 以及其他一些字符)。

我听说《我的世界》使用 .mca 文件,但我不知道它们是否更好,或者如何阅读它们。

最佳答案

实现您想要的操作的一种方法是使用序列化和对象流将二进制数据存储到文件中。本质上,您将存储数组对象或 block 的对象(或任何您所说的地形分割)。这将实现更快的加载时间,因为 JVM 不必在加载时重新构造每个对象。

使用二进制文件的主要优点是您无需编写任何算法,甚至在希望存储数据时无需迭代数据。正如您提到的,您希望进行频繁的存储,这可能对您来说是一个很好的解决方案。

这里是一个示例,可以为您提供一些指导。

假设:

class Chunk implements java.io.Serializable {

private static final long serialVersionUID = 1L;

Block[][][] chunkBlocks;
// ... other code //
}

添加语句implements Serializable对于类定义,您表示该类可用于从字节流写入和读取对象,从而允许您存储它们并从文件中读取它们。还要注意的一件事是变量 serialVersionUID 。这非常重要,因为它会告诉流该对象属于哪个类以及是否可以转换为该类。 (注:这是一个粗略的近似值,但为了避免冗长,我将不向您提供详细信息)。现代 IDE,例如 eclipseIntelliJ当您实现 Serialized 接口(interface)时,将提示您将此变量添加到您的类中。他们还将为您提供为其生成唯一 ID 的选项。建议这样做以确保不存在任何冲突。

最后,以下是存储对象的方法:

/**
* Object o : the object you want to save
* String filename : the file path of where you want to save the object
*/
public static void save(Object o, String filename) {

FileOutputStream fos = null;
ObjectOutputStream oop = null;

try {
fos = new FileOutputStream(filename);
oop = new ObjectOutputStream(fos);
oop.writeObject(o);
oop.flush();
fos.flush();
oop.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}

}

并加载一个:

/**
* @returns Object o : the object stored in the file @ filename
* String filename : the file path of where you want to save the object
*/
public static Object load(String filename) {

FileInputStream in;
ObjectInputStream ois;

Object o = null;

try {
in = new FileInputStream(filename);
ois = new ObjectInputStream(in);
o = ois.readObject();
ois.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

return o;

}

在上面的代码中,我概括了获取和返回 java.lang.Object 的函数,但是如果您希望有一个专用于特定类的函数,您可以将其更改为 Chunk 或其他任何内容。

您还提到了 Minecraft 文件格式,但这些格式非常特定于应用程序,并且基本上采用对其有意义的格式。除此之外,它们不适合您想要的频繁保存,它们更擅长后台 block 卸载。

希望这有帮助!

关于Java - 读取和存储数据最快且使用率最低的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31100134/

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