2008-10-20 43 views
3

我正在爲iPhone的2D滾動遊戲工作。我有一個大的圖像背景,比如480×6000像素,只有一部分是可見的(正好一個屏幕的值,480×320像素)。在屏幕上獲得這樣的背景的最佳方式是什麼?在OpenGL ES中的大型滾動背景

目前,我將背景分割爲幾個紋理(以獲得最大紋理大小限制),並將每個幀中的整個背景繪製爲紋理三角形條。滾動是通過翻譯模型視圖矩陣完成的。剪刀盒設置爲窗口大小,480×320像素。這並不意味着要快,我只是想在優化之前使用一個可用的代碼。

我認爲OpenGL的實現可能足夠聰明,以放棄背景的不可見部分,但根據我寫的一些測量代碼,它看起來像背景需要7毫秒來平均繪製,最多84毫秒。 (這是在模擬器中測量的)。這大約是整個渲染循環的一半,即。對我來說很慢。

繪製背景應該像從VRAM的一個部分向另一個部分複製一些480×320像素一樣簡單,或者換句話說,快速創建。接近這種表現的最佳方式是什麼?

回答

4

這是最快的方法。你可以做的事情來提高性能:

  • 嘗試不同的紋理格式。據推測,SDK文檔有關於首選格式的詳細信息,推測小一點更好。
  • 剔除出完全離屏磚自己
  • 圖象分成更小的紋理

我假設你在一個1繪圖:1縮放級別;是這樣嗎?

編輯:糟糕。仔細閱讀你的問題後,我必須提供另一條建議:在模擬器上製作的計時器毫無價值。

+0

謝謝,或多或少,我認爲這將是這樣。今天我終於會拿到一個iPod進行測試,我將在實際的硬件上運行代碼,看看會發生什麼。 – zoul 2008-10-20 09:47:43

+1

嘗試設備上的代碼之後:是的,模擬器上製作的計時器毫無價值。 – zoul 2008-11-03 06:56:40

2

快速的解決方案:

  • 創建瓦片的幾何矩陣(四邊形優選地),使得存在至少一個行/上的可視區域的所有側面離屏磚柱。

  • 將紋理映射到所有這些圖塊。

  • 只要有一個圖塊在可視區域之外,就可以釋放此圖塊並綁定一個新圖塊。

  • 使用平鋪寬度和平鋪高度的模作爲位置來移動平鋪(以便當平鋪長度剛好移動一個平鋪時,平鋪將自身重新定位在其起始位置)。另外請記住在該操作過程中重新映射紋理。這允許您在任何給定時間加載非常小的網格/非常少的紋理內存。我認爲這在GL ES中尤爲重要。

如果你有足夠的內存空間,並且仍然受到低負載速度的困擾(儘管你不應該使用這種紋理)。您可以構建紋理流引擎,在到達新區域時將紋理預加載到更快的內存中(無論目標設備上可能存在的內容)。在這種情況下,作爲紋理的映射將在需要時從更快的內存中進行。只要確保能夠預先加載而不用完所有內存,並記住在不需要時動態釋放它。

以下是指向GL(非ES)磁貼引擎的鏈接。我自己並沒有使用它,所以我不能擔保它的功能,但它可能會幫助你:http://www.mesa3d.org/brianp/TR.html