先说点闲话:
小弟北漂,下班点时候,人堵。
6点下班,8点左右回家吧,这中间的时候,就来重复造轮子了。(别喷我)
其实起因还是有的,我就职于一家MMO游戏公司,公司算是成功吧,起码发工资的日子不愁被延迟。
我做客户端的,觉得公司游戏里面的界面的实现,接口什么的,用着都很爽。
当下比较出名的directui,应该算是duilib吧。我看了一下源码,觉得代码不是很好懂(我去年毕业,可能对读代码这属性点加少了。)。于是就萌生了自己写一个directui的念头。
既然要做,就做个牛逼的哈。我的计划是库的使用者,不用关心里面的窗口,控件是怎么实现的。只需要知道窗口、控件提供的接口,就能进行工作。
e.g.
IWnd* wnd = _WndMng->FindWindow(L"main_wnd");///< 把wnd和id为“main_wnd”的窗口绑定起来
wnd->ShowWindow(true);///< 显示窗口
wnd->SetPosition(pt.x, pt.y); ///< 设置窗口位置
IButton* btn = InitControl(wnd, L"btnOK"); ///< 把btn和wnd窗口下的id为btnOK的按钮控件绑定起来
btn->Enable();
btn->ShowWindow(true);
btn->SetToolTips(L"我是OK按钮");
……
我就不一一列举了。
库完成之后,会打算开源。看官门到时候可以看看里面的设计和实现。
在说一下用这个库,写的应用程序的初始化过程:
我的设计思路是:通过xml来配置layout,在程序加载的时候,读取所有的layout,把里面的窗口,控件解析,并且new出来(当然会有内存池实现),交给自己写的一个窗口管理器来管理。没有使用类似于MFC的BEGIN_MESSAGE_MAP等方式来声明回调。自己写定义了一个closure,包含了窗口类的对象和回调的函数的地址,达到对鼠标,键盘等消息回调的目的。每个窗口会捕捉到消息,但是不会处理,而是转换成自己定义的消息,塞进窗口管理器的消息队列,然后由窗口管理器来分发消息,最后当然是各个控件来处理消息。
这上面的大部分已经写完了。只剩下窗口的绘制部分。
所以一直在琢磨着,用D3D或者D2D来绘制。
这到了我最疼的地方了。
虽然我是做游戏的,可是我没有系统地学习过图形学。游戏引擎的渲染绘制部分的工作,基本都交给引擎组了。作为引擎的用户,我只能简单地 call,call,call……
一个应用程序,只能初始化一个D3D对象,但是应用程序的UI不同于游戏,只需要(只有)对一个窗口渲染绘制就OK了,对于有多个窗口的应用程序,怎么能让这个D3D对象被多个窗口所共享?
据说SWAP CHAIN可以达到目的。但是实在是不会用。各位有没有好的资料?
对D3D熟悉的猿友给点解决方案提示?