【问题标题】:constructor exceeding the 65535 bytes limit超过 65535 字节限制的构造函数
【发布时间】:2016-03-29 20:11:50
【问题描述】:

我有一个类用于存储我的游戏世界的地形。游戏世界由立方体组成,每个立方体都有一个地形。信息存储为一个相当大的 3D 整数数组。

我现在遇到的问题是我的“地图”太大而无法存储在类(或枚举)中。由于我真的不知道类和枚举之外的任何东西,所以我不知道该怎么办。

我应该用它制作一个 tekst 文件并读出来吗?如果是这样,我该怎么做?

另一种解决方案是将映射拆分为多个类或枚举,然后在运行时再次合并它们,但我也不知道该怎么做,这似乎是一个非常糟糕的解决方案。

编辑:这是世界地图的一部分:

 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1
 0 0 0 0 0 0 0 0 0 2 2 0 0 0 1 1 1 1 1 1
 0 0 0 0 0 0 0 0 0 2 2 0 0 0 1 1 1 1 1 1
 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 1
 0 0 0 0 1 0 0 0 0 2 2 2 2 1 1 1 1 1 1 1
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1
 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 1
 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 1 1 0 0
 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0
 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0
 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0
 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0
 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0
 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0
 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 1
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0
 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 0
 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 1 0 0
 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0

这些块中有 40 个(所以还有 38 个),每个块都代表某个 z 坐标上的世界。我也有这个数组格式。 如果您能提供一些(示例)代码来说明如何从文件中读取它,那就太好了。

【问题讨论】:

  • 我建议你不要把它拆分成不同的类,直接存一个文件就行了。
  • 尝试内存映射方法,根据需要分段读取内存。
  • 不是在代码中将数组定义为文字,您可以将数据存储在文件中并从磁盘读取以将其放入数组中。
  • @Jay 我需要整个初始化世界。
  • @Jire 我正在考虑这个问题,但正如我的问题所述:我不知道该怎么做。

标签: java arrays limit


【解决方案1】:

最好将其放入资源中。只需在您的班级旁边创建一个文本文件(例如,命名为 map.txt),以您在问题中使用的相同格式将您的世界地图放在那里,然后使用如下代码加载它:

public int[][][] loadMap() {
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(getClass()
            .getResourceAsStream("map.txt"), StandardCharsets.ISO_8859_1))) {

        List<int[][]> result = new ArrayList<>();
        List<int[]> cur = new ArrayList<>();
        String line;
        while((line = reader.readLine()) != null) {
            line = line.trim();
            if(line.isEmpty() && !cur.isEmpty()) {
                result.add(cur.toArray(new int[0][]));
                cur.clear();
            } else {
                String[] cells = line.split("\\s+");
                int[] row = new int[cells.length];
                for(int i=0; i<cells.length; i++) row[i] = Integer.parseInt(cells[i]);
                cur.add(row);
            }
        }
        if(!cur.isEmpty())
            result.add(cur.toArray(new int[0][]));
        return result.toArray(new int[0][][]);
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    }
}

【讨论】:

  • 谢谢,这正是我需要的。
【解决方案2】:

如果可能在您的用例中,您可以使用 byte[] 块,甚至是 short[]。那么你应该在65535 字节限制之内。

size för byte[] : 20 x 20 x 40 x 1 = 16000 bytes
size för short[]: 20 x 20 x 40 x 2 = 32000 bytes

【讨论】:

  • 这可能是我的小地图的解决方案,但它们会上升到 80x80x80 = 512 000,所以对于较大的地图,这仍然是一个问题。
【解决方案3】:

你能证明你的错误吗?

如果您不需要加载所有地图,您可以将地图按块划分,并将所有地图保存在 Xml 中,例如:

<map>
   <chunk x=0 y=0> 
      <!--chunk informations>
   </chunk>
   <chunk x=0 y=1> 
      <!--chunk informations>
   </chunk>
   <!--other chunks>
</map>

【讨论】:

猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 2018-06-10
  • 2012-08-28
  • 2016-06-10
  • 2016-03-08
  • 2021-04-29
  • 1970-01-01
相关资源
最近更新 更多