java - 如何处理大量物体

标签 java object

我有一个关于如何处理大量对象以提高性能的问题。我正在创建一个具有无限 block 状地形的 2D 游戏,显然这会带来一些性能问题。

我想出的方法是查看玩家的 X 值是否达到 1000 的倍数,然后我将保存文件或游戏世界中已有的每个 block 保存到文件。之后,我摧毁游戏世界中的每个方 block 。之后,我循环遍历文件中保存的每个 block 并测试它是否在特定半径内。如果是,我创建该 block 。

但是,我什至不确定这是否有效。每次我达到 1000 的倍数时,游戏都会卡住一两秒,并且在添加一些打印语句后,似乎大部分时间都花在了读取文件上。有没有更好的方法来处理我所缺少的这个问题?

最佳答案

我自己实际上正在开发这样的游戏,因此我的方法可能与最适合您的方法不同。

我个人使用 Google 的 Guava caches 之一,带有删除监听器。当某个对象因除手动删除之外的任何原因被删除时,我会将其写入磁盘。一个例子是:

LoadingCache<Position2D, BlockOfTiles> graphs = CacheBuilder.newBuilder()
   .maximumSize(10000)
   .expireAfterWrite(10, TimeUnit.MINUTES)
   .removalListener(new MyTileMapListener())
   .build(
       new CacheLoader<Position2D, BlockOfTiles {
         public Graph load(Key key) throws AnyException {
           return loadFromDisk(key);
         }
       });

MyTileMapListner 可能看起来像这样:

private class MyTileMapListener implements RemovalListener<Position2D, MyBlockOfTiles>{
    @Override
    onRemoval(RemovalNotification<K,V> notification){
        if(notification.getCause()==RemovalCause.EXPLICIT) return;
        writeToDisk(notification.getKey(), notification.getValue());
    }
}

目前,我能够很好地加载 30K 对象,尽管它们具有大型 int[][][] 数组作为字段。

警告:缓存在内部创建线程。确保至少使用基本同步,以防止删除监听器在尝试写入时干扰主线程。像 synchronized(someCommonObject){//read or write } 这样简单的东西就可以工作,如果公共(public)对象是文件输出流或其他东西,那么这将是相当惯用的。像 LevelDB 这样的数据库通常会为您处理这个问题。

关于java - 如何处理大量物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23818646/

相关文章:

c++ - c++简单程序初学者

objective-c - 如何访问成员对象

java - 如何访问对象的这个参数

python - python 中 JSON 到 CSV 的转换问题

两种方法(泛型)之间的Java区别

java - 上下文初始化失败/创建名为 'org.springframework.security.filterChains' 的 bean 时出错

java - 使用布局 XML 文件的逻辑

javascript - 如何以 json 或其他格式存储 javascript 混合数组/对象并保留结构?

java - Android:设置微调器背景后向下箭头消失

java - Dalvik 和乱序写入