游戏开发论坛

 找回密码
 立即注册
搜索
查看: 9520|回复: 8

DirectX 中的 Device->BeginScene() 和 Device->EndScene()

[复制链接]

21

主题

112

帖子

118

积分

注册会员

Rank: 2

积分
118
发表于 2009-1-13 08:38:00 | 显示全部楼层 |阅读模式
Device->BeginScene()

????

Device->EndScene()。。。。



在 Device->BeginScene() 和 Device->EndScene() 之间,是不是只写“绘图函数”??如果在他们之间,放置一些“非绘图函数”,是否会影响程序性能??



在很多情况下,我们往往是这样做的:计算---绘一部分图形--计算---绘制另一部分图形,也就是说,我们的图形不是一次绘制完成的,在中途要经过计算,比如,设置各种 State ,重置 Metrix,重置 ViewPort。。。。。。这样的话,我们的每一个最终画面,都要经过很多次绘制。。。



那么,我们该如何组织代码才能把程序的性能提高呢???

我们的渲染部分代码应该这样吗???



Void Render()

{      

     CalcPart1()

     Device->BeginScene()

     DrawPart1()

     Device->EndScene()。。。。



     CalcPart2()

     Device->BeginScene()

     DrawPart2()

     Device->EndScene()。。。。



...................

     

     CalcPartN()

     Device->BeginScene()

     DrawPartN()

     Device->EndScene()。。。。

}


64

主题

272

帖子

272

积分

中级会员

Rank: 3Rank: 3

积分
272
发表于 2009-1-13 09:00:00 | 显示全部楼层

Re:DirectX 中的 Device->BeginScene() 和 Device->EndScene() 到底

BeginScene()跟EndScene()是把数据写到显存,然后Present才绘制到显示器上,所有
Void Render()
{      
     Device->BeginScene()

     写到显存

    Device->EndScene()。。。。
   
    Device-&gtresent(NULL,NULL,NULL,NULL);
}
效率要提高是尽量减少运行时的计算,可以离线计算的尽量离线计算吧。

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2009-1-13 16:36:00 | 显示全部楼层

Re:DirectX 中的 Device->BeginScene() 和 Device->EndScene() 到底

BeginScene和EndScene只是维护了一个DX内部的状态块,在这个范围内的绘制操作不会因为设备丢失等问题失败,而等到EndScene时才检查报错,一方面减少了错误检查的开销,一方面避免我们对每个D3D调用检查错误。

之间的所有绘制命令被编码放入命令队列,等待显卡驱动来读取执行。而Present会等待显卡驱动将命令缓冲里的数据取走。

所以BeginScene和EndScene之间可以做其他操作,一般不会影响性能,但不要过多的使用,一般一对就足够了。

不过从架构上,Update和Render分成两步做是个好习惯。

21

主题

112

帖子

118

积分

注册会员

Rank: 2

积分
118
 楼主| 发表于 2009-1-13 16:51:00 | 显示全部楼层

Re:DirectX 中的 Device->BeginScene() 和 Device->EndScene() 到底

哦。。。。了解了。。。
Device->BeginScene() 和 Device->EndScene() 在渲染过程中只使用一次,频繁使用会影响性能(而且也没有必要)
运算和D3D渲染分开(尽一切可能分开。。)

20

主题

136

帖子

172

积分

注册会员

Rank: 2

积分
172
发表于 2009-1-13 17:21:00 | 显示全部楼层

Re:DirectX 中的 Device->BeginScene() 和 Device->EndScene() 到底

To enable maximal parallelism between the CPU and the graphics accelerator, it is advantageous to call EndScene as far ahead of calling present as possible.

21

主题

112

帖子

118

积分

注册会员

Rank: 2

积分
118
 楼主| 发表于 2009-1-13 22:38:00 | 显示全部楼层

Re:DirectX 中的 Device->BeginScene() 和 Device->EndScene() 到底

我英语很烂哇。。。
loserwang 兄弟啊,你这段话的意思是不是:

要在 CPU 和 图形加速器(显卡??) 之间达到最大并行(parallelism:并行??),在调用 Present 之前尽量远的地方调用 EndScene 是很有利的。。。

我们一般的调用顺序是:

EndScene();
Present();

在我写的所有 DirectX 程序中,这两行都是在一起的。。。

你的意思是:

EndScene();
DoSomeThing();
Present();

让 EndScene() 和 Present() 之间的“距离”尽量远些???

8

主题

390

帖子

390

积分

中级会员

Rank: 3Rank: 3

积分
390
发表于 2009-1-14 09:03:00 | 显示全部楼层

Re:DirectX 中的 Device->BeginScene() 和 Device->EndScene() 到底

说直白一点,当你调用EndScene后,GPU就会进行大量计算,各种偷懒延迟计算都会此时进行真正的计算,如果你在EndScene之后立刻调用Present,那么CPU就会空转浪费大量的time slice进行等待GPU完成任务。
所以最好的办法时程序一上来就调用EndScene,然后计算ai,计算图形,计算网络,计算物理,这个时候估计gpu改干完活了,调用Present,几个毫秒就马上返回了。。。。。

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2009-1-14 11:13:00 | 显示全部楼层

Re:DirectX 中的 Device->BeginScene() 和 Device->EndScene() 到底

准确的说:Present并不等待BeginScene()和EndScene()之间的操作完成,而是如果GPU仍然没有完成上一帧的渲染的话等待其完成并取走当前帧的命令队列内容。GPU的执行一般是滞后CPU一帧的,当GPU负载成为瓶颈时,CPU在Present()时等待就白白浪费了CPU处理能力,所以在Present()之前做其他处理可以更有效的利用CPU。

另外GPU不是在EndScene时开始工作,而是有命令就工作,这个时机一般是D3D命令缓冲满或强制flush时,只是碰巧EndScene也会flush命令缓冲。

21

主题

112

帖子

118

积分

注册会员

Rank: 2

积分
118
 楼主| 发表于 2009-1-14 11:29:00 | 显示全部楼层

Re:DirectX 中的 Device->BeginScene() 和 Device->EndScene() 到底

哇。。意外的知道了 Present 的一些“玄机”。。。受教了,谢谢各位
以后在组织 DirectX 的代码时,要根据这些东西进行优化啊。。恩。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 12:43

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表