有几种方法可以优化当前任务,它们似乎是:
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);
这种通用的缓存方法将大大提高应用程序的性能;从已经生成/缓存的列表中选择一个随机项的性能远远高于每次从磁盘生成一个新列表的性能。