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

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

1 同步加載方案

  遊戲之因此看起來是連續的,是由於每秒渲染若干幀(例如30幀),若是使用同步I/O的方式加載資源,那麼在資源加載完成以前,因爲沒有渲染,畫面天然持續不變了。固然,遊戲要加載的資源極可能並不僅是一個文件,因此在從硬盤讀取一個文件了之後有個機會渲染畫面,因此有如下兩種資源的同步加載方案:動畫

 1.1  顯示靜態畫面

  全部資源加載完了之後,進入下一關卡。加載資源的時候畫面是卡死的,通常在關卡載入時間較短的時候,纔會選擇這種方法。spa

 1.2  顯示進度條

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

  使用這種方式顯示進度條,會有明顯的卡頓現象,由於單個資源加載了才刷新畫面。好處就是充分利用CPU,節約加載時間,同時還能夠顯示進度條。我的感受PC上的許多遊戲就是採用這種方式(固然也有多是下面2.2的方法)。設計

2  異步加載方案

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

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

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

  這種作法比較簡單,可是在遊戲中幾乎見不到,主要有如下兩個緣由:事件

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

  二、對於非線性關卡的遊戲,這個方法不適用。資源

 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的方法比較有意思,可是須要在關卡的設計上下功夫。

相關文章
相關標籤/搜索