2013-07-10 102 views
1

我們的團隊開發了一個OpenGL應用程序,它在屏幕上繪製不同的多邊形。另外我們想創建大約1000個不同的字符串在屏幕上打印。如果我們使用Texture2D類執行此操作,則FPS將下降到3.OpenGL-ES屏幕上的iOS DrawText戲劇性地降低FPS

我已經測試了位圖字體,但這並未提高性能。

哪個是OpenGL iOS中最好的方法來繪製大量文本而不會丟失性能並且不會丟失質量(文本應該可縮放)?

回答

0

分配1000個紋理會佔用大量內存,並會降低您的應用程序速度,特別是當它們的可讀文本分辨率足夠高時。您應該根據需要生成這些紋理並在不再顯示它們時將其釋放。確保你沒有生成和釋放每一幀的紋理,但只根據需要。

如果您在同一場景中繪製所有1000個字符串,則應儘可能多地將其組合成類似的紋理。這將使您能夠利用Cocos2D的TrueType渲染系統來保持文本的高質量。另一方面,如果這不是一個選項,並且所有1000個字符串都需要彼此不同,請考慮構建一個將每個字符呈現爲字形圖像的字體呈現系統。這將使用的紋理數量從1000減少到大約100,以表示所有標準英文字符和標點符號。在OpenGL環境下,我必須爲一個有很多動態文本的視頻遊戲做類似的工作,並獲得很好的性能。但是,除非絕對必要,否則我不會推薦它,因爲它將文本限制爲僅限於您定義的字形,而且您必須自己編寫格式。

+0

我已經實現了只有紋理,可用於屏幕創建並在使用後釋放它們。正如你所描述的,我認爲我的問題是,我在每個新的渲染過程中繪製並創建它們,這是瓶頸。你有什麼想法我可以避免它嗎?感謝您的回答。 – Andreas

+0

是的,爲您計劃使用的所有字形(大寫和小寫,數字,標點符號等)創建紋理,並將這些紋理存儲在自定義文本處理類中。然後將一個成員函數添加到將字符串和模型視圖矩陣作爲參數的類。該函數應該查找字符串中每個字形的紋理,並從模型視圖開始繪製它們,在繪製之後將模型視圖的寬度轉換爲每個字形的寬度。這會將內存使用量從1000個較大的紋理減少到100個。 –

+0

如果您不想製作像這樣的字體系統並且可以節省內存,我只需在啓動時創建所有字符串的紋理,然後根據需要調用它們,只在程序關閉時刪除它們下。事實上,如果你不喜歡這樣的表現,我會首先做這件事,並且只考慮做出我上面的評論。 –