存储java程序的只读数据的最有效方法是什么?

Mil*_*sen 3 java xml

我有一个我试图编程的游戏,但它的初始数据输入是巨大的.事情是所有这些数据都是只读的.所以当程序运行时,每次都是一样的.

我需要问这个问题的原因是因为我认为每次运行程序时通过类系统重新运行数据是低效的.最初我使用的是XML设置:

XML设置示例:

<?xml version="1.0"?>
<gameBoard>
    <!-- Area 1 -->
    <area name="Area 1">
        <arrows white="Area 2" black="Area 3" />
        <color>white</color>

        <location name="Area 1 Atrium" />
        <location name="Location 1.1">
            <attr1>foo</attr1>
            <attr2>bar</attr2>
            <attr3>foobar</attr3>
        </location>
        <location name="Location 1.2">
            <attr1>foo</attr1>
            <attr2>bar</attr2>
            <attr3>foobar</attr3>
        </location>
        <location name="Location 1.3">
            <attr1>foo</attr1>
            <attr2>bar</attr2>
            <attr3>foobar</attr3>
        </location>
    </area>
</gameBoard>
Run Code Online (Sandbox Code Playgroud)

我选择了JSON或YAML,因为每个位置和区域标签的属性都派上用场,而且我最了解XML,我知道它的支持程度如何.

但是,这是最好的事情吗?每次玩家移动时,我认为它必须遍历此设置以找到玩家想要移动到的特定位置(技术上它不会迭代文档,因为Java的DOM解析器首先将整个文档加载到内存中, 但是无论哪种方式).

我的第二个想法是为每个区域创建一个类,每个区域都有一个方法,只需通过方法设置变量(例如,playerLocation设置为一个位置的名称,这很容易完成).

此外,这些数据绝不是人类可读的.我知道,当数据是字节码时,它通常要快得多,因此也可以.只有程序需要读取它,即使用户要更改XML/WhateverOtherConfig文件,添加也会被忽略.

谢谢你的耐心等待.如果我需要澄清任何事情,请告诉我.这非常处于阿尔法阶段,我甚至都没有想到我的想法,所以我只是因为我想到它的大部分内容.再次感谢!如果有需要澄清,请告诉我.

Pre*_*gha 7

需要考虑两个级别的优化.

  1. 解析和构造对象图的开销
  2. 从磁盘加载的开销

首先考虑低开销序列化,如JSON(正如@Perception所指出的那样),但也许您应该考虑二进制序列化,因为这将加载最快.

对于第二个考虑使用OS技术,如内存映射文件来帮助您.

但在所有优化问题中,我必须说 - 首先测量度量并再次测量以确定真正的性能问题所在.