游戲關卡是醬紫加載的,你造嗎?


  游戲屬於實時交互程序,需要每秒渲染若干幀(例如30幀),讓用戶感覺畫面和操作是連續的。而從硬盤中加載游戲資源往往是一個比較長時間的過程(至少不能在1 / 30秒內加載完),所以需要顯示加載游戲的過渡畫面,本文將對常見的關卡過渡畫面及其對應的資源加載方式進行分析。

1 同步加載方案

  游戲之所以看起來是連續的,是因為每秒渲染若干幀(例如30幀),如果使用同步I/O的方式加載資源,那么在資源加載完成之前,由於沒有渲染,畫面自然持續不變了。當然,游戲要加載的資源很可能並不只是一個文件,所以在從硬盤讀取一個文件了以后有個機會渲染畫面,所以有以下兩種資源的同步加載方案:

 1.1  顯示靜態畫面

  所有資源加載完了以后,進入下一關卡。加載資源的時候畫面是卡死的,一般在關卡載入時間較短的時候,才會選擇這種方法。

 1.2  顯示進度條

  雖然采用同步I/O的方式加載資源時不能進行渲染,但是可以在單個資源加載結束以后渲染一幀。例如OGRE的資源管理系統提供了回調接口ResourceGroupListener(觀察者模式),在載入資源的時候通知各種事件,可以利用這個事件繪制進度條。

  使用這種方式顯示進度條,會有明顯的卡頓現象,因為單個資源加載了才刷新畫面。好處就是充分利用CPU,節約加載時間,同時還可以顯示進度條。個人感覺PC上的許多游戲就是采用這種方式(當然也有可能是下面2.2的方法)。

2  異步加載方案

  如果在一個關卡運行的時候,采用異步I/O的方式在另一個線程中加載資源,那么用戶則感覺不到關卡的加載時間,或看到流暢的加載關卡的動畫(而不是靜態畫面或者很卡的進度條)。

 2.1  簡單的異步I/O加載資源

  假設玩家當前所在關卡為關卡A,下一關卡為關卡B,那么玩家還在A關卡的時候,就異步加載關卡B的內容,這樣在玩家進入關卡B的時候就不需要等待。

  這種做法比較簡單,但是在游戲中幾乎見不到,主要有以下兩個原因:

  1、內存資源是很寶貴的,尤其是在游戲機上,而這種方法會比原先多消耗近一倍的內存;

  2、對於非線性關卡的游戲,這個方法不適用。

 2.2  使用顯示進度條的過渡場景

  假設玩家當前所在關卡為關卡A,下一關卡為關卡C,可以先加載過渡場景:關卡B。關卡B中采用異步I/O的方式加載關卡C,並繪制加載進度。由於關卡B的內容比較少,所以從關卡A到關卡B的時間非常短,玩家接下來就會看到關卡B中流暢顯示的進度條和加載動畫了。

  Unity3D中使用這種方法加載關卡的實現看雨松MOMO的博客:Unity3D研究院之異步加載游戲場景與異步加載游戲資源進度條(三十一)

  個人感覺很多手機游戲采用的是這種方法,體驗感好;至於PC上的很多游戲我不太確定是采用這種方法還是1.2的方法,因為如果將負責渲染的線程優先級降低,負責加載資源的線程優先級提高,這樣加載的速度會提高,但是進度條和過渡動畫會有明顯的卡頓。

 2.3  Air Lock(阻隔室)

  上一個方法玩家仍舊需要等待,只是出現關卡間的過渡動畫和進度條,相比靜態畫面,體驗感更好。如果使用Air Lock(阻隔室),則能夠讓玩家感覺不到等待時間,同時又不像2.1的方法那樣浪費內存。

  在制作關卡的時候,可以將關卡分為一大一小兩部分,小的一部分為阻隔室;在加載關卡的時候,先加載阻隔室,然后再異步加載關卡的其他內容。加載期間,別讓玩家在阻隔室閑下來,可以讓玩家簡單的走過一條通道,或者執行更有趣的任務。由於阻隔室比較小,所以加載很快,玩家感覺關卡的間隔不明顯;等到玩家在阻隔室中玩了一段時間后,可以直接進入下一場景而無需等待。

  XBOX的《光環》采用了類似的方法,不過總體感覺使用這種方法的游戲不是太多。

3  總結

  若關卡比較簡單,可以采用1.1的方法;若關卡比較復雜,加載時間長,則需要使用1.2或2.2的方法,給用戶相關提示。2.3的方法比較有意思,但是需要在關卡的設計上下功夫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM