Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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
Xna 如何保留渲染目标结果,使其不易失性?_Xna_Rendering_Render To Texture - Fatal编程技术网

Xna 如何保留渲染目标结果,使其不易失性?

Xna 如何保留渲染目标结果,使其不易失性?,xna,rendering,render-to-texture,Xna,Rendering,Render To Texture,我正在用XNA编写一个应用程序,它依赖于只渲染一次,然后无限期使用的渲染目标。我遇到的问题是,在某些情况下,渲染目标的内容会丢失或被处置,例如当计算机进入睡眠状态或应用程序进入全屏模式时 在内容丢失时重新呈现到每个目标是一种选择,但可能不是最佳选择,因为当有许多目标时,这可能会相当昂贵 我可能会将每个结果保存为PNG图像,然后将该PNG加载回纹理,但这会增加很多I/O开销 建议?到目前为止,我发现最有可能的选择是使用GetData()和SetData()从RenderTarget2D复制到新的T

我正在用XNA编写一个应用程序,它依赖于只渲染一次,然后无限期使用的渲染目标。我遇到的问题是,在某些情况下,渲染目标的内容会丢失或被处置,例如当计算机进入睡眠状态或应用程序进入全屏模式时

在内容丢失时重新呈现到每个目标是一种选择,但可能不是最佳选择,因为当有许多目标时,这可能会相当昂贵

我可能会将每个结果保存为PNG图像,然后将该PNG加载回纹理,但这会增加很多I/O开销


建议?

到目前为止,我发现最有可能的选择是使用
GetData()
SetData()
RenderTarget2D
复制到新的
Texture2D。

因为我想要一个mip映射纹理,我发现我必须将每个mip级别分别复制到新纹理,就像这样。如果不这样做,对象将在您离开它时变黑,因为mip贴图中没有数据。请注意,渲染目标也必须是mip映射的

Texture2D copy = new Texture2D(graphicsDevice,
    renderTarget.Width, renderTarget.Height, true,
    renderTarget.Format);

// Set data for each mip map level
for (int i = 0; i < renderTarget.LevelCount; i++)
{
    // calculate the dimensions of the mip level.
    // Math.Max because dimensions always non-zero
    int width = (int)Math.Max((renderTarget.Width / Math.Pow(2, i)), 1);
    int height = (int)Math.Max((renderTarget.Height / Math.Pow(2, i)), 1);

    Color[] data = new Color[width * height];

    renderTarget.GetData<Color>(i, null, data, 0, data.Length);
    copy.SetData<Color>(i, null, data, 0, data.Length);
}
Texture2D copy=新的Texture2D(图形设备、,
renderTarget.Width,renderTarget.Height,true,
renderTarget.Format);
//为每个mip映射级别设置数据
对于(int i=0;i
我相信

Presetnationparameters pp = graphics.PresentationParameters;
pp.RenderTargetUsage = RenderTargetUsage.PreserveContents;

我们应该做到这一点。这与shadermodels如何在PC和Xbox上工作以及shadermodel 2+如何使其相等有关。(关于Xbox在默认情况下覆盖其输出缓冲区,因此旧的渲染目标会被清除,而PC只使用一些其他内存)

渲染目标不会隐式转换为纹理2D吗?比如,Texture2D tex=myRenderTarget应该可以工作。无论哪种方式,SetData()都是一个昂贵的过程。正如我在问题中提到的,这里的目标是获得一个可以无限期使用的非易失性
Texture2D
,因为全屏显示会导致
RenderTarget2Ds
丢失。+1,这是我应该给出的答案@A-Type
SetData
如果按帧进行,则成本很高。但在加载时,情况并不那么糟糕。