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