【问题标题】:Is base class loaded content duplicated in the derived class?基类加载的内容是否在派生类中重复?
【发布时间】:2020-05-21 22:33:52
【问题描述】:

基类加载的内容是否在派生类中重复?

我有一个基类“GameScreen”和许多派生类(“TitleScreen”、“PlayerSetupScreen”、“GameplayScreen”等)。如果我在基类“GameScreen”中加载图形内容(所有屏幕通用),该内容是否会在每个派生屏幕的 RAM 中复制,还是只加载一次并简单引用?我假设是后者,但我只需要确定,因为我打算以这种方式加载更多内容。任何帮助将不胜感激。

我正在使用 Visual Studio 编写 C# Monogame。

【问题讨论】:

  • 其实这个问题太暧昧了。然而我觉得你在两个方面都错了。类不会共享数据,除非它是静态的。如果你在一个类中加载数据,另一个类不会以任何正常意义看到它,除非你让它们都引用相同的数据
  • 这确实是面向对象编程的基础知识,在这里太宽泛了。
  • 基类只定义了一个type,子类从中派生出它们的定义。它与那些共享数据的类的 instances 或类似的东西无关。
  • @seesharper 当然可以。 public class A { protected object a; } public class B : A {}。字段a 已共享。
  • @CodingYoshi 如果我有一个Animal 类和一个从Animal 派生的Giraffe 类,并且Animal 有一些字段X(引用类型但没关系),那么确定, Giraffes 将有一个字段 X。但是 Giraffes 的实例不与 Animals 的实例共享 data - 显然! - 除了Giraffe 与自己作为Animal 的实例“共享”数据。

标签: c# loading monogame derived-class base-class


【解决方案1】:

如果您发布一些代码来显示您所做的事情,您的问题会更清楚,但我想我明白了,所以我会为您做。我假设你有这样的东西:

public abstract class GameScreen
{
    protected Texture2D Texture { get; set; }
}

public class TitleScreen : GameScreen
{
}

public class GameplayScreen : GameScreen
{
}

在你的代码的其他地方你正在做这样的事情:

var titleScreen = new TitleScreen { Texture = Content.Load<Texture2D>("something") };
var gameplayScreen = new GameplayScreen { Texture = Content.Load<Texture2D>("something") };

简单地说,在这段代码中,MonoGame 只会加载一次“某物”纹理并将其缓存在ContentManager 中。当第二次加载相同的内容时,ContentManager 将返回对相同内容实例的引用。

这实际上意味着每个“屏幕”将只携带一个指向它关心的内容的引用指针。这不会占用太多内存,所以不用担心。

可能会占用大量 RAM 的是多次调用 Content.Load 来加载不同内容。 ContentManager 不会卸载此内容,直到它被显式释放或卸载,即使没有任何东西持有对它的引用。

也就是说,在您的游戏变得更大之前,您不太可能需要担心这些问题。在事情变成真正的问题之前,不要过度复杂化。如果您开始注意到问题,您可以随时重构您的代码。

【讨论】:

  • 感谢您提供的信息反馈。知道重复内容仅供参考,这令人放心。我决定在主 Game 类中加载通用内容,以便它随时可用。
猜你喜欢
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多