我知道你可以卸载monogame项目中的所有内容,但我想知道是否可以卸载特定纹理,例如,在一个级别之后。
我有一个使用.GetData和.SetData修改的纹理,我在其他级别重用此纹理以及播放器死亡时,但是当我在另一个重复级别使用它时,或者当我重新启动当前级别时,纹理保持其修改状态,而不是原始状态。如果我卸载所有内容,那么纹理会被修改并在关卡的开头重置,但是我会丢失一些其他内容。
所以真正的问题是,你可以在不卸载所有内容的情况下卸载特定的纹理吗?
任何帮助将不胜感激:)
答案 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方法。这将在覆盖修改后的纹理时加载默认纹理。