Дублируется ли загруженный базовый класс контент в производном классе? - PullRequest
0 голосов
/ 06 февраля 2020

Дублируется ли загруженный базовый класс контент в производном классе?

У меня есть базовый класс 'GameScreen' и множество производных классов ('TitleScreen', 'PlayerSetupScreen', 'GameplayScreen' и др. c.). Если я загружу графический контент (который является общим для всех экранов) в базовый класс «GameScreen», будет ли этот контент дублироваться в ОЗУ для каждого производного экрана или он будет загружен один раз и на него будут просто ссылаться? Я предполагаю последнее, но мне просто нужно быть уверенным, так как я намерен загрузить намного больше контента таким образом. Буду признателен за любую помощь.

Я кодирую в C# Monogame, используя Visual Studio.

1 Ответ

0 голосов
/ 06 февраля 2020

Ваш вопрос был бы намного яснее, если бы вы опубликовали какой-то код, показывающий, что вы сделали, но я думаю, что понимаю, поэтому сделаю это для вас. Я предполагаю, что у вас есть что-то вроде этого:

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 вернет ссылку на тот же экземпляр контента.

Это фактически означает, что каждый «экран» будет нести только указатель ссылки на содержание это заботится о. Это не займет много памяти, поэтому не беспокойтесь об этом.

То, что может занять много памяти, многократно вызывает Content.Load для загрузки различного контента. ContentManager не будет выгружать это содержимое до тех пор, пока оно не будет удалено или выгружено явно, даже если ничто не содержит ссылки на него.

При этом очень маловероятно, что вам придется беспокоиться о каком-либо из этого материала пока ваша игра не станет намного больше. Не усложняйте вещи, пока они не станут настоящей проблемой. Вы всегда можете выполнить рефакторинг своего кода позже, если начнете замечать проблемы.

...