逐梦旅程学习笔记 DirectX开发入门01:应用程序基本框架
本文属于《逐梦旅程》学习笔记系列的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:应用程序基本框架相关推荐
- 逐梦旅程学习笔记 DirectX开发入门02:旋转的彩色立方体
本文是 系列笔记DirectX部分的第2篇,上一篇参见 逐梦旅程学习笔记 DirectX开发入门01:应用程序基本框架 这个示例增加了一些实际的内容,首先是绘制一个颜色随机变幻的彩色立方体,其二是显示 ...
- 【逐梦旅程Windows游戏编程学习笔记 ①】基本GDI绘图
近半年各种忙碌,一直没写博客,现在得空学习记录一下,原书为<逐梦旅程 Windows游戏编程之从零开始>毛星云编著 实现样式与功能: 实现功能: 1,显示title:"致我们.. ...
- Uniapp零基础开发学习笔记(5) -组件入门及容器组件使用
Uniapp零基础开发学习笔记(5) -组件入门及容器组件使用 按照官网教程学习使用组件,并且重点把容器组件的应用进行了练习. 1.官网关于组件的介绍 组件是视图层的基本组成单元,是一个单独且可复用的 ...
- Hadoop学习笔记(1) ——菜鸟入门
Hadoop学习笔记(1) --菜鸟入门 Hadoop是什么?先问一下百度吧: [百度百科]一个分布式系统基础架构,由Apache基金会所开发.用户能够在不了解分布式底层细节的情况下.开发分布式 ...
- iOS学习笔记-地图MapKit入门
代码地址如下: http://www.demodashi.com/demo/11682.html 这篇文章还是翻译自raywenderlich,用Objective-C改写了代码.没有逐字翻译,如有错 ...
- 【学习笔记】密码学入门(2) 单向散列函数,消息认证码,数字签名,证书
[学习笔记]密码学入门(2) 单向散列函数,消息认证码,数字签名,证书 学习笔记 2 – 混合密码系统 在密码学入门(1)中提到了基本的密码形式,对称密码和公钥密码以及混合密码系统. 这一部分将学习到 ...
- oracle 删除awr报告,学习笔记:Oracle awr入门 深入了解AWR报告
天萃荷净 深入了解AWR报告,ASH与AWR报告的官方说明,数据库进程和性能视图获取 1.AWR与ASH概念 1.ASH 若是一个普通的会话(我是指没有大量地耗费资源),则对于性能调整来说无足轻重.但 ...
- 国产达梦数据库学习笔记(一):NeoKylin7.0安装及配置与常用基础命令
国产达梦数据库学习笔记(一):NeoKylin7.0安装及配置与常用基础命令 以VMware Workstation Pro 15环境下的NeoKylin7.0与DM8为例 中标麒麟系统NeoKyli ...
- 【学习笔记】Mininet 入门
[学习笔记]Mininet入门实战 课程介绍 Mininet是由一些虚拟的终端节点.交换机.路由器连接而成的一个网络仿真器,它采用轻量级的虚拟化技术使得系统可以和真实网络相媲美. Mininet可以很 ...
最新文章
- cfree运行程序错误的原因_ARM Cortex-M 系列 MCU错误代码自动追踪库的使用分享
- 一次bug调试经验----To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
- 【算法竞赛学习】数据分析达人赛3:汽车产品聚类分析
- Java集合中removeIf的使用
- SQL数据库中临时表、临时变量和WITH AS关键词创建“临时表”的区别
- vue 插件 滑块验证_Vue插件之滑动验证码
- 生活中的数学(为生活建模)(二)
- 函数强化练习2(py引入模块、包)
- SecureCRT for Mac(强大的终端SSH工具)
- 使用javascript 实现.net 验证控件功能
- atitit.错误:找不到或无法加载主类 的解决 v4 qa15.doc 艾提拉总结 attilax总结 1.1. 修改此java文件,让他启动编译,还是不能生成了新的class,	1 1.2. 查
- 神经网络绘图软件推荐合集
- 回声消除技术原理与解决办法
- RINEX3广播星历中的toc,toe,IODE 及时间规化
- 工控随笔_08_西门子_Win10安装Step7.V5.6中文版授权管理器不能正常启动
- win7无法查看win10工作组计算机,win7不显示工作组解决方法
- java 主线程与子线程的执行顺序
- 时区(Timezone)一览表
- 在 Linux 终端下生成随机/强密码的五种方法 | Linux 中国
- c语言编辑mapgis花纹库,MapGIS绘图步骤、图形处理—输入编辑等技巧