我使用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,這不是問題。我也認爲這是一個很好的做法,以免不必要地使用電力。但是,這達到了我的興趣,我想知道是否有人爲我提供了答案。
謝謝!你100%正確。我禁用了標題變更和中提琴。也感謝提示,我將確保下次使用它們。 順便說一句,你是如何知道窗口管理器和更新標題?這是你多年來學到的嗎? –
沒什麼特別的,真的。殺死了這個過程, - 仍然掛着。在文本控制檯上使用過程監視器(htop) - 我使用的'openbox'(窗口管理器)佔用100%的單個CPU內核。很少有東西可以大量加載WM,並且代碼不是很大,因此在此之後很容易找出其餘部分。 – keltar