Direct3D Draw函数异步调用原理是如何实现的?
- 内容介绍
- 文章标签
- 相关推荐
本文共计5612个文字,预计阅读时间需要23分钟。
概述:在D3D10中,一个基本的渲染流程可以分为以下步骤:
1.清理帧缓存;
2.执行必要的绘制操作;
3.通过Device API创建所需Buffer;
4.通过Map/Unmap将数据填充到Buffer中;
5.将Buffer设置到DeviceContext中;
6.调用渲染函数。
概述在D3D10中,一个基本的渲染流程可分为以下步骤:
- 清理帧缓存;
- 执行若干次的绘制:
- 通过Device API创建所需Buffer;
- 通过Map/Unmap填充数据到Buffer中;
- 将Buffer设置到DeviceContext中;
- 调用Draw执行绘制过程;
- 调用Present提交渲染结果。
在这一过程中,不被初学者注意、然而在深入学习时定会遇到的一个特性是:D3D的Draw函数是一个异步调用。
我们知道,实际渲染的过程大部分是在GPU上完成的,CPU只负责发号施令。实际上,数据准备完成后,当你的程序调用了Draw函数后,CPU才会真正的将数据和命令提交到GPU上进行渲染。从命令提交到渲染完成通常需要数十毫秒的时间,甚至对于复杂的程序更是需要数秒的时间才能返回。如果Draw一直等到GPU渲染完成再返回并执行剩下的代码,那显然整个线程的时间都浪费在了等待GPU的结果上。
这个问题或许可以利用多线程编程来解决,但是这也意味着你的程序更加复杂了。所以在D3D中,Draw将命令发送给显卡之后立即返回,你的程序便可以接着做其它工作了,例如新渲染数据的准备、物理、逻辑、AI的计算、场景的优化等等。
本文共计5612个文字,预计阅读时间需要23分钟。
概述:在D3D10中,一个基本的渲染流程可以分为以下步骤:
1.清理帧缓存;
2.执行必要的绘制操作;
3.通过Device API创建所需Buffer;
4.通过Map/Unmap将数据填充到Buffer中;
5.将Buffer设置到DeviceContext中;
6.调用渲染函数。
概述在D3D10中,一个基本的渲染流程可分为以下步骤:
- 清理帧缓存;
- 执行若干次的绘制:
- 通过Device API创建所需Buffer;
- 通过Map/Unmap填充数据到Buffer中;
- 将Buffer设置到DeviceContext中;
- 调用Draw执行绘制过程;
- 调用Present提交渲染结果。
在这一过程中,不被初学者注意、然而在深入学习时定会遇到的一个特性是:D3D的Draw函数是一个异步调用。
我们知道,实际渲染的过程大部分是在GPU上完成的,CPU只负责发号施令。实际上,数据准备完成后,当你的程序调用了Draw函数后,CPU才会真正的将数据和命令提交到GPU上进行渲染。从命令提交到渲染完成通常需要数十毫秒的时间,甚至对于复杂的程序更是需要数秒的时间才能返回。如果Draw一直等到GPU渲染完成再返回并执行剩下的代码,那显然整个线程的时间都浪费在了等待GPU的结果上。
这个问题或许可以利用多线程编程来解决,但是这也意味着你的程序更加复杂了。所以在D3D中,Draw将命令发送给显卡之后立即返回,你的程序便可以接着做其它工作了,例如新渲染数据的准备、物理、逻辑、AI的计算、场景的优化等等。

