除錯最長的一幀(第三天)

directx3d_beginner發表於2020-12-10

先看看整體,以及進度

第三天的內容,主要講根據視窗引數建立圖形上下文裝置

 

建立一個全屏顯示的圖形裝置

這個WindowingSystemInterface是純虛基類,也就是下一步就要父類呼叫子類了。

獲取或新建顯示設定

 

各成員變數

 

成員變數的各種結構體型別

 

預設設定函式

可以從系統環境變數讀

也可以從命令列讀

 

但是一定在設定影像上下文前設定好顯示設定。

 

這個顯示設定類是單例,獲取或者新建

 

獲取攝像機的投影座標系引數

讀取環境變數,按照hostName:0.0格式解析為系統的主機名稱(hostName),顯示數displayNum(在win32下必須為0)和螢幕數screenNum(0或者其他數字)

 

 

 

 

 

獲取顯示器個數

這裡轉向了子類Win32WindowingSystem

單螢幕,獲取螢幕解析度


 

列舉顯示裝置陣列(只要桌面的,不要遠端的)

根據螢幕資訊獲得寬高

 

 

現在開始新建一個顯示裝置特性例項,設定圖形視窗的特性值(根據立體顯示模式不同,視窗特性中的模板位數等參量也會有所區分)

 

建立新的圖形上下文,並將其設定給視景器的主攝像機

 

//獲取windows系統API介面的例項

 

//如果螢幕數<0,則置零

開始準備用子類Win32WindowingSystem建立圖形上下文了

根據traits->pbuffer,決定建立一個PixelBufferWin32或者GraphicsWindowWin32

 

這裡選擇了後者,只是,接下來讓人驚喜的是,這不是windows程式設計中的第一個例子,建立最簡單的windows程式麼?很熟悉啊

到此,windows視窗註冊成功。

接下來,建立GraphicsWindowWin32

 

通過基類,先建立一個事件佇列,並繫結

 

基類們的建構函式開始了

 

除了初始化變數外,也要準備多執行緒了,初始化鎖了

原來是用的臨界區,使用者級的,先初始化臨界區

 

執行緒安全引用計數

新建一個執行緒阻塞器,用途是阻塞執行緒執行,直至release()喚醒,釋放之前阻塞的執行緒

 

 

跟過去,看看如何阻塞的。把封裝後的類的偽裝都扒開。懶得去記憶這些東西。

 

 

 

這個block類的幾個成員變數 Mutex _mut;已經看過了,是個臨界區

Condition _cond;是什麼?

有個方法wait(),如何等待的?跟過去,原來是通過事件和訊號量方式

 

 

 

 

 

建構函式時就建立了這個事件,初始化完其他執行緒後啟用事件,讓等待這個事件的其他執行緒執行,

遞增訊號量的當前資源技術,每次1個。

 

還有個ScopedLock,這個鎖鎖的好,構造時建立,析構時釋放。函式體內寫就OK

 

突然感覺離題萬里了。拉回來,註冊圖形上下文特性

上鎖加圖形上下文特性

 

OpenThreads::ReentrantMutex派生於OpenThreads::Mutex

成員變數

獲取區域性儲存區的thread指標

一開始區域性儲存區為空,且上鎖數為0,所以走else

進入臨界區

返回0

賦值_threadHoldingMutex和_lockCount,


函式結束後自動析構

離開臨界區

 

賦值後,_lockCount=1,_threadHoldingMutex仍為NULL。

 

拉回來,圖形上下文陣列把當前圖形上下文加上。

這個函式結束,也析構解鎖

層層返回

新建事件佇列

開始計時

新建一個物件,記錄互動事件。並設定滑鼠Y軸朝向

關聯事件佇列和圖形上下文

 

 

 

 

 

終於回到GraphicsWindowWin32建構函式了

設定滑鼠指標

 

獲取或建立滑鼠指標

初始化,根據圖形上下文特性建立windows視窗

 

 

 

 

 

//設定畫素格式

已經註冊了視窗,直接返回

 

//設定畫素格式

關聯圖形上下文到windows視窗

 

 

 

 

 

 

 

 

 

放入活動視窗陣列

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

幾天下來,終於返回了。建立新的圖形上下文,並把它設定給視景器的主攝像機。

 

 

 

記錄新建立的視窗裝置的大小

 

 

設定主相機的透視投影引數

 

設定視口

 

 

 

 

 

 

 

 

這是個回撥

更新回撥和事件回撥

設定更新回撥和事件回撥數目

自動設定攝像機想要繪製和讀取的快取

 

 

好,終於第三天地完成了。

 

以最後一個結構體收尾

 

睡覺了

相關文章