2017-06-20 17 views
0

我有一个3D应用程序需要大约每6ms左右生成一个新帧。为了不导致口吃,这个帧率需要保持不变。更糟糕的是,应用程序必须执行几个中等重量的计算(主要是准备3D场景并将数据复制到VRAM),因此需要花费相当大的时间来完成它自己的工作。有没有什么办法可以在Windows上最大化我的应用程序的时间片?

这一直是一个问题,因为Windows会导致我的应用程序在尝试将CPU用于其他事情时出现口吃。有没有什么办法可以让Windows不向其他进程“放弃”时间片?我并不担心它会对后台进程产生负面影响。

+0

我不禁想到你正在做这一切都是错误的。 Raymond Chen在这个主题上有一些优秀的文章,其中涵盖了试图提高流程优先级以损害其他流程的危险,这些流程都是很好的解读。我的看法是:前台进程ALREADY获得优先级提升。如果其他进程正在窃取时间片,可能是因为盗窃是必要的,您应该关注这些影响:因为这些进程可能会管理磁盘缓存等内容 - 挨饿这些进程会使您的性能变差。 –

+0

所以真的,你的问题不像硬件那样在软件领域。不要使用Pentium(或更低)来执行此类工作。 i3或i5拥有足够的内核可为您提供一致的CPU时间,并允许执行后台任务 - 执行应用程序所需的时间 - 完成时间。 –

+1

只是好奇,166 fps? –

回答

3

Windows将允许您提高您的应用程序的优先级。一个进程通常只会损失具有相同或更高优先级的其他进程的CPU时间,因此提高优先级可以防止CPU时间“被盗”。

但是请注意,如果你太过分了,可能会导致系统不稳定,所以如果你打算这样做,你通常只想提高一点优先级,所以它比其他的“正常“应用程序。

另请注意,这不会产生巨大的影响。如果偶尔遇到小问题,增加优先级可能会在处理此问题。如果这是一个不变的问题,那么优先级提升可能不足以解决问题。

如果您决定尝试此操作,请参见SetPriorityClassSetThreadPriority

+0

我确实至少对这两个方面做了一些改变,但不记得哪些部分要做什么...... –

0

它通常取决于您的操作系统使用的调度算法。 Windows 7,8,XP,VISTA使用轮循调度的多级队列调度,因此增加应用程序或线程或进程的优先级将达到您想要的水平。您目前正在使用哪个版本的Windows?我可以相应地帮助您,一旦我知道

0

您可以提高您的进程优先级,但我认为它不会有多大帮助。相反,你应该优化你的代码。

首先,使用VS内置分析器(调试/性能分析器菜单)找出应用程序花费最多时间的位置,并优化它。另外,所有现代CPU都至少是双核(最后一款单核Celeron从2013年开始)。因此,“在那里它消耗相当大量的〜6ms做它自己的东西”应该不是这种情况。你自己的东西应该在一个单独的线程中运行,而不是在你用来渲染的线程中运行。 See this article为一个想法如何实现这一点。你可能不需要级别的复杂性,只有2个线程+2个任务(计算和渲染)可能就足够了,但是那篇文章应该给你一些关于如何重新设计你的应用的想法。然而,这种方法会带来1个额外的输入延迟帧(对于1帧后台线程将计算内容,只有渲染器线程将显示该结果的下一帧),但使用165Hz渲染,您可能会忍受这种情况。

相关问题