簡介
在此次WWDC的遊戲相關視頻中,蘋果再一次展現了它非凡的技術整合和持續創新能力。除了繼續完善已有的2D遊戲框架SpritKit, 3D遊戲框架SceneKit和全新的圖形渲染API Metal 外,今年還新增加了GamePlayKit, ReplayKit和Model I/O三個新框架。
- GamePlayKit給遊戲開發者帶來了全新的遊戲架構(“實體組件系統”)和一些通用模式(比如:狀態機,Goal-agent-behavior系統等),同時它還提供了大量遊戲算法,比如尋路算法,模糊邏輯和規則系統等。
- ReplayKit可以讓玩家在遊戲中錄製遊戲視頻,並且可以添加語音評論,然後通過社交網絡分享出去。
- 而Model I/O框架,主要是用來處理3D資源和數據,同時可以給一些資源做離線處理,提高遊戲運行時性能。
SpriteKit新功能
SpriteKit是蘋果在2013年推出來的2D遊戲開發框架,它最初的設計很多來自Cocos2D-iPhone項目,特別是API方面,幾乎和Cocos2D-iPhone沒有差別。得益於此,Cocos2D用戶可以用很小的成本轉到SpriteKit上面來。
在去年的WWDC中,蘋果推出了一系列重磅級功能特性:物理集成,XCode資源打包、實時編輯器,SceneKit 3D框架,Metal圖形API等,這讓SpriteKit成爲了開發iOS/OS X平臺上的遊戲的首選遊戲框架。
今年,蘋果繼續發力,添加了3個新的節點類型,同時還完善了整個遊戲開發流程和工具鏈支持。
此類模擬遊戲裏面的照相機,它可以定義遊戲的可見視圖,同時它也是一個node,可以對它進行縮放,旋轉和平移等操作。此類是開發者繼去年WWDC後最希望實現的功能,對於實現一些大地圖的冒險類遊戲和RPG遊戲非常有幫助,可以給主角添加一個SKCameraNode子節點,然後遊戲視角就會跟隨主角的移動而移動了。另外,遊戲裏面可以支持多個SKCameraNode.
此類可以實現基於位置的音效,環境音效和沉浸性音效。可以想像一下,一顆導彈向你的主角飛過來,聲音由遠及近,當導彈離你的主角很近時,甚至可以聽到導彈尾部噴氣的聲音,這種遊戲音效會給玩家帶來非凡的聽覺感受。
此類是SpriteKit的一個亮點,它可以實現已有組件的序列化,支持數據驅動式的遊戲開發。
配合XCode,序列化的組件可以被當作遊戲資源在各個不同的工程和遊戲裏面重用。
而且它會自動Cache,同樣的文件不會被加載多次。對於一些複雜的場景和組合動作序列,當需要重用它們的時候,SKReferenceNode是個大殺器。
Metal支持
目前iOS 9全面支持Metal,已有的SpriteKit遊戲跑在iOS 9上面,不需要做任何修改即可享受Metal帶來的性能提升。如果你的設備支持Metal,那麼它就會使用Metal,反之則切換到OpenGL ES.
SpriteKit 相關工具
一個好的遊戲框架離不開一個好用的工具支持,遊戲開發者可以通過工具快速地進行迭代式開發。蘋果一直致力於完善SpriteKit的工作流,讓開發者可以更快速地開發遊戲,同時讓開發者不用關心技術細節,只需要專心遊戲玩法即可。
今年WWDC XCode工具支持方面主要有以下幾點:
- 資源分類(Asset catalog)支持,開發者可以更精確地控制不同設備使用的資源分辨率,最重要的是,玩家在下載遊戲到設備裏面時,只會下載與其設備分辨率匹配的資源。
- 按需加載資源,通過給不同的資源設備Tag,可以指定某些場景和關卡只加載特定Tag的資源。
- XCode快速預覽:支持在Playgound裏面使用Swift編寫一些測試代碼,然後快速預覽效果。不需要額外的編譯,立馬就可以看到API的使用效果,這對於測試一些API和驗證一些想法非常有幫助。
- 2D時間軸動作編輯器:這個應該算是SpriteKit的大殺器了,它是一個功能完善的2D動作編輯器,可以支持實時預覽動作效果,並且同時支持2D和3D。
- 數據驅動:SKReferenceNode可以讓可重用的遊戲組件數據化,讓玩家可以用更少的代碼來完成遊戲開發。
小結
整個SpriteKit在性能,工具和易用性方面都有了較大的提升,另外,配合SceneKit,開發者可以更容易地開發3D休閒類遊戲了。
SceneKit新功能
SceneKit是蘋果爲了讓遊戲開發者更方便地開發3D遊戲而推出來的,它支持iOS和MacOS X。
同時,它還完美支持粒子系統,物理集成和SpriteKit。今年,蘋果改進了場景編輯器,同時對Metal的支持也更加完善了。
新的場景編輯器
新的場景編輯器的功能總結如下:
- 支持更多的3D文件格式: DAE,OBJ,Alembic, STL和PLY文件格式。
- 新的原生文件格式,使用NSKeyedArchiver來存取
- Shader修改器和環境光遮蔽(Ambient Occlusoni)
- 天空盒(Skybox)和幾何修改器
- SCNTechnique支持
- 支持聲音節點
- 支持Model I/O(後面會具體介紹Model I/O是什麼)
除了這7點以外,還有諸如compute shader, relfective cub map等功能。
Metal支持和SKTransitions
新的SceneKit可以根據設備類型自動匹配是否使用OpenGL或Metal作爲渲染後端,同時它支持SpriteKit的切換場景切換,製作SceneKit場景切換效果更容易了。
Metal 新功能及性能優化
今年WWDC遊戲相關視頻中,蘋果用了3個視頻介紹了Metal的新特性以及性能優化方法,同時SpriteKit和SceneKit在iOS 9中都是默認使用Metal作爲渲染API。Metal作爲蘋果生態圈的高性能圖形渲染API,大有可能在將來某一天取代OpenGL的趨勢。
新功能介紹
這裏簡單給大家介紹一下Metal的新功能,具體的細節還需要查看相關文檔和視頻。
- 新的內存模型:它一共支持3種內存模型,分別是共享內存模型,私有內存模型和託管內存模型。
- 新的紋理壓縮格式(ASTC):
- 設備GPU 類型判斷:自動根據設備的GPU類型來判斷支持的特性集合。
- MetalKit框架:讓Metal應用開發更加簡單方便。
- Metal performance shader框架:提供了一系列數據並行算法。
- Metal調試工具:更方面地調試Metal圖形應用。
- Metal應用程序瘦身:這一點和上面介紹的SpriteKit瘦身原理是一樣的。
MetalKit框架
MetalKit對於一些常見的應用場景提供了高效的實現,開發者可以用更少地代碼來開發應用,並且開發出來的應用性能和穩定性會更高。
MetalKit提供了一個MTKView類,它統一處理了渲染一個Metal場景所需要的設置代碼,另外,它提供了一個紋理加載器,它可以從一個圖片文件中創建一個Metal紋理。最後,MetalKit完美支持Model I/O,讓3D模型的處理更加簡單。
Metal performance shader框架
Metal performance shader是一個爲GPU提供數據並行算法的一個框架,目前只支持A8處理器。
它定義了一些類似操作CPU風格的API,這樣可以讓GPU編程變得更加簡單。它提供了很多內置的並行算法,比如蘭索斯重新取樣(Lanczos resampling),卷積函數(比如高斯濾鏡等),直方圖等。
Metal調試工具和最佳實踐
衆所周知,圖形應用是非常難以調試的,而Metal在設計之初就考慮了多線程,而多線程的調試也是很困難的。因此,如果沒有好用的工具支持,調試Metal應用將會變得非常困難。
此次,蘋果圍繞Metal提供了一系列好用的工具。比如:一個可視化的幀調試器,一個資源和狀態查看器,shader性能分析工具,集成的離線Metal編譯器等。
讀者可以根據WWDC中關於Metal性能優化的視頻去了解更多詳細的信息。
另外,蘋果給我們定義了一些最佳實踐:
- 要儘早分析和經常分析代碼
- 在最合適的時機去獲得Drawable對象。
- 儘可能基於GPU去考慮多線程渲染。
- 提前創建好一些耗時的對象並儘可能地重用這些對象,提前編譯好着色器程序。
小結
Metal已經成了蘋果在3D圖形渲染的一張王牌,它的性能遠超OpenGL,開發者應該全面擁抱它,利用它來開發出性能更好的圖形應用和遊戲。同時,使用Metal,也可以用更少的代碼來編寫圖形應用,另外,它也會讓你的程序會更容易維護。
GamePlayKit介紹
GamePlayKit是今年WWDC遊戲開發方面最大的亮點,它提供的實體組件系統將直接改變之前以繼承爲主的開發遊戲方式。另外,還爲遊戲開發提供了大量實用的算法與設計模式,iOS遊戲開發從未如此簡單。
實體組件系統
實體組件系統是一種非常流行和先進的組織遊戲邏輯的方式,採用它編寫的遊戲代碼,更容易維護,更容易擴展,同時也更加靈活。
-
GKEntity
在實體組件系統裏面,所有的遊戲對象都被組織成遊戲實體(GKEntity),它只是一個組件(GKComponent)容器,可以在遊戲過程中動態地添加和刪除遊戲組件。並且可以通過組件類型來訪問組件並更新所有組件。 -
GKComponent
GKComponent是所有遊戲組件的基類,它負責存儲遊戲數據,同時會隨着實體的Update方法來更新自身的狀態。所有的遊戲邏輯被放置在updateWithDeltaTime
方法中。 -
GKComponentSystem
組件系統是處理組件的容器,它包含了所有同種類型的組件,並通過統一的邏輯來處理這些組件。組件系統並不關心實體,它會透明地對象所有同種類型的組件並更新其狀態。
尋路算法
尋路算法可以讓你指定一些節點生成一個雙向連接圖,然後可以通過簡單的API調用找到任意兩個點之間的最優路徑。所有的有向圖的基類是GKGraph,它是一個抽象類。它提供一些共用的邏輯,比如動態地添加和刪除節點,連接這些節點並找到任意兩個節點之間的路徑。
此外,GamePlayKit還提供了兩種特殊類型的圖節點:GKGridGraph和GKObstacleGraph。GKGridGraph非常適合2D遊戲裏面的路徑查找。而GKObstacleGraph則可以設置一些障礙物,節點在尋路的時候,這些障礙物是無法穿越的。SKNode的邊界,物理剛體和紋理都可以當作障礙物。
狀態機
狀態機是遊戲玩法的骨架,遊戲本身就是由一系列的狀態機組成的。比如主角動畫,AI狀態,UI切換,關卡切換等,這些都可以使用狀態機巧妙地解決。
GamePlayKit通過封裝了GKStateMachine和GKState類,把一些共用的邏輯全部抽象出來了,開發者再也不用爲每一個遊戲去開發單獨的狀態機了。
Agent指的是會自已移動的遊戲實體,它們通過Goal和Behavior來驅動自身的邏輯。Behavior是由一系列的Goal組成的,每一個Goal都包含有相應的權重。Agent在與玩家進行遊戲交互的時候,可以表現得更像人類,因爲它們也會做決策。
以往只有在一些很複雜的遊戲裏面纔會看到的AI,如今通過GamePlayKit,我們可以非常輕鬆地給自己的遊戲也添加了。通過給遊戲裏面的怪物添加一些AI,能夠極大地增強遊戲的趣味和粘性。
AI 策略(MinMax AI)
MinMax AI主要用於一些回合類遊戲,比如象棋,圍棋,Tic-Tac-Toe等。它還能給人類玩家提供一些建議,比如告訴你下一步棋該怎麼下。另外,通過計算時間的設置,AI可以定義不同的難度等級。
規則系統
規則系統可以讓你製作更加複雜的遊戲AI,遊戲世界的交互不再是“黑即是黑,白即是白”,而是以事先定義好的一定的規則去交互。遊戲AI可以實現所謂的模糊邏輯,遊戲怪物的活動可以根據定義好的規則系統去動態地調整和評估自己的行爲。
隨機數發生器(Random Sources)
每個遊戲都有一些特別的隨機數生成需求,而rand()函數只能生成一些僞隨機數,並且可能跟平臺實現還有一些出入。作爲開發者,我們需要一個與具體平臺無關的隨機數生成器,另外這個隨機數生成器還能產生符合一定數學分佈的隨機數。
Demobots示例
這是一個非常有價值的遊戲demo,裏面幾乎涉及了GamePlayKit裏面的大部分技術,是一個值得深入學習的遊戲示例。這裏是 下載鏈接
小結
實體組件系統不是蘋果的原創,但是這一次GamePlayKit巧妙地整合了已有的遊戲開發框架,iOS遊戲開發變得從未如此簡單和有效。配合強大的Swift和Xcode支持,更加如虎添翼。
ReplayKit和 Game Center
ReplayKit可以讓玩家在遊戲中錄製遊戲視頻,並且可以給這些視頻添加語音評論並且通過社交網絡分享出去。另外Game Center允許訪客模式,並且整合了產品服務器和沙盒服務器,這樣測試和開發基於Game Center的遊戲就變得更加簡單了。
ReplayKit只有在iOS 9才能使用,另外開發者可以定製是自動在某些遊戲場景開啓視頻錄製還是讓玩家自己選擇錄製時機。錄製完的視頻還可以被編輯和預覽,從此玩遊戲不再孤單。
另外,訪客模式是不需要取得認證即可參與遊戲的,訪客不會取得任何遊戲成就,也不可以發佈遊戲得分。開啓訪客模式的遊戲,玩家只能與其它運行iOS 9的玩家進行遊戲。
Model I/O模塊介紹
Model I/O是用處理3D資源和數據的框架,我們可以通過Model I/O快速地加載和導出3D資源文件。另外,它集成在Xcode裏面並且和可以非常容易地與GameKit API配合.
它的主要功能特性如下:
- 支持多種3D文件格式的
- 可以對資源進行修改和Bake
- 支持3D模型三維像素化(Voxels)
- 集成Playground, Swift和Finder,並且能夠在Finder的Quick look裏面預覽資源。
- 支持基於物理的材質和光照
總結
從本次蘋果對遊戲開發所做的改進來看,休閒社交遊戲仍然是其主推的遊戲類型。不過有了Metal的支持,在MacOS X開發AAA遊戲也是完全有可能的。另外,主流的遊戲廠商Unity和Unreal都聲稱直接了Metal,相信以後蘋果生態圈裏面會出現更多高品質的遊戲。
另外,隨着虛擬現實和現實增強的火爆,相信在不久的將來,蘋果也可能推出自家的VR設備。到時候,這些遊戲開發框架和工具必將是您開發蘋果VR遊戲的首選。