我们可以卸载特定的纹理吗? MonoGame

时间:2015-11-20 22:57:01

标签: c# monogame

我知道你可以卸载monogame项目中的所有内容,但我想知道是否可以卸载特定纹理,例如,在一个级别之后。

我有一个使用.GetData和.SetData修改的纹理,我在其他级别重用此纹理以及播放器死亡时,但是当我在另一个重复级别使用它时,或者当我重新启动当前级别时,纹理保持其修改状态,而不是原始状态。如果我卸载所有内容,那么纹理会被修改并在关卡的开头重置,但是我会丢失一些其他内容。

所以真正的问题是,你可以在不卸载所有内容的情况下卸载特定的纹理吗?

任何帮助将不胜感激:)

2 个答案:

答案 0 :(得分:1)

简单地处理对象的问题在于,代码的其他部分无法知道对象是否已被处置。 ContentManager仅提供Unload()方法,该方法卸载并处置所有资源,您不能简单地创建自己的派生实现,因为其内部可用资产列表为{{1} }(不是private)。如果您实施了自己的protected方法,则此私有列表仍会保留对您资产的引用,然后在Unload(string asset)处置时再次尝试处理它(处置两次应该如果资源类正确实现了它,但是如果没有别的,那么就是阻止GC回收这个内存。)

实现ContentManager方法的唯一方法是直接更改MonoGame源。

通用方法稍微容易一些:只需使用多个ContentManager.Unload(string assetName)实例,即ContentManager类中的共享ContentManager实例,以及每个实例中的单独私有Game实例{1}}(或用于组织游戏的任何内容),无论何时切换场景,都会处理。

对于异步内容加载,我还为我的应用程序实现了一个自定义异步内容管理器,它将首次访问时的加载作业排入一个单独的线程,并在后续调用时返回ContentManager,直到资源完全加载。

答案 1 :(得分:0)

要回答您的问题而不是处理整个内容管理器,您可以自行处理纹理对象。

Texture2D MyTexture = Content.Load<Texture2D>("Texture.png");

您的内容管理员(&#34;内容&#34;)现在已加载此纹理。

MyTexture.Dispose();

通过处理纹理对象而不是整个内容管理器,只有指定的纹理才会被处理掉#34;。虽然只会卸载纹理,但不会删除内容管理器中的引用。

正如 craftworkgames 所指出的,对纹理对象的引用将保留在内容管理器中,这意味着它无法使用Content.Load&lt;&gt;()重新加载。

我认为您正在寻找的方法不是处理纹理,而只是在关卡重置时覆盖纹理。当级别重置时,您只需再次在同一纹理对象上调用Content.Load方法。这将在覆盖修改后的纹理时加载默认纹理。