先看看整體,以及進度

第三天的內容,主要講根據視窗引數建立圖形背景關系設備

建立一個全屏顯示的圖形設備





這個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視窗



![]()

![]()



放入活動視窗陣列


![]()




















幾天下來,終于回傳了,創建新的圖形背景關系,并把它設定給視景器的主攝像機,





![]()
![]()
記錄新建立的視窗設備的大小



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



設定視口





















這是個回呼

更新回呼和事件回呼

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



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




好,終于第三天地完成了,
以最后一個結構體收尾

睡覺了
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/233100.html
標籤:其他
