使用100%CPU的游戏正常吗?


23

我刚刚在游戏引擎中实现了多线程输入处理,其中轮询操作系统以从中收集输入信息并对其打上时间戳的代码位于单独的线程中,而主线程中的每一帧我都将收集到的输入吃掉逻辑游戏时间。一切正常,但是此设置使用了100%的CPU。我有两个核心,并且在运行我的游戏时会达到100%。

我已经与其他游戏进行了核对,以查看它们是否也这样做。例如,Skyrim和Doom 3看起来不错,CPU刚好超过60%。

使用多线程输入消耗100%CPU的游戏是否可以接受?如果没有,这种游戏通过输入线程降低cpu使用率的一些技巧是什么?


7
因此,您说的是,您基本上拥有一个带有无限while循环的线程,该线程不断轮询OS是否存在新事件?while true do CheckForEvents;
克罗姆斯特表示支持莫妮卡2015年

5
如果应用程序使用了100%的CPU时间,而不管其使用情况和CPU速度如何,那么可以将其视为错误。每个监视器刷新周期渲染的帧不应占用过多的CPU时间。
kasperd 2015年

3
@TheLightSpark轮询线程甚至没有入睡吗?如果您不停地不断循环和检查,则可能会消耗更多的CPU时间。
路加福音

3
回复@Luke:即使在两次轮询之间睡一毫秒,也将大大降低CPU使用率。不久前,我为命令行工具编写了一个GUI,该GUI接受了一个输入文件,并使输出文件的大小大致相同。为了估算百分比,我读取了输出文件的文件大小并更新了进度条(使用while (true))。用了一个CPU的90%以上。添加一个Thread.Sleep(5)可使CPU使用率降低到40%以下。两次调查之间的间隔时间为25毫秒,因此降至10%以下。
科尔·约翰逊

2
@AlecTeal我认为您没有足够注意我所说的话。渲染更好的图形并不相同,当然,启用更好的图形会增加CPU消耗。但是,如果切换到更快的CPU将导致您的代码仅花费更多的周期来产生完全相同的结果,则您的代码有缺陷。明智的默认选择是自动测量可以使用特定CPU渲染的图形的质量。但是,如果用户使用电池供电或需要CPU进行后台作业,则应允许用户进行选择。
kasperd 2015年

Answers:


41

是的,这对于实时游戏尝试使用100%CPU来表现出尽可能快和良好的表现是正常的。因此,该播放器每秒可以看到和PC所能提供的一样多的帧数,良好的物理模拟或其他效果。

在您的情况下-不,这看起来像是效率低下的设计,无法占用线程并使其轮询循环(while true do CheckForEvents;)中的事件。如果我错了,请纠正我,但是操作系统已经轮询了事件。您应该每个滴答一次从主线程检查一次。

主游戏循环应足够快,以每秒30+滴答的速度运行,这足以轮询许多游戏的命令。如果他的命令得到处理(例如0-33ms之后),玩家将看不到差异。另一方面,您可能已经使用了额外的CPU内核来完成更有益的任务,例如获得更好的AI或物理效果等。

PS:如要求在评论中进行澄清,请不要盲目地将上述数字用于所有类型的游戏。虽然TBS游戏每回合只需要1滴答作响,而RTS游戏每回合10滴答作响就可以了,但其他类型的游戏,例如RaceSims,则需要更多。当然,不要将逻辑滴答声与帧速率联系在一起,这是两件事。


5
我会赞成这个问题,但随后我看到您建议每秒30个刻度。恕我直言(和许多其他游戏玩家一样),您的目标应该是每秒60个刻度(因此为60帧)。对于许多人来说,60 FPS看起来更流畅,反应更快,并且不太可能使某些用户晕车。
Nzall

4
输入的33ms延迟非常明显...
Synxis 2015年

1
@NateKerkhofs:我来自RTS背景,通常打10个滴答声。这是一个广阔的世界,我将在此添加详细信息。感谢您指出。
Kromster说支持Monica 2015年

1
@KromStern:我不能完全代表Nate,但是第三段可以解释为“ 30hz应该是您的目标”,尽管它也可以解释为“ 30hz是您可以忍受的最小值”(这可能就是您的意思) )。
肖恩·米德迪奇

1
使用100%CPU是可怕的做法。您将笔记本电脑用户搞砸了,因为它们不需要任何形式,形状或形式就不需要使用100%CPU。编写适当的游戏循环,以将帧有效地馈送到监视器。
克里斯·丹尼特

9

具有持续有效的窗口刷新功能的游戏通常会以全屏模式运行,并且是操作系统管理的计算机上唯一(大型)程序。因此使用100%的CPU是完全可以接受的,因为没有别的需要。

但是,这当然并不意味着无论游戏状态如何,您都必须始终使用100%。如果大多数游戏循环在帧速率限制之前完成渲染帧,则它们将sleep方法用作帧速率定界符,以免使CPU毫无用处。
这可能就是您的示例中发生的情况:您的计算机比运行Skyrim或Doom 3所需的速度快,因此它们仅使用所需的内容-而是所需的所有内容。

正如@KromSterm所说,操作系统通常已经为您轮询了事件,因此不需要使循环比操作系统更快。如果只有两个内核,则仅将第二个内核的100%用于事件检测不是一个好主意,因为如果仅将事件传输到主更新循环,则执行速度非常快。您应该尝试将此内核用于主线程作业的一部分,而改为使用另一个线程。


“使用睡眠方法” -我是否正确地认为这被称为帧速率限制器?
Gusdor

3
睡眠不是精确的帧限制方法,如果目标是限制帧以监控刷新率,则最好使用硬件支持的vsync(或nvidia的g-sync,如果可用)
Sarge Borsch

8

旨在在PC或移动游戏中使用所有可用的CPU时间有一些缺点。

系统要求:如果游戏可以在开发游戏的PC上播放,则可能无法在购买游戏的人拥有的较弱PC上播放。限制CPU使用将使游戏在更多人可能已经拥有的计算机上可以使用。如果您真的想查看自己是否正在限制市场,请在Atom驱动的可拆卸设备(如《变形金刚》)上测试您的PC游戏和竞争对手的PC游戏,或者在价格便宜的预付费Android手机上测试您的手机游戏。

电力使用:笔记本电脑在四个内核以全频率的100%使用时比第二个内核以半频率的60%使用时更快地消耗电池电量。因此,请确保您的控制器轮询线程,AI线程,物理线程和图形线程被阻止,直到需要再次运行它们为止。除了诸如战斗和节奏之类的一些非常易变的类型外,您不需要以高于60 Hz左右的速度轮询控制器,因此将轮询线程设置为在60 Hz计时器上运行。

物理可变性:如果在更强的机器上更详细地影响游戏玩法的物理,则相同的玩家动作将在不同的机器上产生不同的结果。这意味着玩家可以通过使用更强或更弱的机器来作弊。Id的Quake III Arena帧速率影响跳跃高度而臭名昭著。为了避免这种情况,许多游戏在物理上使用固定的时间步长。但这不会影响与游戏玩法断开的物理效果,例如粒子效果或布料效果或物理帧之间的坐标插值以比物理帧更高的帧速率渲染视频。因此,请使用 Model-View-Controller的 在架构中,基本要素(加速度,命中检测等)进入模型,而可调眼图进入视图。

AI的可变性:如果在更强大的机器上更详细地描述AI,则敌人在不同机器上的行为将有所不同。例如,在Go或Chess实施中,对手在较弱的PC上会更弱,并且玩家可以通过在较弱的PC上玩游戏或通过运行后台进程(例如防病毒或视频转码或操作系统更新)来作弊。


4
+1供电源使用。特别是在考虑移动和平板电脑行业时,这一点非常重要。
akaltar 2015年

1
用电也会影响噪声,即使在台式机上也是如此。当系统凉爽时,现代台式机通常会使其风扇保持安静和安静。同样,也许用户在播放时正在编码视频(低优先级),所以不会浪费任何多余的CPU时间。或者对于流媒体播放器抽搐,留出更多的视频编码周期是一件大事,并且可以实现更高质量的视频。(视频编码是CPU时间,比特率和质量之间的三权衡,因此更多的CPU时间意味着在相同的比特率下以更高的质量进行实时编码。)
Peter Cordes

1
电力使用应该是首要考虑因素,恕我直言,所有其他考虑因素都是次要考虑因素。我唯一会使用100%CPU(如果真的有用!)的东西就是VR。
克里斯·丹尼特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.