RenderTexture2D 只是一个临时内存结构,并且会很快且定期地刷新。这是因为它被重用以节省内存并在较小程度上加快速度。因此,您应该只将其视为存储纹理的非常临时的地方。您需要将其转移到合适的 Texture2D 上,这样可以保存更长时间。就像做一个简单的:
Texture2D YourPic = (RenderTexture2D)SomeRenderedPic;
不会这样做。这只是将指针传递给渲染图像的内存空间。当显卡丢弃它时,它仍然会消失。你想做的更像是:
Color[] MyColorArray = new Color[SomeRenderedPic.Width * SomeRenderedPic.Height];
SomeRendeerPic.GetData<Color>(MyColorArray);
Texture2D YourPic = new Texture2D(
GraphicsDevice,
SomeRenderedPic.Width,
SomeRenderedPic.Height);
YourPic.SetData<Color>(MyColorArray);
现在,如果我正确地编写了该代码,那么它应该将数据而不是指针存储到新纹理中。这使得新纹理拥有自己独特的内存空间,不会像渲染目标空间那样被刷新。
这种方法有一个缺点。它不能在 XNA 的全刷新率下完成。(大约每秒 60 帧……我想……也许是 30 帧……我忘了。)无论如何,如果您需要非常持续的刷新,这可能还不够快。但是,如果您正在创建一个不会真正改变太多的静态纹理,那么这可能会为您解决问题。
希望这是有道理的,因为我在飞行中和深夜写这篇文章。如果这不起作用,我道歉。如果需要,请随时通过 jareth_gk@hotmail.com 给我写信。如果我能够回答您的问题,我将很高兴。
否则祝你好运,并有创造力。我确信有一个解决方案。
x 杰里米·M。