【问题标题】:LibGDX static AssetManager for Desktop Only GameLibGDX 静态 AssetManager 仅用于桌面游戏
【发布时间】:2017-09-08 13:15:53
【问题描述】:

我知道关于这个问题有很多话题,但就我而言,我发现的唯一一个 here 没有得到回答。

所以我问同样的问题:

我是否需要为仅桌面游戏设置我的 AssetManager 静态?

现在只是总结和澄清手游静态引用问题,假设我也想在手游上使用静态 AssetManager(因为我觉得它更方便)。我知道这会导致纹理在 pause() 上被处理,但我可以在 resume() 上重新加载它们,对吗?

假设我有一个使用纹理 A(之前加载到静态 AssetManager)的播放器动画。如果游戏暂停,AssetManager 引用很可能会丢失。如果在 resume() 方法中我重新创建此 AssetManager (MyGame.asset = new AssetManager()) 并重新加载纹理 A我的动画会发生什么?我还需要重新加载吗?

我在Texture Javadoc 中找到了这个短语:托管纹理会自动重新加载。我认为这仅对非静态 AssetManager 有效,对吗?

最后几个问题只是在这里总结一下静态 AssetManager 在移动应用上的使用。

【问题讨论】:

  • 静态变量在面向对象设计中不好,您应该避免静态引用您的资产,因为静态的生命周期可能与创建资源的上下文的生命周期不同。
  • 是的,阿布舍克说的

标签: libgdx


【解决方案1】:

正如 Abhishek Aryan 正确指出的那样:对资源使用静态变量是基本设计缺陷的严重迹象。无论您在哪个平台上运行应用程序,您都应该担心这一点,在桌面上也是如此。根据您设计的其余部分,您可能会也可能不会遇到问题。

通常存在这些设计缺陷,起初它似乎对您来说还不错。但是以后你会遇到问题。不幸的是,到那时,您的开发已经取得了如此大的进步,以至于您无法轻易纠正基本问题,而是需要解决它。

注意顺便说一句,只要您妥善管理静态资源(这比不使用它们更难),从技术上讲,在任何平台上使用静态资源都是完全可能的。例如,libgdx 本身是围绕Gdx 静态成员构建的。

回答您的其他问题:

我知道这会导致纹理在 pause() 上被处理,但我可以在 resume() 上重新加载它们,对吧?

这是不正确的。纹理永远不会在pause 中处理,您也不需要在resume 中重新加载它们。

如果游戏暂停,AssetManager 引用很可能会丢失。

这是不正确的。我不知道你为什么会这么想,但事实并非如此。

我还需要重新加载吗?

如果您决定处理旧纹理(您必须自己处理,它不会自动为您完成),那么任何使用该纹理的Animation 都将无效。因此,确实,如果您希望您的动画使用不同的纹理,那么您将不得不更新您的动画或重新创建它。

我认为这仅对非静态 AssetManager 有效,对吗?

不,托管纹理不关心您是否使用静态资源。当上下文丢失时,它们总是会重新加载。请注意,您不太可能遇到这种情况,因此您不必关心这一点。

您可能还想阅读 this post 我不久前写的关于这个主题的文章。

【讨论】:

  • 现在我的游戏 AssetManager 不是静态的,但我必须通过我的所有课程传递它的引用,我只是想知道,因为我只需要一个 AssetManager,为什么不使用静态的作为方便我在this post 看到了。我读了你的帖子,现在我意识到我误解了移动设备上的工作方式,正如你所说的“android 存在另一个问题,它重用了 VM”我现在明白了。我想我会继续传递 AssetManager 引用。
猜你喜欢
  • 2017-03-10
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多