我有一个关于如何处理大量对象以提高性能的问题。我正在创建一个具有无限 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/