[TL] {技术}{游戏}窗口模式下游戏会很卡

146 views
Skip to first unread message

jee

unread,
Dec 28, 2009, 9:22:28 AM12/28/09
to pon...@googlegroups.com
测试机器是一台笔记本,同一个游戏全屏模式下没有问题, 但是一旦进入窗口模式就会出现掉帧的问题

虽然正式版不会有窗口模式,但是还是想知道原因

wang carl

unread,
Dec 28, 2009, 12:00:12 PM12/28/09
to pon...@googlegroups.com
D3D全屏下是“独占模式”,一般会快一些。

也有可能在程序主循环的某个地方,判断如果是窗口状态,然后Sleep一小会儿或Sleep(0)(很多3D引擎都使用后者),这样时间片就少了。

猜想猜想……睡觉!

2009/12/28 jee <houj...@gmail.com>

beck917

unread,
Dec 28, 2009, 8:40:11 PM12/28/09
to pon...@googlegroups.com
是不是因为桌面色彩数量的原因...

jee

unread,
Jan 1, 2010, 5:17:58 AM1/1/10
to pon...@googlegroups.com
看来这边做游戏的同仁不多啊

2009/12/29 beck917 <bec...@gmail.com>:
> 是不是因为桌面色彩数量的原因...
>

--
侯健-用最大的努力 争取最大的成功

sili zhao

unread,
Jan 1, 2010, 12:00:24 PM1/1/10
to pon...@googlegroups.com

我做这方面的,我猜是这样的,在窗口模式下,有一些程序会调用系统API来绘制界面刷新,而游戏也会,这些API估计一个时刻只能有一个线程(进程)进入,就是所有调用之间是串行的,这样如果有两个程序都是1?ms(一般游戏会限制在60FPS)刷新一次屏幕的话,有可能就会产生资源竞争,导致游戏卡掉帧。
 
而在全屏模式下,因为是独占的,就不会有这个问题了。
2009/12/28 jee <houj...@gmail.com>

est

unread,
Jan 2, 2010, 8:12:38 AM1/2/10
to pon...@googlegroups.com
还有一个可能的原因就是chrome这种用opengl绘图的软件,在窗口模式下窗口没最小化玩3D游戏会卡。

2009/12/28 jee <houj...@gmail.com>:

redsea

unread,
Jan 3, 2010, 1:31:45 AM1/3/10
to TopLanguage

On Jan 2, 1:00 am, sili zhao <zhaos...@gmail.com> wrote:
> 我做这方面的,我猜是这样的,在窗口模式下,有一些程序会调用系统API来绘制界面刷新,而游戏也会,这些API估计一个时刻只能有一个线程(进程)进入,就是所有调用之间是串行的,这样如果有两个程序都是1?ms(一般游戏会限制在60FPS)刷新一次屏幕的话,有可能就会产生资源竞争,导致游戏卡掉帧。

你这个说法, 对 vista, windows 7 的 wddm 模式, 应该有一些关系, 如果是 xp, 那么应该不是这个, 显卡 d3d
全屏模式和窗口模式性能就不一样的.

> 而在全屏模式下,因为是独占的,就不会有这个问题了。
> 2009/12/28 jee <houjm...@gmail.com>

OxFAN

unread,
Jan 3, 2010, 3:41:14 AM1/3/10
to pon...@googlegroups.com
我的也是本子,玩街霸4的时候窗口模式下很卡,全屏下就比较流畅...
直接原因就是显示模式不一样吧...  具体等高人发言...

2010/1/3 redsea <red...@gmail.com>

sili zhao

unread,
Jan 3, 2010, 5:26:02 AM1/3/10
to pon...@googlegroups.com
我观察下来XP也有这种问题,我写的一个程序用了D3D,在非全屏的情况下,如果MSN右下角出半透明弹窗的时候,我的程序就会卡而掉帧。
 
至于网上很多人说D3D窗口模式和全屏模式性能有差距,我在自己的程序里面倒是感觉不出来。
不过想想应该也会有差距,窗口下还要绘制除了游戏程序之外的其他东西,肯定会有一部分开销在这上面,而全屏下这部分开销就没有了。
2010/1/3 redsea <red...@gmail.com>

wang xin

unread,
Jan 3, 2010, 1:21:20 PM1/3/10
to pon...@googlegroups.com

beck917

unread,
Jan 4, 2010, 3:13:32 AM1/4/10
to pon...@googlegroups.com
难道wow那个奇怪的窗口全屏就是因为这个?

jee

unread,
Jan 8, 2010, 10:59:00 AM1/8/10
to pon...@googlegroups.com
“显卡 d3d 全屏模式和窗口模式性能就不一样的.”
这又是为什么呢? 难道绘制其他窗口这么费时??

2010/1/3 redsea <red...@gmail.com>:

--
侯健-用最大的努力 争取最大的成功

up duan

unread,
Jan 9, 2010, 7:47:44 AM1/9/10
to pon...@googlegroups.com


2010/1/8 jee <houj...@gmail.com>

“显卡 d3d 全屏模式和窗口模式性能就不一样的.”
这又是为什么呢? 难道绘制其他窗口这么费时??


同一个显卡,同一个屏幕,一块用D3D驱动,一块用GDI+驱动,对于显卡的驱动来说也很难办。所以性能下降很多。

yichen wang

unread,
Feb 22, 2010, 11:16:49 PM2/22/10
to pon...@googlegroups.com
这里应该分开说:

先说性能,当一个应用程序全屏独占的时候,他的进程优先级会被升高,记得在Jeffrey
Richter的书里到过。所以,全屏模式下,游戏基于CPU的性能肯定是提升的,因为你获得更多了CPU时间片。而且由于游戏一般采用main
loop,所以所有的slice都会全部用掉。因此在强占系统下,你会拿到很多CPU,非常多。

再说掉帧,当你全屏运行时,你在调用Present时,Back buffer直接和Front
buffer互换,这个是发生在Vsync时,你不会看到屏幕撕裂,而且此时GDI和桌面系统几乎不介入,性能和效率都有提升,至于更多的行为要依据你的D3D
device的设置,比如最大支持延迟几帧等等。当窗口时,游戏只是一个普通的应用程序,你通过D3D生成了一些内容,内容放在程序对应的窗口的绘制区域,然后把区域提交给了桌面系统,剩下的你就管不了了,它不会在Vsync时才更新内容,它也不会去保持很高的帧速来更新内容。在前面一次提交给桌面的绘制内容没有被绘制时,你提交了下一次的,前面就被覆盖了,在你看来,你就丢了一帧。

大致如此。具体的细节很多。我脑子里很零散,没有总结过。

2010/1/9 up duan <fix...@gmail.com>:

--
Stay Hungry. Stay Foolish.

Reply all
Reply to author
Forward
0 new messages