2009-08-06 35 views

回答

0

你可以在一個大紋理(1024x1024)中放置幾個​​紋理。這需要重新計算texcoords。嘗試使紋理部分接近繪製時使用的實際分辨率,即紋理將填充1/2屏幕高度(240像素),足以使用256x256的紋理。

然後,更高級的方法(未測試)可以連接所有文件(+註冊其長度+ pos),然後使用mmap(..)訪問此png-db文件。然後使用NSData提供紋理加載函數,如果它們基於UIImage。像這樣使用mmap(..)的好處是不要打開和關閉很多文件,並且在OS VM管理器的幫助下處理對數據的訪問。

[注:是的,iPhone本機PNG裝載機需要一些PNG重整...可能需要一個沒有本地的讀者則或連接錯位的文件,而不是]

0

你知道你要什麼樣的順序需要你的成千上萬的圖像?也許您只能在應用程序啓動時加載其中的幾百個,然後在後臺加載更多的後臺線程。

將小圖像合併爲更少的較大紋理也將是一個好主意,同樣,只有在某種模式下才能使用圖像。

+0

爲什麼更少但更大的紋理能夠提供如此大的幫助?紋理有很多開銷嗎? – CustomAppsMan 2009-08-10 01:15:54

+0

打開每個文件還有一些額外的工作,如果你的圖像不是正方形,並且高度/寬度兩倍,你可以使用較少的紋理內存進行組合。 – 2009-08-10 02:57:51

1

我通常所做的是構建一個對象,通過管理器處理我的貼圖的延遲加載。在開始時,我註冊我已知的紋理並解決他們的文件系統屬性,稍後我將需要在加載時節省簡單的IO,然後在需要時將它們拉入。

要加快速度,我有批量加載機制也是如此,我說「加載這組圖像並將它們還給我。」這只是爲了消除重複方法調用的開銷。事實上,我的單​​一負載解決方案只是我的批處理負載的簡單包裝。

這種方式在啓動時緩存我的簿記(對象創建,文件系統屬性發現等),但推遲繁重的工作,直到需要。當我在運行時將紋理加載到我的應用程序中時,會觸發錯誤,這些錯誤會將紋理從存儲器填充到紋理內存。如果我在手動加載具有衆多紋理的場景之前,我會在預取中加載一組非常常見的紋理,但會將相對罕見的紋理延遲到運行時。

實際上,由於涉及到的概率,這種方法往往會起作用 - 在開始時強制加載確保您將一次遇到所有紋理,而在可能性中稀疏加載它們會導致預期的用戶延遲下降,時間延遲*從一開始就在一段時間內加載的概率。如果優化開始時間預取以不加載紋理,則可以顯着降低預期的UI延遲。

此外,您可能要考慮使用NSURLConnection:connectionWithRequest:delegate:從存儲裝載您的紋理。它是異步的,因此您可以要求它在異步情況下加載最大的文件並同步加載最小的文件,以便在文件系統讀取/紋理解壓縮期間利用IO/CPU空閒因素(大文件加載很長時間,而小文件加載速度很快,並且可以反序列化同時)。你應該測試一下,因爲iPhone可能無法很好地處理異步文件系統訪問。

+0

在任何時候,我只將png文件中的圖像加載到程序中,立即從當前時間點加載需要的紋理。換句話說,我一次不加載所有文件。然而,在任何給定的時間,我都需要至少1000個PNG加載到貼圖中以供顯示。 – CustomAppsMan 2009-08-10 01:14:30

+0

因此,如果我使用NSURLConnection或線程,我應該同時加載多個PNG文件,而不是連續執行,這將更快? – CustomAppsMan 2009-08-10 01:19:08