Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
';使用';C#和sharpdx中的范围_C#_Scope_Using_Sharpdx - Fatal编程技术网

';使用';C#和sharpdx中的范围

';使用';C#和sharpdx中的范围,c#,scope,using,sharpdx,C#,Scope,Using,Sharpdx,这个问题与C#有关,但我最近开始学习sharpdx,我想出了两种初始化资源的方法。首先将资源(本例中为Texture2D)存储为全局变量。然后在代码中分配值并将其传递给SARPDX的方法(并向下到C++,即SARPPDX封装) 指向内存中的同一对象。离开using语句后,backBuffer将被释放,不再指向任何对象,但_renderTargetView.Resource不会更改,仍然指向它在using语句中所指向的对象 我做了一个快速测试: class innerClass { pub

这个问题与C#有关,但我最近开始学习sharpdx,我想出了两种初始化资源的方法。首先将资源(本例中为Texture2D)存储为全局变量。然后在代码中分配值并将其传递给SARPDX的方法(并向下到C++,即SARPPDX封装)

指向内存中的同一对象。离开using语句后,backBuffer将被释放,不再指向任何对象,但_renderTargetView.Resource不会更改,仍然指向它在using语句中所指向的对象

我做了一个快速测试:

class innerClass
{
    public Texture2D someResource;
}
/****/
innerClass ic = new innerClass();

using (Texture2D t2 = m_swapChain.GetBackBuffer<Texture2D>(0))
{
     ic.someResource = t2;
}
类内部类
{
公共资源;
}
/****/
innerClass ic=新的innerClass();
使用(Texture2D t2=m_swapChain.GetBackBuffer(0))
{
ic.someResource=t2;
}
在这里,t2和ic.someResource都被释放,并且在我离开using块时指向nothing,这是我期望它首先工作的方式

现在,问题是:

1) 我是否应该假设,在第一个示例中,实际上是sharpdx的方法确保内部Resource不会被处理,即使传递给它的c#对象也不会被处理?如果C#决定覆盖那个内存块,它不会在某个时候崩溃吗


2) 传递此类资源的更好/更安全的方式是什么?使用block,或在开始时声明它,并在最后进行处置?

SharpDX保留对底层图形资源的引用计数。例如,当您获取对后缓冲区的引用时:

Texture2D backBuffer=\u swapChain.GetBackBuffer(0)

然后获取相同基础资源的渲染目标视图:

\u renderTargetView=新的renderTargetView(\u d3d11设备,backBuffer)

您将需要处理这两个组件以及交换链,以从GPU释放后缓冲区资源


传递此类资源的更好/更安全的方式是什么?使用block,还是在开始时声明它并在最后进行处置


这取决于使用情况,但据我所见,通常获取资源句柄的类会在其自己的
IDisposable

实现中处理它,我曾在SlimDX上工作过,我在那里看到了非常类似的现象。我注意到SlimDX管理其内部参考计数器。当您调用GetBackBuffer时,它会增加ref计数器,当您处理它时,它只会减少reference计数器,这可能会导致仅当计数器为零时才实际清理纹理。在BackBuffer示例中,系统仍保留一个引用,因此未清理,而在第二个示例中,最后一个引用被释放。我会检查SharpDX上的行为是否相同。
using(Texture2D backBuffer = _swapChain.GetBackBuffer<Texture2D>(0))
{
    _renderTargetView = new RenderTargetView(_d3d11Device, backBuffer);
}
backBuffer.NativePointer
_renderTargetView.Resource.NativePointer
class innerClass
{
    public Texture2D someResource;
}
/****/
innerClass ic = new innerClass();

using (Texture2D t2 = m_swapChain.GetBackBuffer<Texture2D>(0))
{
     ic.someResource = t2;
}