Crush The Crash--蓝屏

来源:互联网 发布:mmd数据 编辑:程序博客网 时间:2024/05/22 13:56

游戏玩着玩着蓝屏了,这是让很多玩家崩溃的事情,这个更让开发者头疼,第一次遇到时候(还得去解决)不免还有点手足无措。

在《天涯明月刀》项目中也解决了一些这个问题,这里也聊下这个。

什么是蓝屏?

蓝屏英语叫法,或者google它的时候叫blur screen of death,简称bsod。

游戏崩溃了,就直接退了,系统崩溃了,就是蓝屏。

造成蓝屏的因素包括:

  • 硬件问题--显卡过热,内存突然松动,硬盘线断了。。。
  • 驱动问题
这些因素导致在系统内核中crash,最后就蓝屏了。

游戏是否能直接导致蓝屏?
第一次遇到同事那里蓝屏,我还挺好奇,如果能写出可以蓝屏的代码,留个后门,在游戏里看谁不爽,发个命令过去,直接蓝屏,多happy啊。
但其实标准情况下,user mode application(也就是我们的游戏)是不能直接导致蓝屏的。

这里细节可以看msdn上的这些文章:user mode and kernel mode
user mode的application,是有自己的process,有自己的一块virtual address,processor不能访问其他地址(包括属于操作系统内核的地址)。
process crash也只是crash自己,不能直接crash系统。

但是游戏在运行的时候会调用系统函数等,如果游戏有安全组件,去更改了这部分的驱动,那么就有可能更改了对于kernel部分的调用,影响其运行,最终导致crash。

定位
所以一旦出现了蓝屏,我们需要了解,就不需要在游戏正常运行的代码中去看是否有问题,直接往会接触到驱动,硬件和kernel调用的部分去定位即可。

蓝屏的dump收集
蓝屏也是有dump的。

系统失败这里,如果玩家出现蓝屏,可以根据玩家情况,或者拜托玩家在调试信息这里尽量选择全的信息,来获取dump。
这里的dmp是kernel mode的,只能使用windbg来查看,visual studio看不了。

显卡过热
实际工作中,能接触到最常见的,且游戏直接相关的,是显卡过热导致的显卡挂了,这里会导致显卡重启或者蓝屏。
我们在游戏中尽可能的利用显卡的每一份计算资源,去提升效率,让所有组件并行最大化,在同样的硬件下跑得更流畅,展示出更好的效果,但这直接也导致了散热更厉害。
加之现在不少JS会卖畸形显卡--在散热上偷工减料,跑跑LOL这种简单游戏玩的很流畅,一旦全速运转,散热不行,很快就挂了。
处理方法,一个是限帧,在游戏中正常限制在60fps,这个对于普通mmo足够了,这样起码对于一些特别牛的显卡,会降低散热,在散热不足的情况下降低出问题的风险。
在loading画面的时候,降低到更低的帧数,起码让显卡先冷一会也是好的。
一个是温度检测,在显卡厂商(比如nvidia)都会有自己专有的sdk,提供接口来获得显卡的温度,在温度过高的情况,做降帧降效果的处理,但是这个比较双刃剑,一般过一百度的时候做一下还可以,但是玩家会出现抱怨游戏效果下降的问题。

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

1 0