如何从Java中的序列化对象加载选择性数据?

如何从Java中的序列化对象加载选择性数据?,java,arrays,serialization,Java,Arrays,Serialization,我正在用Java为一个学校项目编写一个2-D RPG风格的基于精灵的游戏,我们小组决定游戏应该有一个跟随玩家的摄像头,而不是一个固定的摄像头,这自然意味着游戏需要在玩家移动时动态加载世界数据。我知道这可以通过分块加载世界的各个部分来实现,就像在Minecraft中一样,但我希望能够有选择地频繁加载少量数据,而不是不那么频繁地加载大块数据。例如,玩家向上移动一个单位,因此游戏可以在加载最上面一行的同时丢弃内存中最下面一行的数据,而不是时不时地加载整个区块或卸载区块。目前,所有相关的世界数据都存储在

我正在用Java为一个学校项目编写一个2-D RPG风格的基于精灵的游戏,我们小组决定游戏应该有一个跟随玩家的摄像头,而不是一个固定的摄像头,这自然意味着游戏需要在玩家移动时动态加载世界数据。我知道这可以通过分块加载世界的各个部分来实现,就像在Minecraft中一样,但我希望能够有选择地频繁加载少量数据,而不是不那么频繁地加载大块数据。例如,玩家向上移动一个单位,因此游戏可以在加载最上面一行的同时丢弃内存中最下面一行的数据,而不是时不时地加载整个区块或卸载区块。目前,所有相关的世界数据都存储在二维数组中,那么有没有一种有效的方法可以从世界文件中加载数组中的特定数据点,而不必加载整个数据或大块数据

再说一次,也许大数据块加载是更好的选择,因为从硬盘加载需要更长的时间,你有什么想法吗

假设在这种情况下,世界文件由更小的文件组成,这些文件称为区域,基本上是块

然后我的问题是:“我如何从主世界文件加载这些特定区域而不立即加载整个文件?”

您可以看到,它主要用于存储大型矩阵,因为加载大型矩阵需要大量内存。如果将矩阵存储在随机访问文件中,而不是加载到内存中,则可以非常快速地检索它们。你只需要将一个矩阵映射到一个矩阵,以便以后使用。我不是在重复整个示例,而是只重复您需要清楚理解的主要部分,以便您可以根据需要重新实现它

public long position(int x, int y) {
    return (long) y * width + x;         // returns the position of a value in the file
}

public double get(int x, int y) {
    assert x <= 0 && x > width;          // simply bound check
    assert y <= 0 && y > height;         // simply bound check
    long p = position(x, y) * 8;         // 8 for double, if integer then use 4
    int mapN = (int) (p / MAPPING_SIZE);
    int offN = (int) (p % MAPPING_SIZE);
    return mappings.get(mapN).getDouble(offN);
}

重要信息
MAPPING\u SIZE
可以设置为
1,因此简而言之,您希望将矩阵存储在文件中,然后您希望在不查看整个文件的情况下随机访问文件中的子矩阵?@WasiAhmad基本上是的。这取决于文件格式。如果可以通过编程方式确定给定单元格的偏移量,则可以查找该偏移量并读取。如果不能(单元格大小可变),则必须为序列化数据编制索引,使其为cell->offset。但是对于这个,是的,磁盘搜索会杀死你,你可能可以把整个世界都放在内存中。啊,谢谢你,这正是我要找的东西@格雷戈里萨拉扎表示感谢的最佳方式是接受答案并投赞成票;)对不起,我是新来的,我给了你更高的票数,但上面说不会出现,因为我的声望不够高yet@GregorySalazar您可以接受答案,因为您是问题的所有者:)
public void set(int x, int y, double d) {
    assert x <= 0 && x > width;
    assert y <= 0 && y > height;
    long p = position(x, y) * 8;
    int mapN = (int) (p / MAPPING_SIZE);
    int offN = (int) (p % MAPPING_SIZE);
    mappings.get(mapN).putDouble(offN, d);
}