终于在REDirectUI中添加了D3D渲染方式,这只是底层渲染方式,仅作为第一步。启动渲染引擎时并不要求一定要使用D3D,只在显式指定使用D3D且机器具备硬件加速能力的情况下才使用D3D,否则仅使用DDRAW。
由于这只是UI引擎,并非为游戏而设计,因此更多的CPU时间用来处理标准窗口消息,而不是循环render frame。游戏的目的是处理大量的渲染细节,因此通常都是贴图再贴图,游戏程序员通常不考虑GDI,但REDirectUI非得考虑GDI不可,因为作为一个UI引擎,必须支持普通的子窗口和大量的ActiveX控件,这些东东都是以GDI为基础的。好在REDirectUI已经完美解决了GDI和D3D的结合问题,通过使用GDI桥(从未使用Sprite和D3DXFont),解决了用Sprite字体效果远不如GDI字体效果丰富的困惑,并且GDI桥的性能已经过极大优化。
* 选择D3D9的原因是,D3D9是最稳定最基础的版本,没有过多的高级封装。顶点着色器将在XML描述中支持,未来还将增加D2D在D10平台上提高性能。
* 大量使用MMX/SSE/SSE2/3DNow指令,用于解决GDI和D3D之间的快速沟通,测试性能良好,处理一张1024*768大小的32位位图所耗费的时间平均仅几毫秒。
* 在3D特性启动的情况下,UI元素的渲染是异步队列化执行的,任何UI元素随用随画,无需考虑是否放到WM_PAINT中完成。
* 除了某些矩阵变换API和静态纹理加载工具,所有其它D3DX的高级接口和封装工具都不使用,包括D3DXSprite和D3DXFont。
目前完成的只是3D最基础的渲染部分,用脚本控制3D场景和3D对象的工作尚未开始,3D-DOM还未构造,一旦这个特性完成,使用纯JS脚本就可以设计一套不错的3D游戏。
还是一句老话:REDirectUI必须是小巧而高性能的。这也是选择D3D9中最基础部分的原因。
特此留存,以备查询。