簡體   English   中英

如何處理大量對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM