2016-06-18 27 views
0

我使用SDL在C++中創建了一個小2D遊戲庫(這是正確的世界,另一個!),我終於在Linux(xubuntu 12.04)上測試了它的當前狀態(非常多的工作正在進行)。到目前爲止,我大部分時間都在進行Windows 10的安裝。注意:我的Linux和Windows 10安裝位於同一臺計算機上。在xubuntu 12.04上使用專有驅動程序時,SDL2硬件加速渲染器會使linux崩潰?

起初我使用的是xorg nvidia驅動程序,我的代碼是使用硬件加速渲染(即在創建SDL_Renderer時使用SDL_RENDERER_ACCELERATED標誌),但是當我運行我的代碼時,幀速率變得很差〜100FPS,在這一點上,我只是通過在屏幕上和Windows上繪製一個小動畫來測試它,我得到了〜1200FPS。

我有這樣的想法,它可能是因爲圖形驅動程序。所以我切換到我的GPU推薦的NVIDIA專有驅動程序,重新啓動,重新編譯,然後再次運行我的遊戲。然後出現一個空的窗口,我的電腦凍結了,但窗口標題中的FPS計數器報告了〜15000 FPS(woohoo!)。我嘆了口氣,開始抨擊我的鍵盤,ctrl-alt-del將我登出,然後我像以前一樣登錄到同一個凍結屏幕。

硬重啓後,我檢查了我的測試程序的日誌,並報告它成功進入遊戲循環,即開始渲染幀。

現在,如果我在主循環中添加延遲或使用vsync一切正常(並且使用專有nvidia驅動程序時速度更快),則不會崩潰。一切都按照定義。

我對發生的事情感到困惑,我知道我的程序正在嘗試儘可能快地去,如果我沒有在那裏睡覺,但我不會想到調度程序會給它如此很多處理器時間忽視了系統的其他部分。我試圖研究Windows和Linux調度程序之間的差異,但我可以找到一個堅實的理由,爲什麼我的程序會在Linux上失控。

您可以在這裏查看庫代碼:https://github.com/callumW/Howler庫位於咆哮/和測試程序在testsrc /主循環在Game.cpp:run()。

(請注意,如果您對庫代碼有任何建議,我很樂意收到它們)。

有沒有人有什麼想法發生了什麼?

很明顯,我需要限制幀率,並看到我並不缺乏FPS,這不是問題。我也認爲這是一個很好的做法,以免不必要地使用電力。但是,這達到了我的興趣,我想知道是否有人爲我提供了答案。

回答

1

提示未來 - 不需要重新啓動。作爲最後的手段,啓用X kill序列(通常是ctrl-alt-backspace,但在現代發行版中默認禁用,必須手動啓用),但通常它只是ctrl-alt-f1,登錄到tty,殺死違規進程,然後用ctrl-alt-fN(X坐的tty的數量,通常是7)返回到X.如果你正在使用圖形,你可能遲早會需要它。

不知道您的問題與我在運行程序時看到的完全相同,但很可能如此。您在窗口標題中顯示FPS,並將其發送到每個窗口的窗口管理器,每秒15,000次。窗口管理器被很多窗口標題更新弄糊塗了(至少openbox沒有,還沒有用不同的WMs進行測試)。不知道它是否最終會清除積累的變化或者永遠掛起;沒等。

基本上不會每秒更新10次以上的窗口標題。

+0

謝謝!你100%正確。我禁用了標題變更和中提琴。也感謝提示,我將確保下次使用它們。 順便說一句,你是如何知道窗口管理器和更新標題?這是你多年來學到的嗎? –

+0

沒什麼特別的,真的。殺死了這個過程, - 仍然掛着。在文本控制檯上使用過程監視器(htop) - 我使用的'openbox'(窗口管理器)佔用100%的單個CPU內核。很少有東西可以大量加載WM,並且代碼不是很大,因此在此之後很容易找出其餘部分。 – keltar

0

我想在主循環內添加SDL_Delay()。例如: -

while(running) { 
    while(SDL_PollEvent(&e) != 0) { 
     if(e.type == SDL_KEYDOWN) { 
      if(e.key.keysym.sym == SDLK_ESCAPE) { 
       running = false; 
       break; 
      } 
     } 
     else if(e.type == SDL_QUIT) { 
      running = false; 
      break; 
     } 
    } 
    update(); 
    frames++; 
    //Add a delay here 
    SDL_Delay(0); 
} 

這是爲了給cpu時間回OS。在一些操作系統中(如果我沒有弄錯的話,就像老式的Windows一樣),如果你無限循環,你的應用程序將凍結,操作系統會認爲你的應用程序沒有響應,並且會試圖殺死它。等等

我不確定這是否屬於您的情況,請試試看。您可能想要更改參數的值(實際上,這是您想要延遲的時間長度,儘管不能保證準確)。在我不想限制幀率的情況下,我通常使用0113將限制您的幀速率在60fps左右。

相關問題