本文属于《逐梦旅程》学习笔记系列的DirectX篇,与此系列的Windows/GDI并列。

本系列不打算深入研究DirectX而只是简单介绍DirectX中应用最广泛的部分:Direct3D

作为本篇的开篇,我们用一个最简化的示例来说明。

这个示例的完整代码可以在这里找到

https://github.com/fengyhack/DirectGame/tree/SimpleDemo

首先,Windows Application的主函数WinMain具有如下结构

App app;INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{LPCSTR lpsz = "DemoWindow";HWND hwnd = CreateSimpleWindow(hInstance, lpsz, WndProc);ShowWindow(hwnd, nShowCmd);    UpdateWindow(hwnd);                 PlaySound("NOIR3.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); //循环播放背景音乐app.Create(hwnd);MSG msg = { 0 };  while (msg.message != WM_QUIT)          {if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))   {TranslateMessage(&msg);      DispatchMessage(&msg);      }else{app.Render();}}UnregisterClass(lpsz, hInstance);  return 0;
}

基本上就是这几步,具体可以参考Windows应用程序的基本框架浅析(01)

需要注意的是消息循环

while (msg.message != WM_QUIT)
{if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))   {TranslateMessage(&msg);      DispatchMessage(&msg);      }else{app.Render();}
}

队列里的消息已经处理完毕,那么就可以进入渲染(Render)步骤。

当然,如果当前消息就是一条Update或者Paint消息的话,同样执行相应的渲染操作。

我们知道,Windows GDI/GDI+ 已经足够处理一般的绘图需求,但是对于复杂的情形,这种模式就显得有些效率底下了。

在常规的3D游戏中,绘图需求要求极高(当然还需要处理其他事务,例如用户交互,数据处理等等),需要寻求一种比

GDI/GDI+更高效的模式,尽最大限度的发挥硬件性能。

DirectX正式为此而生,它是M$的独门武器。另外还有强劲的对手OpenGL,与DirectX不同,它是开放的,但是此处不做讨论。

我们关注DirectX在3D图形(主要是指游戏开发)中的应用。

回到上述讨论。

在消息队列空闲时(可能是暂时没有外部事件,也可能是刚处理完所有消息)执行Render操作,这样更大限度的利用资源,

这样能够呈现更好的视觉效果。

同样的,在响应PAINT事件时也执行Render操作,就是说,只要可能就执行绘制操作,尽量保证“更高的帧率”(但也并非越高越好)。

关于创建Window和消息响应函数WINDOWPROC可以参见Windows应用程序的基本框架浅析(01)

我们来看看这个DirectX实例应用的具体内容

为了方便起见,我将其封装成一个类,声明如下

#include <d3d9.h>
#include <d3dx9.h>
#include <Windows.h>class App
{
public:App();~App();
public:void Create(HWND hwnd);void Render(void);void CleanUp(void);private:D3DPRESENT_PARAMETERS d3dpp;LPDIRECT3DDEVICE9 device;int width, height;
};

可以看到其中的3个public方法

void Create(HWND hwnd);
void Render(void);
void CleanUp(void);

分别表示创建、渲染、清理。

在类的析构函数中主动调用CleanUp函数以清理资源。

目前没有任何内容,因此Render函数内部是空的。

而CleanUp函数也比较简单,使用过的资源进行回收。

主要关注Create函数

void App::Create(HWND hwnd)
{RECT rect;::GetWindowRect(hwnd, &rect);width= rect.right - rect.left;height = rect.bottom - rect.top; d3dpp.BackBufferWidth = width;d3dpp.BackBufferHeight = height;d3dpp.hDeviceWindow = hwnd;LPDIRECT3D9 dx = Direct3DCreate9(D3D_SDK_VERSION);dx->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &device);dx->Release();
}

函数需要知道目标窗体的句柄HWND hwnd以及目标区域width,height(可以通过GetWindowRect(HWND,LPRECT)来获取 )

函数使用了

D3DPRESENT_PARAMETERS d3dpp;
LPDIRECT3DDEVICE9 device;

两个关键变量。

d3pp是相应的参数,device是Direct3D设备对象。

LPDIRECT3D9 dx = Direct3DCreate9(D3D_SDK_VERSION);

是DirectX3D9接口,一切由此开始。

由此创建3D(虚拟)设备dx->CreateDevice(...)

至此,一个完整的DirectX示例程序构造完毕。运行结果如下

本文原创,博文地址

http://blog.csdn.net/fengyhack/article/details/41649257

转载于:https://www.cnblogs.com/fengyhack/p/10603634.html

逐梦旅程学习笔记 DirectX开发入门01:应用程序基本框架相关推荐

  1. 逐梦旅程学习笔记 DirectX开发入门02:旋转的彩色立方体

    本文是 系列笔记DirectX部分的第2篇,上一篇参见 逐梦旅程学习笔记 DirectX开发入门01:应用程序基本框架 这个示例增加了一些实际的内容,首先是绘制一个颜色随机变幻的彩色立方体,其二是显示 ...

  2. 【逐梦旅程Windows游戏编程学习笔记 ①】基本GDI绘图

    近半年各种忙碌,一直没写博客,现在得空学习记录一下,原书为<逐梦旅程 Windows游戏编程之从零开始>毛星云编著 实现样式与功能: 实现功能: 1,显示title:"致我们.. ...

  3. Uniapp零基础开发学习笔记(5) -组件入门及容器组件使用

    Uniapp零基础开发学习笔记(5) -组件入门及容器组件使用 按照官网教程学习使用组件,并且重点把容器组件的应用进行了练习. 1.官网关于组件的介绍 组件是视图层的基本组成单元,是一个单独且可复用的 ...

  4. Hadoop学习笔记(1) ——菜鸟入门

     Hadoop学习笔记(1) --菜鸟入门 Hadoop是什么?先问一下百度吧: [百度百科]一个分布式系统基础架构,由Apache基金会所开发.用户能够在不了解分布式底层细节的情况下.开发分布式 ...

  5. iOS学习笔记-地图MapKit入门

    代码地址如下: http://www.demodashi.com/demo/11682.html 这篇文章还是翻译自raywenderlich,用Objective-C改写了代码.没有逐字翻译,如有错 ...

  6. 【学习笔记】密码学入门(2) 单向散列函数,消息认证码,数字签名,证书

    [学习笔记]密码学入门(2) 单向散列函数,消息认证码,数字签名,证书 学习笔记 2 – 混合密码系统 在密码学入门(1)中提到了基本的密码形式,对称密码和公钥密码以及混合密码系统. 这一部分将学习到 ...

  7. oracle 删除awr报告,学习笔记:Oracle awr入门 深入了解AWR报告

    天萃荷净 深入了解AWR报告,ASH与AWR报告的官方说明,数据库进程和性能视图获取 1.AWR与ASH概念 1.ASH 若是一个普通的会话(我是指没有大量地耗费资源),则对于性能调整来说无足轻重.但 ...

  8. 国产达梦数据库学习笔记(一):NeoKylin7.0安装及配置与常用基础命令

    国产达梦数据库学习笔记(一):NeoKylin7.0安装及配置与常用基础命令 以VMware Workstation Pro 15环境下的NeoKylin7.0与DM8为例 中标麒麟系统NeoKyli ...

  9. 【学习笔记】Mininet 入门

    [学习笔记]Mininet入门实战 课程介绍 Mininet是由一些虚拟的终端节点.交换机.路由器连接而成的一个网络仿真器,它采用轻量级的虚拟化技术使得系统可以和真实网络相媲美. Mininet可以很 ...

最新文章

  1. cfree运行程序错误的原因_ARM Cortex-M 系列 MCU错误代码自动追踪库的使用分享
  2. 一次bug调试经验----To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
  3. 【算法竞赛学习】数据分析达人赛3:汽车产品聚类分析
  4. Java集合中removeIf的使用
  5. SQL数据库中临时表、临时变量和WITH AS关键词创建“临时表”的区别
  6. vue 插件 滑块验证_Vue插件之滑动验证码
  7. 生活中的数学(为生活建模)(二)
  8. 函数强化练习2(py引入模块、包)
  9. SecureCRT for Mac(强大的终端SSH工具)
  10. 使用javascript 实现.net 验证控件功能
  11. atitit.错误:找不到或无法加载主类 的解决 v4 qa15.doc 艾提拉总结 attilax总结 1.1. 修改此java文件,让他启动编译,还是不能生成了新的class, 1 1.2. 查
  12. 神经网络绘图软件推荐合集
  13. 回声消除技术原理与解决办法
  14. RINEX3广播星历中的toc,toe,IODE 及时间规化
  15. 工控随笔_08_西门子_Win10安装Step7.V5.6中文版授权管理器不能正常启动
  16. win7无法查看win10工作组计算机,win7不显示工作组解决方法
  17. java 主线程与子线程的执行顺序
  18. 时区(Timezone)一览表
  19. 在 Linux 终端下生成随机/强密码的五种方法 | Linux 中国
  20. c语言编辑mapgis花纹库,MapGIS绘图步骤、图形处理—输入编辑等技巧

热门文章

  1. mixins的实用案例和常见问题
  2. Python OpenCV 彩色图像与灰度图像的转换
  3. kaggle——Santander Customer Transaction Prediction
  4. C# 调用钉钉接口进行发送企业通知消息,适应于网页版
  5. 服务器如何防御攻击,有哪些方法
  6. hdfs或hive的snappy.parquet文件查看
  7. 使用iframe时候调用钉钉要注意啦!
  8. 基于 NCF图书推荐系统 有代码+数据 可直接运行
  9. HCNA-Telnet
  10. SurfaceView在线视频播放