SharpDX编号类,在哪里可以找到它们各自的文档/职责?

时间:2018-10-25 23:35:21

标签: directx sharpdx

每次查看SharpDX代码并尝试遵循DirectX文档时,我都很难受。是否清楚地列出了每个编号的类所映射的位置以及它们为什么存在?

我说的是

            DXGI.Device
            DXGI.Device1
            DXGI.Device2
            DXGI.Device3
            DXGI.Device4

            SharpDX.Direct3D11.Device
            SharpDX.Direct3D11.Device1
            SharpDX.Direct3D11.Device11On12
            SharpDX.Direct3D11.Device2
            SharpDX.Direct3D11.Device3
            SharpDX.Direct3D11.Device4
            SharpDX.Direct3D11.Device5

            SharpDX.Direct3D11.DeviceContext
            SharpDX.Direct3D11.DeviceContext1
            SharpDX.Direct3D11.DeviceContext2
            SharpDX.Direct3D11.DeviceContext3
            SharpDX.Direct3D11.DeviceContext4

每次我都从代码开始时,我发现它似乎是被黑魔法选中的,我不知道从那里去哪里,例如我正在使用它(从我找到的代码中),我也不知道为什么它是device3 ,工厂3带有我们查询接口swapchain2的swapchain1:

        using (DXGI.Device3 dxgiDevice3 = this.device.QueryInterface<DXGI.Device3>())
        using (DXGI.Factory3 dxgiFactory3 = dxgiDevice3.Adapter.GetParent<DXGI.Factory3>())
        {

            DXGI.SwapChain1 swapChain1 = new DXGI.SwapChain1(dxgiFactory3, this.device, ref swapChainDescription);
            this.swapChain = swapChain1.QueryInterface<DXGI.SwapChain2>();
        }

如果完整的解释在答案范围之内太大,那么可以通过任何链接让我开始弄清楚什么C ++ DX映射到哪个编号对象以及为什么最受欢迎。

在这种情况下,我只对DX> = 11感兴趣,并且在UWP项目中使用SharpDX。

2 个答案:

答案 0 :(得分:1)

Refer here可以找到所有所有SharpDx对象,特别是对于HereDXGI,在那里您可以看到Device映射到IDXGIDevice。 请注意,IDXGIDevice超链接,它们引用C ++对象的文档。并以此方式Device1Device2

您会发现这里有一个非常简单的逻辑,SharpDx将C ++对象的名称分为Namespaceclass name, 例如,您将获得命名空间:IDXGIDevice和类名称:DXG,而不是Device

在每个C ++对象的文档中,您可以找到here。 并且详细说明了可以使用该对象的操作系统。 随着数量的增加,该对象将在更新的操作系统中工作。 例如,IDXGIDevice1Windows 7下工作,但是IDXGIDevice3Windows 8.1或更高版本下工作。

答案 1 :(得分:1)

SharpDx是DirectX的一个非常薄的包装,DirectX中的几乎所有内容都在SharpDx中表示为传递,带有一些命名和调用约定,以适应.net世界。

有关SharpDx的真实文档基本上是不存在的,因此您必须做其他所有事情。如果您是从SharpDx入手,则直接查看SharpDx API列表和头文件,以了解要表达的基本DirectX函数。一旦有了DirectX函数的名称,就可以阅读MSDN文档以了解该函数的工作原理。如果您是从DirectX开始的,那么首先请看一下MSDN,以了解它的工作原理和命名方式,然后转到SharpDx API和头文件中,以了解在SharpDx中如何包装(命名和公开)该函数。

对于您提出的特定问题, SharpDx设备编号标识了要包装的Direct3D版本

Direct3D 11.1 device ==> ID3D11Device1 ==> SharpDX.Direct3D11.Device1

Direct3D 11.2 device ==> ID3D11Device2 ==> SharpDX.Direct3D11.Device2

Direct3D 11.3 device ==> ID3D11Device3 ==> SharpDX.Direct3D11.Device3

以此类推。

自然,每个版本都有一个略有不同(“改进”)的界面。较低的版本号几乎可以在任何地方工作,而较高的版本号包括附加功能,可能需要您的视频卡和/或操作系统特定的功能。您可以在here的小节中了解每种版本的API。

例如,添加到ID3D11Device5接口的新方法的描述(即,自ID3D11Device4以来的新功能)为here。在这种情况下,Device5可以创建围栏对象并打开共享围栏的句柄。

当示例代码使用特定的设备编号时,通常是因为该代码需要某些功能,而这些功能在Direct3D的早期版本中是不存在的。通常,您希望使用编号最小的设备(和工厂等),因为这样可以使您的代码在各种机器和视频卡上运行。

如果您发现示例代码创建了SharpDX.Direct3D11.Device1,但似乎没有使用SharpDX.Direct3D11.Device中的方法之外的任何方法,则可能是由于两个原因之一。首先,作者可能知道后面的示例将需要Direct3D 11.1之前不存在的方法或字段。其次,作者可能知道,所有能够运行该示例的视频卡和操作系统都将能够运行Direct3D 11.1。

对于刚起步的人,我建议您坚持使用Direct3D(和Direct2D)11.1版,即DXGI.Device1SharpDX.Direct3D11.Device1SharpDX.Direct3D11.DeviceContext1。它们很可能在您会遇到的任何计算机上运行。仅在您确实需要该版本中未提供的某些功能时,才增加版本号。

另一个提示:如果您阅读了有关某些Direct3D或Direct2D功能的线程,而您似乎在SharpDx的任何地方都找不到它,请查看Direct3D API以了解哪个版本号首先包含该功能。然后浏览该版本的SharpDx API(或更好的头文件),直到看到一个类似命名的元素。它可能会以意想不到的方式包装,但是即使您很难找到它,AFAIK也会全部暴露出来。