我知道您可以卸载一个单名项目中的所有内容,但我想知道是否有可能卸载特定的纹理,例如,在一个级别之后。
我有一个使用.GetData和.SetData修改的纹理,并且在其他级别以及播放机死亡时重复使用这个纹理,但是当我在另一个重复级别中使用它时,或者当我重新启动当前级别时,纹理仍然处于其修改状态,而不是原始状态。如果我卸载所有的内容,那么纹理会被修改,并在级别的开始重置,但是我失去了一些其他的内容。
所以真正的问题是,你能在不卸载所有内容的情况下卸载特定的纹理吗?
如能提供任何帮助,将不胜感激:)
发布于 2015-11-25 16:29:20
简单地处理对象的问题是,您的代码的其他部分无法知道对象是否已被释放。ContentManager
只提供Unload()
方法,该方法卸载和处理所有资源,您不能简单地创建自己的派生实现,因为它的可支配资产的内部列表是private
(而不是protected
)。如果您实现了您自己的Unload(string asset)
方法,这个私有列表仍将保存对您的资产的引用,然后在释放ContentManager
时再次尝试释放它(如果资源类正确地实现了该方法,则应进行两次处理,但如果没有其他任何方法,则阻止GC回收此内存)。
因此,实现ContentManager.Unload(string assetName)
方法的唯一方法是直接更改MonoGame源。
普通方法稍微容易一些:只需使用多个ContentManager
实例,即Game
类中的共享ContentManager
实例,在每个GameScreen
中使用一个单独的私有ContentManager
实例(或用于组织游戏的任何东西),只要切换场景,就会对其进行处理。
对于异步内容加载,我还为我的应用程序实现了一个自定义的异步内容管理器,它在第一次访问时将加载任务排队到一个单独的线程中,并在随后的调用中返回null
,直到资源完全加载。
发布于 2015-11-20 23:52:43
要回答您的问题,而不是处理整个内容管理器,您可以释放纹理对象本身。
Texture2D MyTexture = Content.Load<Texture2D>("Texture.png");
您的内容管理器( " content“)现在加载了这个纹理。
MyTexture.Dispose();
通过配置纹理对象而不是整个内容管理器,只有指定的纹理才会被“释放”。虽然纹理将只被卸载,但内容管理器中的引用将不会被删除。
正如工艺游戏所指出的,对纹理对象的引用将保留在内容管理器中,这意味着它不能使用Content.Load<>()重新加载。
我认为您要寻找的方法不是处理纹理,而是在级别重置时覆盖它。当级别重置时,您只需再次调用同一纹理对象上的Content.Load方法。这将加载默认纹理回覆盖您修改的一个。
https://stackoverflow.com/questions/33837436
复制相似问题