文藝青年最愛的你正在創建一個新的Texture2D
實例(1x1像素)的每次調用到DrawMiniMap
方法稱爲dummyTexture
。這是一個壞主意,因爲紋理需要每次發送到GPU(然後進行處理和收集)。添加一個名爲dummyTexture
的字段,並在LoadContent
內完全初始化它。
但請閱讀帖子的其餘部分,瞭解如何識別這些問題。
您的Update
方法正在以60fps調用,但對於Draw
方法也不一定是這樣。因爲默認情況下Game.IsFixedTimeStep
設置爲true
,所以一旦Monogame發現Draw
花費的時間超過預期完成時間,您的Draw
方法將跳過幀。
由於您現在編寫遊戲邏輯的方式,這是Monogame確保所有更新都在固定時間步驟中完成的唯一方法。
爲了更好地瞭解發生了什麼,首先爲Draw
方法fps創建一組額外的fps變量,並在屏幕上呈現兩個值。你會看到Update
是以60 fps的速度繪製的,但是Draw
低於此值。
protected override void Draw(GameTime gameTime)
{
// similar to what you have inside `Update`
drawFpsTimer += gameTime.ElapsedGameTime;
drawFpsCount++;
if (drawFpsTimer >= TimeSpan.FromSeconds(1))
{ drawFpsTimer = TimeSpan.FromSeconds(0); drawFps = drawFpsCount; drawFpsCount = 0; }
...
有了這個地方很容易找準問題的方法內Draw
,並得到你的FPS回到60
此外,通過設置IsFixedTimeStep
到false
,你可以同時獲得Update
和Draw
被稱爲在繼承,但是你Update
幀速率會降得很 - 這意味着你應該改變你的所有更新邏輯使用gameTime.ElapsedGameTime
而不是假設固定的步驟:
protected override void Initialize()
{
// use variable time step
this.IsFixedTimeStep = false;
this.TargetElapsedTime = TimeSpan.FromSeconds(1/60.0);
this.graphics.SynchronizeWithVerticalRetrace = true;
...
我更喜歡所有項目中的可變時間步長,特別是當您發現XNA sometimes takes up 100% CPU time on one core when the default value of Game.IsFixedTimeStep
is used,但是準備好進行一些重構時。
至於爲什麼框架正在跳過,它似乎是DrawMiniMap
方法是有問題的。對此進行評論可以在我的機器上獲得60 fps更新+ 60 fps的提取率。
經進一步檢查,原來你正在創建一個新的Texture2D
實例(1x1像素)呼籲dummyTexture
每次調用此方法。這是一個壞主意。添加一個名爲dummyTexture
的字段,並在LoadContent
內完全初始化它。通過使tileColour
成爲Tile
類的成員,以避免在每次迭代中進行大量的if
測試,但也可能會稍微加快此方法的速度,但可能有許多此類優化,可能不需要,除非您要部署到移動設備。
Micky,什麼部分將是有用的?昨天晚上我進行了一些測試,當遊戲第一次啓動時,它似乎變得更糟,並且在滾動一下之後幾乎停止,就好像它在第一次加載紋理時看到它們並且在該點之後正常工作。 – user3208483
在.NET遊戲中出現口吃可能是由於踢入GC引起的。請查看Shawn Hargreaves和Riemer在其各自的XNA博客中的提示。至於啓動滯後,您是否做過任何形式的按需加載資產? – MickyD
謝謝,我會仔細研究一下。沒有我輸入的按需加載,想知道XNA是否自己做,但我確信事實並非如此? – user3208483