代码之家  ›  专栏  ›  技术社区  ›  Wouter A

如何在Java中高效地存储滚动播放项属性?

  •  1
  • Wouter A  · 技术社区  · 8 年前

    如何在Java中高效地存储RPG项属性?

    我正在设计一个基于文本的RPG,比如在抢劫箱子的时候,随机产生物品。 目前,我正在将项目数据存储在文本文件中。当必须生成随机项时,扫描仪读取文件,收集值,考虑概率,然后相应地创建一个新对象。 以下是“消耗品”类别的一些项目的示例。

    相应地列出了这些值:

    名称、概率、物品添加到物品池的级别、重量、价值、+生命值、+伤害、效果

    文本文件示例:

    Twinkie 10 1 1 10 10 10 0
    Banana 10 1 1 5 5 0 0
    Potato 20 1 1 5 5 0 0
    Protein_Shake 5 5 1 30 10 10 1
    Beer 5 5 1 5 10 10 1
    

    如果效果值等于0,将创建一个新的默认耗材,效果为“null”。 如果效果值为1,则函数使用switch(name)语句查找属于该项的效果,然后 将效果作为“可消耗构造函数”中的参数传递。

    我敢肯定,这是一种非常不古板和低效的方式来进行这类事情。有人对如何处理这个问题有什么建议吗?我想把它做好。 我是否应该创建一个ConsumablePool类,在该类中直接创建所有项目,或者将项目信息存储在其他地方?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Ian Mc    8 年前

    有几种方法可以优化当前任务,它们似乎是:

    Consumable nextItem = getRandomConsumable(List<Consumable> candidates);
    

    也许您还必须根据当前级别进行选择:

    Consumable nextItem = getRandomConsumable(int level, List<Consumable> candidates);
    

    目前,您声明每次调用 getRandomConsumable() 您从磁盘文件生成候选列表(您似乎已经编写了此代码)。你的直觉是正确的。该操作的“成本”相对较高。与从内存缓存读取对象相比,从磁盘读取会导致性能不佳。假设磁盘文件在游戏期间没有更改,您的应用程序应该创建一次候选列表(在启动时),并在每次必须选择下一项时使用此列表。

    如果候选人基于级别,则可以进行进一步的优化。考虑按级别划分候选人,例如:

    List<Consumable> candidates = createCacheFromDisk(); // Run at startup
    Map<Integer, List<Consumable>> itemsByLevelMap = candidates .stream().collect(Collectors.groupingBy(Consumable::getLevel));
    

    这将进一步将候选人名单按级别划分为多个名单,允许

    List<Consumable> level1Items = itemsByLevelMap.get(1);
    

    这种通用的缓存方法将大大提高应用程序的性能;从已经生成/缓存的列表中选择一个随机项的性能远远高于每次从磁盘生成一个新列表的性能。