除錯最長的一幀(第三天)
先看看整體,以及進度
第三天的內容,主要講根據視窗引數建立圖形上下文裝置
建立一個全屏顯示的圖形裝置
這個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視窗
放入活動視窗陣列
幾天下來,終於返回了。建立新的圖形上下文,並把它設定給視景器的主攝像機。
記錄新建立的視窗裝置的大小
設定主相機的透視投影引數
設定視口
這是個回撥
更新回撥和事件回撥
設定更新回撥和事件回撥數目
自動設定攝像機想要繪製和讀取的快取
好,終於第三天地完成了。
以最後一個結構體收尾
睡覺了
相關文章
- 最難忘的Bug除錯經歷除錯
- 打造最舒適的 webview 除錯環境WebView除錯
- 機器學習最困難的部分:超引數除錯機器學習除錯
- CSMA/CD 以太幀最小幀長計算問題
- 除錯一記除錯
- 除錯的第一個Jdon出錯資訊除錯
- 【除錯】SystemTap除錯網路卡狀態一例除錯
- 7B最強長影片模型! LongVA影片理解超千幀,霸榜多個榜單模型
- 除錯Kubernetes工作負載的最簡單方法 - Martin除錯負載
- 字串最後一個單詞的長度字串
- 除錯篇——除錯物件與除錯事件除錯物件事件
- 最長
- Kafka除錯入門(一)Kafka除錯
- 記一次除錯除錯
- javascript刪除字串中的最後一個字元JavaScript字串字元
- Laravel 一個簡單的除錯工具Laravel除錯
- Android除錯工具-ADB史上最強介紹Android除錯
- iOS比優雞除錯技巧篇(一):reveal檢視除錯iOS除錯
- React-native 一款很不錯的除錯工具React除錯
- 關於weblogic pool 一錯誤除錯Web除錯
- DS4700除錯一則除錯
- Visual Studio的八個除錯建議:像老大哥一樣除錯除錯
- Eruda 一個被人遺忘的除錯神器除錯
- 第一個Java卡應用的除錯Java除錯
- 一個有點深度的shell BUG除錯除錯
- 【每日一題】無重複字元的最長子串每日一題字元
- C#刪除字串最後一個字元C#字串字元
- JavaScript刪除陣列最後一個元素JavaScript陣列
- css刪除最後一個邊界線CSS
- JavaScript 刪除陣列最後一個元素JavaScript陣列
- JS 刪除字串最後一個字元的幾種方法JS字串字元
- Windows windbg kernel debug 雙機核心除錯 - USB3.0 除錯 USB除錯 除錯線Windows除錯
- [翻譯] 除錯 Rxjs(一):工具除錯JS
- 【除錯】ftrace(一)基本使用方法除錯
- iOS 下如何一鍵除錯 PushiOS除錯
- Flutter Tools的除錯Flutter除錯
- chrome的除錯技巧Chrome除錯
- ABAP巨集的除錯除錯