调试最长的一帧(第三天)

先看看整体,以及进度

第三天的内容,主要讲根据窗口参数建立图形上下文设备

 

建立一个全屏显示的图形设备

这个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窗口

 

 

 

 

 

 

 

 

 

放入活动窗口数组

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

几天下来,终于返回了。创建新的图形上下文,并把它设置给视景器的主摄像机。

 

 

 

记录新建立的窗口设备的大小

 

 

设置主相机的透视投影参数

 

设置视口

 

 

 

 

 

 

 

 

这是个回调

更新回调和事件回调

设置更新回调和事件回调数目

自动设置摄像机想要绘制和读取的缓存

 

 

好,终于第三天地完成了。

 

以最后一个结构体收尾

 

睡觉了

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值