如果你是一个Windows内幕和一个游戏玩家,你可能是并不陌生,在Windows 10的Xbox控制器困境;在构建14291,只需连接一个控制器可以降低操作系统。建立14295迅速修复了,但随后推出,使得它不可能使用很长一段时间的问题。快进到今天 - 建设14316 - 而且还是看不到修复。什么是Windows业内人士中的Xbox测试赛季呢。
我们开始解决问题,我们知道控制器的作品,那就是,我们可以发挥通过Xbox流功能的Xbox游戏。但是很短的时间量之后,一切都开始减缓和音频开始噼啪作响。让我们火起来的Windows性能记录器(WPR)和微量元素是怎么回事时,事情开始吸吮。
我们将启用CPU使用率(无图)和桌面组合活性谱,点击开始,火起来辐射4,和刚刚上场一分钟左右。
正如预期的那样,现在情况非常缓慢。让我们停下来,让系统恢复一下,拯救我们的痕迹。
打开在Wi??ndows性能分析器(WPA)的跟踪,我们看到CPU活动的一个非常有趣的线性发展在我们的计算图形集缩略图,但是让我们专注于用户界面呆滞第一。
打开视频图形集并拖动DWM边框细节绘制到我们的分析面积计算帧速率随着时间的推移一个美丽的可视化。这证实了桌面窗口管理器(DWM)以每秒约60帧,直到事情发生,导致它下跌愉快地渲染我全屏的Xbox流媒体窗口。
让我们在CPU占用率曲线带来一些副作用并排分析。
OK,至此在CPU占用率曲线肯定确认东西是占用进程,我们的坦克帧速率。
扩展堆栈揭示我们做了很多对控制器的输入处理工作,每份报告(例如按下按钮)。等待,我们正在显示的每一次我们做一些控制器上的界限?并获得通过的GetDC(其重定向到ZwUserGetDC)每一次新的设备上下文句柄这样做呢?嗯哦,我们可能会发现我们的问题。
让我们在偷看DesktopInputDisplay ::使用调试器里面的getBounds什么。现在,因为DWM负责绘制我们机器上所有的UI,我们需要附加一个调试器,是可控的外部。否则,我们就自己挂起来,失去了我们的机器的控制权。
这样的运行。时间从笔记本电脑连接。
而我们在。现在,让我们反汇编这个函数。
这个功能是非常小的。阅读反汇编列表和理解汇编指令超出了这个帖子的目的,所以我会总结一下我们正在考虑与一些C伪代码:
我做了一些研究,并...为什么这个代码是在这里,而不是一些初始化的一部分,其他地方还不清楚。
它基本上是告诉Windows来达到到内核空间,唤醒了显示驱动程序,并告诉它准备在桌面上绘制操作。然后,驾驶员跳下床,看着桌面,在内部设置了一些东西,并给了我们一个道理引用这个工作以后。但是,在一个袋子污垢举动,我们只要求在桌面上的测量和没有清理走。
无礼!
无论如何,我们这里有两个问题:
的GetDC是昂贵的被调用在亚毫秒间隔的输入处理程序的上下文来调用。我要去猜,我们正在某处与我们重复调用堵塞的队列。
我们不是清理句柄的GetDC返回。我不相信这是直接关系到我们的问题,但它确实意味着,如果你强硬通过lagginess,你会最终与内存外的一个错误崩溃DWM。
再次代码来看,很明显的失败不被视为关键。如果坏事有两种GetDC的或GetDeviceCaps发生,我们始终陷入返回硬编码值。所以,我们只是砍出的GetDC调用,让它做所有的时间。
这是我们这个补丁之前。
而这里的后。因为原来的调用指令是6字节长,我用了近跳转指令(2字节)跳过剩下的4个字节。 (我们可以仅覆盖了整个指令有6个无使用说明书但更关键的一拳。)
让我们给它一个旋转。
而且我们的清晰;我没有打任何突然口吃并核实事情看起来在Windows性能分析器好得多。
这种创可贴应持有直到微软修复该问题在即将到来的飞行。如果你想你的机器上应用此修复程序没有所有的手动步骤上面,做到以下几点:
确保您使用的是Windows 10 14316.rs1_release.160402-2217的64位副本
为Windows安装调试工具
打开工具被安装到文件夹中提升的命令提示符
仔细发出以下命令:“.symfix; EB ism32k DesktopInputDisplay :: +的getBounds 29 EB 04; .detach;”国开行-pn dwm.exe -c