2014-12-27 53 views
-1

我正在製作一個基於平鋪的遊戲,有一個非常大的地圖,所以我不想將整個地圖保存在內存中,所以我想保存地圖並只加載它的一部分一次,我該怎麼做?保存一個整數的數組,然後加載某些元素

我想保存地圖作爲一個整數數組,並像劈成兩半的整數:我只是用在每個組塊陣列與瓷磚的數組,所以我可以在此刻

int id = basetile | abovetile << 8 

剛剛更新塊我需要太多,但我已經注意到,我使用的內存爲配發這樣簡單的事情

編輯:

如何將我編輯),美已經把一個值(

public static void main(String[] args) { 

    File f = new File("file.sav"); 
    f.delete(); 

    try (FileChannel fc = new RandomAccessFile(f, "rw").getChannel()){ 

     long buffersize = 100; 

     MappedByteBuffer mem = fc.map(FileChannel.MapMode.READ_WRITE, 0, buffersize); 

     mem.put(new byte[] {6, 4, 2}); 
     mem.flip(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

如何

+2

什麼代碼,你試過和你有麻煩嗎?你有沒有試過內存映射文件,因爲這避免了將任何數據加載到堆上? – 2014-12-27 14:26:24

+0

如果'basetile'適合8位,那麼你可以使用'byte []'而不是'int []'。這會將內存使用量減少4倍,但是'byte []'使用起來可能非常棘手,因爲'byte'是有符號的(值範圍從-128到127而不是0到255)。 – 2014-12-27 14:29:52

+0

Peter Lawrey的建議絕對值得一試。另外,通過用'ShortBuffer'或'IntBuffer'封裝'ByteBuffer',您可以輕鬆地在每個tile上花費不同的內存。 – hendrik 2014-12-27 14:36:12

回答

0

,我發現這個代碼我非常輕微編輯它

public static MappedByteBuffer save(String path, int[] data, int size) { 
    try (FileChannel channel = new RandomAccessFile(path, "rw").getChannel()) { 

     MappedByteBuffer mbb = channel.map(FileChannel.MapMode.READ_WRITE, 0, size); 
     mbb.order(ByteOrder.nativeOrder()); 

     for (int i = 0; i < size; i++) { 
      mbb.putInt(data[i]); 
     } 
     channel.close(); 

     return mbb; 

    } catch (Exception e) { 
     System.out.println("IOException : " + e); 
    } 
    return null; 
} 

public static int[] load(String path, int size, int offs) { 

    try (FileChannel channel = new RandomAccessFile(path, "r").getChannel()) { 
     MappedByteBuffer mbb2 = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()); 
     mbb2.order(ByteOrder.nativeOrder()); 

     int[] data = new int[(int) channel.size()]; 

     for (int i = 0; i < size; i++) { 
      data[i] = mbb2.getInt(i + offs); 
     } 
     channel.close(); 

     return data; 
    } catch (IOException e) { 
     System.out.println(e); 
    } 
    return null; 

} 

感謝這個方法的名稱

相關問題