当前位置: 首页 > 知识库问答 >
问题:

DirectInput8枚举Devices有时非常慢

巩阳秋
2023-03-14
std::cout << "A";
directInput8Interface->EnumDevices(DI8DEVCLASS_GAMECTRL, MyCallback, NULL, DIEDFL_ATTACHEDONLY);
std::cout << "C";

...

BOOL CALLBACK MyCallback(LPCDIDEVICEINSTANCE, LPVOID)
{
    std::cout << "B";
    return DIENUM_CONTINUE;
}

这显然是一个简化的代码块;我实际上使用的是OIS输入库(http://sourceforge.net/projects/wgois/),因此有关上下文,请参阅此处的完整源代码:

http://wgois.svn.sourceforge.net/viewvc/wgois/ois/trunk/src/win32/win32InputManager.cpp?revision=39&view=markup

似乎并没有什么特别的果味,但他们的初始化可能是原因--我对DI8的了解还不够,无法发现它。

任何关于它为什么会如此缓慢的想法都将得到极大的赞赏!

编辑:

我已经设法捕获了etl跟踪文件中的挂起,并在Windows Performance Analyzer中对其进行了分析。看起来EnumDevices最终调用Dinput8.dll!FGetProductStringFromDevice,后者调用hidusb.sys!humCallUSB,后者调用KeWaitForSingleObject并等待。10次中有9次(字面意思是-跟踪中有10个样本)会很快返回(每个样本返回324us),准备就绪的调用堆栈包含usbport.sys!usbport_core_icompletedonetransfer,后跟hidusb.sys!humcallusbcomplete,看起来很正常。

共有1个答案

单于俊智
2023-03-14

我也遇到了这一点,主要是作为一个最终用户,但这已经烦死我多年了。直到我在一个开源项目上遇到它并能够调试它时,我才意识到这是一个问题。

结果是我的USB耳机DAC(来自Massdrop的目标DAC),它安装了设备实例IDUSB\VID_262A&PID_1048&MI_01\7&F217D4F&0&0001的驱动程序:WDMA_USB.INF_AMD64_134CB113911FEBA4\WDMA_USB.INF,然后在设备管理器中的声音、视频和游戏控制器下显示为:ODAC-REVB USB DAC,在人机界面设备下显示为:USB输入设备HID兼容的消费者控制设备

我不知道隐藏的条目是做什么的但是...当它们使能且此DAC设置为音频输出设备时,IDirectInput8_CreateDevice和EnumDevices的速度都非常慢。禁用“USB输入设备”条目似乎没有造成负面影响,完全解决了我的问题。

将DAC的音频输出更改为其他任何形式也奇怪地解决了这个问题。

这是如此糟糕,它使游戏手柄配置对话框joy.cpl无法使用,挂起并最终崩溃。

 类似资料:
  • 问题内容: Java中的静态和非静态枚举有什么区别?两种用法是相同的。 正确吗 所有静态的都在启动时加载到内存中,非静态的则按需加载 ? 如果是,那么哪种方法更好?将某些数据始终保留在内存中还是每次使用服务器资源加载它们? 问题答案: 所有的都是有效的。如果您有嵌套的枚举,则它与相同。 所有类都是延迟加载的(枚举或其他),但是在加载时,它们会一次全部加载。也就是说,您不能加载一些常量,而不能加载其

  • 我正在尝试在EC2上运行模式注册表,我的kafka正在AWS上运行。 这是我的属性文件 当我运行这个我得到下面的错误 我已经改变了它TSL,明文和没有两者,但都是抛出错误。我也有从 EC2 到 MSK 的连接。 阿帕奇Kafka版 汇合 即使我没有提到经纪人网址,我也会得到同样的错误 根据答案更新问题 当没有提到连接url时 提到< code>CLIENT://或< code>CLIENT_SEC

  • 问题内容: 通过阅读SCJP书籍,我在第1章“自测”中发现了类似的内容: 注意:代码编译正常。我不明白的是为什么我们可以从变量访问DOG,CAT或FISH常量。我认为(并且也写在书中)DOG,FISH,CAT是常量,其实现方式类似于。 所以,如果它们确实是静态的,为什么我们可以从中访问它们呢?最后一行是我熟悉的方式。 问题答案: 写作 和写作一样。也就是说,编译器将用其编译时类型Animal替换变

  • 主要内容:声明常量,实例,VB.Net打印和显示常量,声明枚举,实例常量指的是程序在执行过程中可能不会改变的固定值。 这些固定值也被称为文字。 常量可以是任何基本数据类型,如整数常量,浮点常量,字符常量或字符串文字。 也有枚举常量。 常量的处理方式与常规变量一样,只是它们的值在定义之后无法修改。 枚举是一组命名的整数常量。 声明常量 在VB.Net中,使用语句声明常量。 语句用于模块,类,结构,过程或块级别,以代替文字值。 语句的语法是: 其中, attribut

  • 这里Java初学者, 我试图用Spring定义我的模型来访问Mongodb数据库中的数据。 我想将性别定义为一个枚举,在数据库中,值存储为字符串:或 但我得到以下错误: 这是我的图POJO: 这是我的性别枚举: 这就是我尝试访问它的方式: @Override public void run(String…args)抛出异常{Optional chronos=figureposition.findB

  • 问题内容: 这不是卡住我的问题,而是我正在寻找一种编写代码的整洁方法。 本质上,我正在编写一个事件驱动的应用程序。用户触发一个事件,该事件被发送到适当的对象,然后这些对象处理事件。现在,我正在编写偶数处理程序方法,并且希望使用switch语句确定如何处理事件。现在,在我研究通用结构时,事件类非常简单: 然后,在另一堂课中,我会看到类似以下内容的内容: 我会 喜欢 做的就是这样的事情(尽管我当然会坚