从头学习DirectDraw
【IT168 技术文档】在开始学习DirectDraw编程之前,有一些题外话要说明,以下内容均是个人的心得和体会,如果其中有什么谬误之处,敬请谅解,同时个人不对可能造成的后果负责。
以下几点是在编制DirectX应用程序时应该注意的:
尽管使用VB或DELPHI都可以制作DirectX应用程序,但考虑到代码的效率,还是应使用C或C++。其中,C++是面向对象的编程语言,可以使你的程序更易于维护,如果再考虑到代码的兼容性,我推荐使用Microsoft Visual C++ 5.0集成开发环境。当然,使用Borland C++ 5.0也是一个不错的选择。
你应该已经有编制Windows应用程序的经验,以及C++的基础。
熟悉你将要使用的编程工具的运用。例如,如何为集成开发环境设置各种参数,以及编译程序和连接程序的命令行参数。
确认你已下载了微软的DirectX 5.0 SDK中的相关文件,特别是头文件和库文件,这些都是编程所必需的。
确认你已经安装了DirectX 5.0或更高版本的运行时刻库,因为本教程的所有程序均使用了DirectX的新接口(Interface),必须要5.0或更高版本支持。
DirectDraw是什么?
DirectDraw是DirectX中的关于视频输入输出的基本部分,使用DirectDraw可以方便地编制出高效的视频处理程序,只要用户的硬件支持DirectDraw,就能保证你的代码可以处理它们。
简单地说,一个DOS程序员可以方便地直接访问视频显存,从而高效地处理视频动画,而在Windows的32位环境中,使用DirectDraw可以做类似的工作(而且做得更好)。例如,在DOS环境中的320x200x256色图形模式中,你可以通过在地址A000:0000开始处的一片内存区进行直接读写的方式来处理视频操作,而在Windows环境中,DirectDraw也提供一片内存区供你直接读写,使你能更好地完成相似的操作。
当然,DirectDraw提供的远不止这些,但一个游戏程序员可能更关心如何直接访问视频显存,以及如何高效地完成位块拷贝操作等等。
让我们从消息循环开始
DirectX最初是为游戏开发而推出的,编制游戏的程序员都很贪婪,他们会尽量榨取系统资源,并试图让自己的程序永远具有最高的效率。但Windows是一个多任务的操作系统,当它发现所有的程序都处于空闲时,便会减少给这些程序的资源,其中之一就是开始清理交换文件,为了让自己的程序给Windows以始终繁忙的假象,不妨用一些新的代码来代替常规的方法。
这是常规的消息循环处理
while(GetMessage(&msg,NULL,NULL,NULL)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
//---------------
这是改进的消息循环处理:
for(;;){
if(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE)){
if(msg.message==WM_QUIT) break;
TranslateMessage(&msg);
DispatchMessage(&msg)
}else{
if(AppPaused) WaitMessage();
else{
// 这里进行任何不基于消息循环的处理
// 例如动画制作
}
}
}
return msg.wParam;
上例中,新的消息循环处理方式使得Windows认为程序始终繁忙,从而提高了程序的性能。注意,其中的AppPaused变量为真时表示程序未在前台运行,该变量的取值为WM_ACTIVATEAPP消息的wParam参数。