Crush The Crash--藍屏
來源:程序員人生 發布時間:2016-02-28 11:34:23 閱讀次數:2693次
游戲玩著玩著藍屏了,這是讓很多玩家崩潰的事情,這個更讓開發者頭疼,第1次遇到時候(還得去解決)不免還有點手足無措。
在《天涯明月刀》項目中也解決了1些這個問題,這里也聊下這個。
甚么是藍屏?
藍屏英語叫法,或google它的時候叫blur screen of death,簡稱bsod。
游戲崩潰了,就直接退了,系統崩潰了,就是藍屏。
造成藍屏的因素包括:
-
硬件問題--顯卡過熱,內存突然松動,硬盤線斷了。。。
-
驅動問題
這些因素致使在系統內核中crash,最后就藍屏了。
游戲是不是能直接致使藍屏?
第1次遇到同事那里藍屏,我還挺好奇,如果能寫出可以藍屏的代碼,留個后門,在游戲里看誰不爽,發個命令過去,直接藍屏,多happy啊。
但其實標準情況下,user mode application(也就是我們的游戲)是不能直接致使藍屏的。
這里細節可以看msdn上的這些文章:user mode and kernel mode
user mode的application,是有自己的process,有自己的1塊virtual address,processor不能訪問其他地址(包括屬于操作系統內核的地址)。
process crash也只是crash自己,不能直接crash系統。
但是游戲在運行的時候會調用系統函數等,如果游戲有安全組件,去更改了這部份的驅動,那末就有可能更改了對kernel部份的調用,影響其運行,終究致使crash。
定位
所以1旦出現了藍屏,我們需要了解,就不需要在游戲正常運行的代碼中去看是不是有問題,直接往會接觸到驅動,硬件和kernel調用的部份去定位便可。
藍屏的dump搜集
藍屏也是有dump的。
系統失敗這里,如果玩家出現藍屏,可以根據玩家情況,或拜托玩家在調試信息這里盡可能選擇全的信息,來獲得dump。
這里的dmp是kernel mode的,只能使用windbg來查看,visual studio看不了。
顯卡過熱
實際工作中,能接觸到最多見的,且游戲直接相干的,是顯卡過熱致使的顯卡掛了,這里會致使顯卡重啟或藍屏。
我們在游戲中盡量的利用顯卡的每份計算資源,去提升效力,讓所有組件并行最大化,在一樣的硬件下跑得更流暢,展現出更好的效果,但這直接也致使了散熱更利害。
加上現在很多JS會賣畸形顯卡--在散熱上偷工減料,跑跑LOL這類簡單游戲玩的很流暢,1旦全速運轉,散熱不行,很快就掛了。
處理方法,1個是限幀,在游戲中正常限制在60fps,這個對普通mmo足夠了,這樣最少對1些特別牛的顯卡,會下降散熱,在散熱不足的情況降落低出問題的風險。
在loading畫面的時候,下降到更低的幀數,最少讓顯卡先冷1會也是好的。
1個是溫度檢測,在顯卡廠商(比如nvidia)都會有自己專有的sdk,提供接口來取得顯卡的溫度,在溫度太高的情況,做降幀降效果的處理,但是這個比較雙刃劍,1般過1百度的時候做1下還可以,但是玩家會出現抱怨游戲效果降落的問題。
reference:
http://www.howtogeek.com/163452/everything-you-need-to-know-about-the-blue-screen-of-death/
https://msdn.microsoft.com/en-us/library/windows/hardware/ff554836(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/windows/hardware/hh439648(v=vs.85).aspx
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈