從零開始手敲次世代遊戲引擎(三十一)
本篇我們回歸主線。首先是將我們前面兩個Mac特別篇所寫的代碼統合進來。在這個過程當中發現幾個問題:
【1】 OpenGL環境仍然是2.1的。
查閱資料發現,這是因為Apple考慮到兼容性,預設狀態下的OpenGL環境被一律限制到2.1,而如果要使用更高的版本,需要在初始化的時候指定特別的參數,如下粗體字所示(CocoaOpenGLApplication::Initialize):
NSOpenGLPixelFormatAttribute attrs[] = {n NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,n NSOpenGLPFAColorSize,32,n NSOpenGLPFADepthSize,16,n NSOpenGLPFADoubleBuffer,n NSOpenGLPFAAccelerated,n 0n };n
注意這裡指定的是創建OpenGL Context時候的下限。實際創建的環境會有不同。比如在我的機器上,實際創建的環境是4.1的:
chenwenlideMacBook-Pro:GameEngineFromScratch chenwenli$ ./build/Platform/Darwin/MyGameEngineCocoaOpenGL.app/Contents/MacOS/MyGameEngineCocoaOpenGL nOpenGL Version 4.1 loadedn
【2】 C++部分gladGLLoader出現Segmentation Fault
需要注意的就是C++代碼部分執行OpenGL Loader(我們用的是glad)的時機。細心的讀者可能會發現,我們從零開始手敲次世代遊戲引擎(MacOS特別篇 貳)所寫的MacOS版OpenGL的程序,所使用的GraphicsManager是作為基類的GraphicsManager,而不是RHI/OpenGL裡面的OpenGLGraphicsManager。這是因為在寫前面這篇文章的時候,遇到了C++當中glad一旦Load就出現段錯誤(Segmentation Fault)。
這個問題現在解決了。原因其實和之前寫Windows版或者Linux版OpenGL程序的時候反覆強調的一個問題(好吧,我自己忘記了)一樣,就是在動態載入OpenGL函數的時候有一個前提條件,那就是OpenGL的Context已經創建並且被設置為Current Context。
所以,其實解決的方法很容易,就是在調用glad之前(也就是初始化RHI/OpenGL/OpenGLGraphicsManager之前),保證OpenGL Context創建完成並被設置為Current Context。這個工作在Cocoa版當中是CocoaOpenGLApplication的工作。我們在CocoaOpenGLApplication::Initialize當中(但是實際創建OpenGL Context的是CocoaOpenGLApplication::_openGLContext,也就是GLView,所以其實是在GLView::initWithFrame當中),靠近函數出口的地方,加入下面這麼一行代碼:
[_openGLContext makeCurrentContext];n
RHI/OpenGL/OpenGLGraphicsManager的初始化問題就可以得到解決了。
【3】除了背景,啥都沒有。
這個其實不是一個問題,因為我們還沒有將SceneManager和GraphicsManager結合起來,當然什麼都沒有了。╮(╯▽╰)╭
解決的方法就是結合SceneManager——那估計還需要好幾篇文章的篇幅,所以我們先把從零開始手敲次世代遊戲引擎(十三)寫的代碼臨時放進OpenGLGraphicsManager用用吧。
【4】沒有動畫效果。就是畫面當中的正方體不會轉動。
這是因為窗口沒有接到刷新的通知。與Windows/Linux不同,MacOS系統不會自動刷新窗口,除非窗口的大小發生改變等。解決的方法有好幾種,比如使用一個定時器定期觸發窗口更新;又比如通過DisplayLink監視屏幕的垂直同步(vsync)進行畫面的刷新(這是Apple推薦的方法)
注意使用DisplayLink的時候,監視DisplayLink的動作是發生在另外一個線程,callback也是從另外一個線程調用過來的。這裡處理不好容易發生crash。
因為後面我們還會有驅動模塊,專門負責這些定期事件的驅動和調度,我這裡就直接在App的IRuntimeModule::Tick()介面當中觸發了窗口的重新繪製事件。只不過目前我們沒有驅動模塊,是在main函數當中直接loop。
下面是Mac版的顯示效果:
以及Windows版本的顯示效果:
https://www.zhihu.com/video/914457915816046592
Linux環境
https://www.zhihu.com/video/916242332754522112結果上和從零開始手敲次世代遊戲引擎(十三)是一樣一樣的。從十三寫到三十一,我們到底幹了些啥?╮(╯▽╰)╭
參考引用
- OpenGL Application Design Strategies
- NSOpenGLView not redrawing
- Driving OpenGL Rendering Loops
- Introduction to Core Video Programming Guide
推薦閱讀:
TAG:游戏开发 |