我已經看過一些程序和遊戲,它們將數據存儲在索引文件中,然後從文件中加載它們的數據,這些數據通常稱爲cache
。Java在索引文件中存儲多個圖像,配置文件等?
我希望能夠加載這樣我的數據:
final int SPRITES_INDEX = 3;
List<Sprite> sprites = (List<Sprite>) cache.loadIndex(SPRITES_INDEX);
哪位知道它是如何做和爲什麼它這樣做呢?或者是否有這種存儲數據的方法的名稱?
我已經看過一些程序和遊戲,它們將數據存儲在索引文件中,然後從文件中加載它們的數據,這些數據通常稱爲cache
。Java在索引文件中存儲多個圖像,配置文件等?
我希望能夠加載這樣我的數據:
final int SPRITES_INDEX = 3;
List<Sprite> sprites = (List<Sprite>) cache.loadIndex(SPRITES_INDEX);
哪位知道它是如何做和爲什麼它這樣做呢?或者是否有這種存儲數據的方法的名稱?
你應該在「jar」文件中查找「resources」。這就是java世界中常用於這項工作的東西。通常情況下,一個jar文件只是一個zip文件,它是順序的,但是多年前他們增加了索引jar文件的能力,它提供對其內容的隨機訪問。
你可以從這裏開始:http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/jar.html
(尋找「我」選項,它增加了一個索引的jar文件)
至少對圖像/渲染,這就是所謂的Texture Packing
,並完成是因爲OpenGL在渲染圖像之前會「綁定」圖像,並且這種綁定可能很昂貴,而且處理起來也很麻煩。
在較大的圖像內封裝紋理允許遊戲/應用綁定一次,然後基於預定義像素座標的索引,僅渲染較大圖像的一部分,就好像它們是單獨的較小圖像一樣。
我建議看看LibGDX的TexturePacker
。
提取物:
在OpenGL中,紋理必然,一些繪圖完成後,另一個紋理 必然,更繪圖完成,等綁定質地相對昂貴 ,所以它是理想的在較大的 圖像上存儲許多較小的圖像,將較大的紋理綁定一次,然後繪製其中很多部分,其中很多爲 次。 libgdx有一個TexturePacker類,它是一個命令行 應用程序,它將許多較小的圖像打包到較大的圖像上。它 存儲較小圖像的位置,因此它們很容易使用TextureAtlas類在應用程序中按名稱引用 。
TexturePacker使用多種包裝算法,但最重要的 基於最大矩形算法。它還使用強力 力量,包裝與各種尺寸的衆多啓發式,然後 選擇最有效的結果。
注意,這是一種類型的,和類似的但不相同的,的Caching
的一般概念。
在計算機編程中,緩存包括專用一段內存來存儲最近或經常使用的數據,以避免在每次需要/訪問時必須重新創建/重新處理該數據。
因此,它與紋理打包的概念相似但不相同,它不是爲了自己重新創建/重新處理圖像,而是爲了避免昂貴的複雜/過程。
考慮到問題的遊戲環境,還需要注意另一個概念,這次更接近於緩存。它被稱爲Pooling
,包括創建預先創建/預處理的對象實例的緩存(在這種情況下稱爲Pool
),這些對象隨着時間的推移可能需要不同的數量,例如RTS遊戲中的單位,以避免在需要時創建它們(反過來避免處理中的突然「重量」,這導致FPS突然下降或在遊戲的情況下「口吃」)。
我沒有想到這一點,因爲OP提到「存儲多個圖像,配置文件」,這對我來說,直接指向jar文件。 (但他在*標題*中提到了這一點,而不是在問題的主體中。) –
我不確定他是否真的意味着索引文件......從他的問題的遊戲環境中,他可能實際上是在談論一個'Texture Package'(又名'Texture Atlas')。但在指定之前,你的回答是完全合理的,所以+1。 – XenoRo