我观察源代码发现,Blitz3D使用了DirectDraw , DirectShow和Direct3D 7 这三个API,文本渲染,绘制图片等操作是由DirectDraw完成的,而光照,模型加载这些则是通过Direct3D 7 完成的,像视频播放是由DirectShow完成的。
问题来了: Direct3D 7太过时了,以至于现在的一些高端显示卡无法识别到,进而导致游戏帧数大幅度下降,如果用Direct3D 9去替换Direct3D 7的话,还要面临着DirectDraw的问题,DirectDraw和Direct3D 9是无法同时使用的,并且根据微软文档的说明:
所以,抛开DirectShow不谈,光是要把DirectDraw全部换成Direct3D 9就十分头疼,目前我有几套"可能"有希望给Blitz3D换血的方案:
1.重写整个gxruntime
简单来说,就是把gxruntime里所有关于DirectDraw,DirectShow及Direct3D7相关的东西全部删掉,然后用新的图形API去写
不过我实际实践时遇到了问题:我把gxruntime里的关于DirectDraw,DirectShow及Direct3D7相关的东西全部删掉后,我写了一个清屏函数来进行测试,结果显示程序运行时报错:图形初始化失败,然后我修改了代码后又运行程序发现程序出现了一个Debugger后就消失了,我怀疑可能是我在动gxruntime时,触碰到了Blitz3D自带的框架里的报错系统,导致程序无法运行,所以,如果能了解Blitz3D的框架,这个方案是有可能成功的。
2.通过Userlibs
其实就是通过Blitz3D的Userlibs,重新创建一个窗口,比如:我用SDL写了一个名为SimpleWindow的Userlibs,里面有一个函数:SW_CreateWindow%(w%,h%),而我在Blitz3D中使用时,它会创建两个窗口,一个是Blitz3D自带的Win32写的窗口,一个是我用SDL写的SimpleWindow的Userlibs的窗口,之后再用Userlibs的窗口来使用其他的图形API据可以了,理论上来说:Blitz3D的窗口运行D3D7,我们的窗口用OGL,两者是互不影响的。
实践遇到的问题:但是,我实践的结果是,Blitz3D会报错:Memory Access Violation(内存访问冲突!),很明显,即使在另一个窗口上,Blitz3D依然会认为它俩冲突了。
3.通过编译器,汇编,底层等东西,从零实现一个新的Blitz3D
虽然,但是,这是最有希望的一个方案了,如果你编程经验丰富并且精通C\C++,编译器,汇编,底层等东西,你可以自己实现一个Blitz3D的编译器,然后再用新的图形API去写.
问题:普通人能同时精通C\C++,汇编就算了不起了,真要这么搞的话,要花费大量时间来学习这些东西。