如何让Qt5下载并与Visual Studio 2012集成?您将遇到哪些问题,以及如何解决这些问题?
更新重新.Visual Studio 2013
Visual Studio 2013也报告了成功,并且正在为VS 2013维护这些注释.
还要注意的是这个问题的重点是坚决的只是建筑物的Qt与Visual Studio.还有关于与Visual Studio IDE集成的说明
所以我已经重新安装了directx11几次,甚至去了微软网站并获得了包含所有直接x cabinet文件的SDK包.任何人都知道为什么我一直得到这个错误呢?我知道它为什么这么说,但更多的是寻找它的解决方案.
1> c:\ users\_vaughn\documents\visual studio 2010\projects\myfirstapp\myfirstapp\main.cpp(5):致命错误C1083:无法打开包含文件:'d3dx11.h':没有这样的文件或目录
概况
对带宽,CPU使用率和GPU使用率极为密集的应用程序需要从一个GPU到另一个GPU每秒传输大约10-15GB.它使用DX11 API访问GPU,因此只有使用需要映射的缓冲区才能上传到GPU.上传一次发生在25MB的块中,并且16个线程同时将缓冲区写入映射的缓冲区.关于这一点,没有什么可以做的.如果不是针对以下错误,则写入的实际并发级别应该更低.
它是一个功能强大的工作站,配有3个Pascal GPU,一个高端Haswell处理器和四通道RAM.在硬件上没有太多改进.它正在运行Windows 10的桌面版.
实际问题
一旦我通过~50%的CPU负载,MmPageFault()
(在Windows内核中,在访问已映射到您的地址空间但尚未由操作系统提交的内存时调用)中的某些内容突然破坏,剩下的50%CPU负载是被浪费在内部的旋转锁上MmPageFault()
.CPU变得100%利用,应用程序性能完全降低.
我必须假设这是由于每秒需要分配给进程的大量内存,并且每次取消映射DX11缓冲区时也完全从进程中取消映射.相应地,它实际上是MmPageFault()
每秒数千次调用,顺序发生,顺序memcpy()
写入缓冲区.对于遇到的每个单独的未提交页面.
一个CPU负载超过50%,保护页面管理的Windows内核中的乐观自旋锁完全降低了性能.
注意事项
缓冲区由DX11驱动程序分配.没有什么可以调整分配策略.不可能使用不同的内存API,尤其是重用.
调用DX11 API(映射/取消映射缓冲区)都是从单个线程发生的.与系统中的虚拟处理器相比,实际的复制操作可能跨越更多线程发生多线程.
无法降低内存带宽要求.这是一个实时应用程序.事实上,硬限制目前是主GPU的PCIe 3.0 16x带宽.如果可以的话,我已经需要进一步推进.
避免使用多线程副本是不可能的,因为有些独立的生产者 - 消费者队列无法简单地合并.
旋转锁定性能下降似乎非常罕见(因为用例推动它那么远)在Google上,你不会找到旋转锁定功能名称的单一结果.
升级到可以更好地控制映射的API(Vulkan)正在进行中,但它不适合作为短期修复.出于同样的原因,切换到更好的OS内核目前不是一种选择.
减少CPU负载也不起作用; 除了(通常是微不足道的和便宜的)缓冲区副本之外,还有太多的工作需要完成.
问题
可以做些什么?
我需要显着减少单个页面故障的数量.我知道已映射到我的进程的缓冲区的地址和大小,我也知道内存尚未提交.
如何确保以尽可能少的事务提交内存?
DX11的异常标志可以防止在取消映射后取消分配缓冲区,Windows API强制在单个事务中提交,几乎任何东西都是受欢迎的.
目前的状态
// In the processing threads
{
DX11DeferredContext->Map(..., &buffer)
std::memcpy(buffer, source, size);
DX11DeferredContext->Unmap(...);
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序,它将通过桌面复制API(使用DirectX 11)捕获屏幕(仅对前一个屏幕更新的差异)并在另一个窗口上呈现它(查看器可能在通过LAN连接的另一台机器上运行) .该代码是MSDN中提供的示例的改进版本.一切正常,除了设备没有给出任何屏幕更新,虽然在中间有一次,大约10%的时间在一些机器上发生(大多数在Windows 8/8.1机器上,很少在Windows 10机器上).我尝试了所有可能的方法来解决这个问题.减少了设备重置的次数,这为我提供了一些可靠的输出,但并不总能正常工作100%.
设备有时无法提供初始屏幕(全屏)(这种情况在所有支持桌面复制的Windows操作系统上有60%的时间发生),我想出了一个可以重新进行初步更新的工作.设备,直到它提供一个,但也导致多个问题,设备可能甚至不提供初始屏幕.
我已经投入了数周的时间来解决这个问题,但没有找到合适的解决方案,而且我所知道的论坛没有讨论这些问题.任何帮助,将不胜感激.
下面是我的代码,以获得前一个屏幕差异,初始化设备,填充适配器和监视器.
请耐心等待一段很长的代码片段,在此先感谢.
要获取屏幕更新:
INT getChangedRegions(int timeout, rectangles &dirtyRects, std::vector <MOVE_RECT> &moveRects, UINT &rect_count, RECT ScreenRect)
{
UINT diffArea = 0;
FRAME_DATA currentFrameData;
bool isTimeOut = false;
TRY
{
m_LastErrorCode = m_DuplicationManager.GetFrame(¤tFrameData, timeout, &isTimeOut);
if(SUCCEEDED(m_LastErrorCode) && (!isTimeOut))
{
if(currentFrameData.FrameInfo.TotalMetadataBufferSize)
{
m_CurrentFrameTexture = currentFrameData.Frame;
if(currentFrameData.MoveCount)
{
DXGI_OUTDUPL_MOVE_RECT* moveRectArray = reinterpret_cast<DXGI_OUTDUPL_MOVE_RECT*> (currentFrameData.MetaData);
if (moveRectArray)
{
for(UINT index = 0; index < currentFrameData.MoveCount; index++)
{
//WebRTC
// DirectX capturer API may randomly return unmoved move_rects, …
Run Code Online (Sandbox Code Playgroud) 到目前为止,我能找到的唯一教程是在directx11tutorials.com上,这些教程基本上是从现有的样本中推断出来的.有谁知道在哪里可以找到其他教程,或者更好的使用DirectX 11的开源项目?(使用DirectX 11的项目代码的额外点:))
在DirectX 10中,您可以使用D3DX10提供的字体界面.在DirectX 11中,您应该使用DirectWrite.但看起来DirectWrite本身并不能说Direct3D?有什么基本的东西我不见了吗?如何使用DirectX 11绘制简单文本?
我可以使用C#app中的DirectX 11吗?
需要从WPF应用程序使用DirectSound..NET 4 W7 x64
我在使用Visual Studio 2012的Windows 7上.
当我编译时,我得到了很多由winerror.h和dxgi.h,dxgitype.h,d3d11.h,d3d10.h引起的宏重定义警告.例如DXGI_STATUS_OCCLUDED,DXGI_STATUS_CLIPPED,DXGI_STATUS_NO_REDIRECTION等.
我想这是因为安装了windows sdk 8.我怎么能避免这个?有没有办法可以从我的项目中排除这些新库?
在MSDN文档解释说,在DirectX 11有多种方法以编程方式填充的DirectX 11质地:
(1)使用默认使用纹理创建纹理,并使用内存中的数据对其进行初始化
(2)使用动态用法创建纹理,使用DeviceContext Map获取指向纹理内存的指针,写入它,然后使用Unmap指示你已完成(此时我猜它被复制到gpu)
(3)使用分段用法创建纹理,并按照与动态纹理相同的步骤进行,但是通过调用ID3D11DeviceContext.CopyResource来使用此分段纹理依次填充(非不可变)默认或动态纹理.
然而,文档并没有解释每种方法的优缺点,而且我对directx还是一个新手,所以对我来说一点也不清楚.
在directx 11中以编程方式创建纹理的每种方法的优缺点是什么?
旁注:我已经读过,在分段纹理的上下文中,从gpu 读回不是缓冲的,所以你必须做自己的双缓冲.但我不知道这是否准确,是否适用于使用分段纹理(甚至真正意味着什么)写作.
第二方面注意: Map方法文档说它获取了一个指向子资源中数据的指针,并拒绝GPU访问该子资源.当GPU想要访问其底层数据已被Map调用的纹理时,它会做什么?失速?(我问,因为这听起来像是我询问的利弊的一部分)
美好的一天,我正在尝试使用nvidia 3DVision和两个IP摄像头显示实时立体视频.我对DirectX完全不熟悉,但已尝试在此网站和其他网站上完成一些教程和其他问题.现在,我正在为左眼和右眼显示两个静态位图.一旦我的程序部分工作,这些将被我的相机中的位图取代.这个问题NV_STEREO_IMAGE_SIGNATURE和DirectX 10/11(nVidia 3D Vision)给了我很多帮助,但我仍然在努力让我的程序正常工作.我发现我的快门眼镜开始正常工作,但只有右眼图像显示,而左眼仍然是空白(鼠标光标除外).
这是我生成立体图像的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using SlimDX;
using SlimDX.Direct3D11;
using SlimDX.Windows;
using SlimDX.DXGI;
using Device = SlimDX.Direct3D11.Device; // Make sure we use DX11
using Resource = SlimDX.Direct3D11.Resource;
namespace SlimDxTest2
{
static class Program
{
private static Device device; // DirectX11 Device
private static int Count; // Just to make sure things are being updated
// The NVSTEREO header.
static byte[] stereo_data = new …
Run Code Online (Sandbox Code Playgroud)