[英]How to Handle A Large Amount of Objects
我有一個關於如何處理大量對象以提高性能的問題。 我正在創建一個具有無限塊狀地形的2D游戲,顯然這會帶來一些性能問題。
我想出的方法是查看玩家的X值是否達到1000的倍數,然后我將保存文件或游戲世界中已經存在的每個塊都保存到文件中。 之后,我銷毀游戲世界中的每個方塊。 之后,我遍歷文件中保存的每個塊,並測試它是否在特定半徑內。 如果是,則創建該塊。
但是,我什至不確定這是否有效。 每當我達到1000的倍數時,游戲就會凍結一兩秒鍾,並且在添加一些打印語句后,似乎大部分時間都花在了讀取文件上。 有沒有更好的方法來處理我丟失的問題?
我實際上是在自己開發這樣的游戲,所以我的方法可能與最適合您的方法有所不同。
我個人使用了帶有刪除監聽器的Google的Guava緩存之一。 當出於除我手動刪除對象之外的其他原因刪除對象時,我會將其寫入磁盤。 一個例子是:
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());
}
}
目前,盡管它們具有作為字段的int[][][]
數組,但我仍然能夠很好地加載30K對象。
注意:緩存在內部創建線程。 確保至少使用基本同步,以防止刪除偵聽器在嘗試編寫時干擾您的主線程。 像synchronized(
someCommonObject ){ // read or write }
這樣簡單的方法就可以工作,並且如果公共對象是文件輸出流或其他東西,則是相當慣用的。 像LevelDB這樣的數據庫通常會為您處理此問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.