2017-06-20 19 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渲染,您可能會忍受這種情況。

相關問題