有没有人知道如何以编程方式捕获正在播放的声音(即,来自声卡的所有内容,而不是麦克风等输入设备).
我在Windows 7和Visual Studio社区2015 RC上运行DirectX 11应用程序.我还在使用DX SDK中的功能.它在VS2013上工作正常但是当我切换时我只得到以下错误:
Error LNK2019 unresolved external symbol __vsnprintf referenced in function "long __stdcall StringVPrintfWorkerA(char *,unsigned int,unsigned int *,char const *,char *)" (?StringVPrintfWorkerA@@YGJPADIPAIPBD0@Z) Ancora D:\Moody\Moody\Projects\Projects\Ancora\Ancora\dxerr.lib(dxerra.obj) 1
Run Code Online (Sandbox Code Playgroud)
我只使用dxerr库中的DXGetErrorDescriptionA函数,当我将它注释掉时,程序编译得很好.我不知道出了什么问题,但它不能来自DX SDK,否则其他功能会失败吧?
我正在编写一个DirectX游戏,当我在Optimus笔记本电脑上运行它时会使用英特尔GPU,导致可怕的性能.如果我使用上下文菜单强制NVIDIA GPU或将我的可执行文件重命名为bf3.exe或其他一些着名的游戏可执行文件名称,性能就像预期的那样.
显然,当我必须重新分配我的游戏时,这两种方法都不是可接受的解决方案,那么有没有办法以编程方式强制笔记本电脑使用NVIDIA GPU?
我已经尝试使用DirectX来枚举适配器(IDirect3D9 :: GetAdapterCount,IDirect3D9 :: GetAdapterIdentifier)并且它不起作用:仅报告1个GPU(正在使用的GPU).
问题:当我抓住我的Windows应用程序的调整大小边框,特别是顶部或左边框,并调整窗口大小时,窗口的内容会在我拖动时调整"实时"大小,但是它们会以一种看似像的丑陋方式调整大小即使是最新手的用户也是一个明显的错误:窗口相对边缘的内容从边缘拖动抖动/闪烁/来回跳跃.视情况而定,现象可能如下:
一旦我停止拖动,丑陋的现象就会停止,但在拖动过程中,它会使应用程序看起来很业余和不专业.
说这个Windows问题已经让成千上万的应用程序开发人员疯狂,这并不是轻描淡写的.
以下是现象,友好地准备了两个实例图片一个相关的问题由罗马Starkov:
另一个例子展示了Kenny Liu的邪恶"双重图像"现象(请注意快速闪光):
有关任务管理器现象的另一个示例视频就在这里.
这个问题的目的: 任何遇到这个问题的开发人员都会发现至少有30个StackOverflow问题,其中一些是最近的,有些是从2008年开始的,充满了很有希望的答案很少有效.现实情况是,这一个问题有很多原因,而现有的StackOverflow问题/答案从未使更广泛的背景清晰.这个问题试图回答:
本问题的范围:对于StackOverflow问题的范围,这种现象发生在:
请勿标记为广泛或DUP:在标记为复制或标记为广泛之前,请阅读以下完整答案.我们已经经历了这个循环,SO用户在理解了以下内容之后经常重新打开这个问题:这个问题有益于社区,是第一个解释窗口调整大小抖动的所有不同原因的问答,以便用户可以识别哪个原因导致他们的问题并解决它.下面的答案很长,只是因为解释为什么一般发生抖动是很棘手的,不是因为这个问题涵盖了许多单独的问题和问题,这些错误/问题可以通过单独的问答得到更好的服务.正如您将看到的,上面的所有排列(本机/托管,窗口/对话框,XP-10)都归结为只有两个根本原因,但识别您所拥有的是棘手的部分.这就是这个问题的意义所在.将问题分开将完全否定这一好处.我们在下一节中进一步限制了问题的范围......
不在本问题的范围内:
如果您的应用程序有一个或多个子窗口(子HWND),则此问题中的信息对您很有用(因为BitBlts
我们将描述的引起混蛋的内容与父窗口一起应用于您的子窗口),但在窗口调整大小时还有另外一个问题需要处理,这超出了这个问题的范围:你需要让你的所有子窗口以原子方式移动并与父窗口同步.对于这项任务,你可能会想要 BeginDeferWindowPos/DeferWindowPos/EndDeferWindowPos
,你可以在这里和这里找到它们.
这个问题假设如果你的应用程序使用GDI,DirectX或OpenGL绘制到一个窗口,那么你已经WM_ERASEBKGND
在你的应用程序中实现了一个wndproc
简单的返回1. WM_ERASEBKGND
是来自Windows 3.1的一个神秘的Windows残余,以前WM_PAINT
给你的应用程序一个机会在你画窗户之前"擦掉窗户的背景"......嗯.如果你让WM_ERASEBKGND
消息进入DefWindowProc()
,那将导致你的整个窗口在每次重绘时被涂成纯色,通常是白色,包括在实时窗口大小调整期间发生的重绘.结果是一个丑陋的全窗口闪烁是粗略的,但不是我们在这个问题中讨论的抖动/闪烁/跳跃的类型.拦截WM_ERASEBKGND
立即解决了这个问题.
此问题主要是通过使用鼠标拖动窗口边框来实时调整大小.但是,此处编写的大部分内容也适用于当应用程序手动执行一次性窗口调整时可以看到的丑陋工件SetWindowPos()
.这些不太明显,因为它们只在屏幕上轻弹一瞬间,而不是长时间的拖动.
这个问题不是关于如何使你的特定于应用程序的绘图代码更快,即使这样做可能是许多情况下丑陋的调整大小问题的解决方案.如果您的应用确实需要花费大量时间在实时窗口调整大小期间重新显示其内容,请考虑优化绘图代码,或者至少在调整大小期间切换到更快,质量更低的绘图模式,方法是拦截WM_ENTERSIZEMOVE/WM_EXITSIZEMOVE
消息以检测调整大小.
如果您的应用程序在应用程序调整大小期间根本无法调整大小(例如,在调整大小期间它"挂起",特别是如果它是使用GLFW或其他库的OpenGL),请参阅这些其他问题,这些问题解释了WM_SYSCOMMAND
在拖动过程中Microsoft内部隐藏的嵌套/模态事件循环:这里特别是这个好的答案,这里,这里 …
与窗口模式相比,Direct3D应用程序在全屏模式下的性能似乎要好得多.这背后的技术原因是什么?
我想这与全屏幕应用程序可以获得显示器的独占控制这一事实有关.但是为什么应用程序无法获得部分屏幕(即窗口)的独占控制权并具有相同的性能优势?
我是C#的新手,我正在现有的应用程序中做一些工作.我有一个DirectX视口,其中包含我希望能够使用箭头键定位的组件.
目前我正在重写ProcessCmdKey并捕获箭头输入并发送OnKeyPress事件.这有效,但我希望能够使用修饰符(ALT+ CTRL+SHIFT).一旦我拿着修改器并按箭头,就不会触发我正在听的事件.
有没有人对我应该去哪里有任何想法或建议?
标准模型是OpenGL用于专业应用程序(CAD),Direct3D用于游戏.
随着openGL 3.0的崩溃,openGl仍然是技术3D应用程序(cad/GIS)的自然选择吗?
是否有Direct3D的场景图库?
(当然Direct3D只是windows.)
我需要捕获DirectX窗口的视觉输出(如屏幕截图).目前,我使用这种方法.
但是,当窗口在后台时,它会捕获前面的任何内容.
我看到DirectX窗口即使在最小化或后台渲染时也是如此,所以这应该是可能的.
但是,怎么样?(它也需要很快,它也需要在Windows XP上运行,不幸的是......)
编辑:这些天我很忙......别担心,如果它过期,我会把赏金退回去.
我正在实现用于空间可视化的3D引擎,并且正在编写具有以下导航功能的相机:
相机不应该滚动 - 也就是说,"向上"仍在继续.因此,我代表具有位置和两个角度的摄像机,围绕X和Y轴旋转(Z将滚动.)然后使用摄像机位置和这两个角度重新计算视图矩阵.这适用于平移和旋转眼睛,但不适用于围绕任意点旋转.相反,我得到以下行为:
m_dRotationX
0或pi 时,眼睛根本不向上或向下移动.(万向节锁?我怎么能避免这种情况?)m_dRotationX
在pi和2pi之间时,改变旋转使其在看起来应该向下看时向下看,当看起来应该向下看时向下看).(a)导致这种"漂移"的原因是什么?
这可能是万向节锁定.如果是这样,标准答案是"用四元数来表示转动"说,这里的许多倍SO(1,2,3为例),但遗憾的是没有具体的细节(例如,这是最好的答案,我发现到目前为止;它很少见.)我一直在努力使用四元数结合上述两种类型的旋转来实现相机.事实上,我正在使用两个旋转来构建四元数,但是下面的评论者说没有理由 - 立即构建矩阵也没关系.
在围绕某个点旋转时更改X和Y旋转(表示摄像机外观方向)时会发生这种情况,但直接更改旋转时不会发生这种情况,即将摄像机绕自身旋转.对我来说,这没有意义.这是相同的价值观.
(b)这种相机会采用不同的方法(例如四元数)吗?如果是这样,我如何实现上述所有三个相机导航功能?
如果不同的方法会更好,那么请考虑提供该方法的具体实施示例.(我使用的是DirectX9和C++,以及SDK提供的D3DX*库.)在第二种情况下,我会在几天内添加并奖励一笔赏金,我可以在问题中添加一个.这可能听起来像我在蹦蹦跳跳,但我的时间很少,需要快速实施或解决这个问题(这是一个紧迫的截止日期的商业项目.)详细的答案也将改善SO档案,因为大多数到目前为止我读过的相机答案对代码很轻松.
谢谢你的帮助 :)
一些澄清
感谢您的评论和答案到目前为止!我将尝试澄清有关该问题的一些事项:
每当其中一个变化时,从摄像机位置和两个角度重新计算视图矩阵.矩阵本身永远不会累积(即更新) - 它会重新重新计算.然而,相机位置和两个角度变量被累积(例如,每当鼠标移动时,基于鼠标上下移动的像素数量,一个或两个角度将增加或减少一小部分和/或或者在屏幕左右.)
评论员JCooper声称我正遭受万向节锁定,我需要:
在变换上添加另一个旋转,在应用变换之前将eyePos旋转到完全在yz平面中,然后再旋转另一个旋转.在应用偏航 - 俯仰 - 滚动矩阵之前和之后立即围绕y轴旋转以下角度(其中一个角度需要被否定;尝试它是决定哪个角度的最快方法).
double fixAngle = atan2(oEyeTranslated.z,oEyeTranslated.x);
不幸的是,当按照描述实现这一点时,由于其中一个旋转,我的眼睛以非常快的速度从场景上方射出.我确定我的代码只是这个描述的一个糟糕的实现,但我仍然需要更具体的东西.一般来说,我发现算法的非特定文本描述不如评论,解释的实现有用. 我正在为一个具体的工作示例添加一个赏金,它与下面的代码集成(也就是使用其他导航方法.)这是因为我想了解解决方案,并且有一些有用的东西,因为我因为我处于紧迫的截止日期,所以需要实施一些有效的方法.
如果你回答算法的文字描述,请确保它足够详细('旋转Y,然后变换,然后旋转'对你有意义,但缺乏细节知道你的意思. 好答案清晰,标示,即使有不同的基础,也会让其他人理解,是'坚固的防风雨信息板.')
反过来,我试图清楚地描述问题,如果我能说清楚,请告诉我.
我目前的代码
要实现上述三个导航功能,在基于光标移动的像素移动的鼠标移动事件中:
// Adjust this to change rotation speed when dragging (units are radians …
Run Code Online (Sandbox Code Playgroud)