Использование памяти несколькими плитами на основе Texture2D в XNA - PullRequest
0 голосов
/ 15 февраля 2012

начали писать простую процедуру прокрутки тайлов. Мне нужно, чтобы каждая плитка имела текстуру с несколькими «кадрами» для анимации. Поскольку все плитки будут использовать одно и то же изображение, меня беспокоит использование памяти. Поскольку каждый класс плиток использует Texture2D, означает ли это, что каждый экземпляр плитки будет иметь копию изображения или текстура в Texture2D является ссылкой на одну текстуру? У меня 42 тайла, и я не хочу, чтобы в памяти было 42 копии одного и того же изображения, поскольку это было бы расточительно То, что я хочу, это 42 плитки, ссылающиеся на одно изображение как Texture2D. Возможно ли это или я должен подходить к этому по-другому?

Ответы [ 3 ]

0 голосов
/ 17 февраля 2012

Texture2d ссылается на текстуру в gpu, и вы можете хранить одну и ту же текстуру дважды в графической памяти, если хотите, но такое поведение нежелательно, поэтому xna предоставляет менеджер контента, чтобы избежать дублирования.

Если вы используете Content.Load (актив) для загрузки текстуры актива, контент загружает его и содержит ссылку на новый объект texture2d, поэтому при следующей загрузке этой текстуры актива он вернет ту же созданную ссылку texture2d до этого.

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

0 голосов
/ 17 февраля 2012

Я не совсем понимаю вопрос, но я думаю, что вы, возможно, захотите взглянуть на использование текстурного атласа ... Посмотрите, например, http://rbwhitaker.wikidot.com/texture-atlases-2

0 голосов
/ 15 февраля 2012

В C # обычно так, что базовые структуры данных имеют проход по значению, что означает, что значение копируется в новую область памяти. Уязвимые типы данных являются только основными, такими как string, int, float и т. Д.

Но если у вас есть объект и вы передаете его как значение или как параметр или просто делаете присваивание другой переменной, не весь объект копируется. Вместо этого целевой объект берет адрес в памяти старого объекта и сохраняет его как свой собственный объект, но все еще ссылаясь на оригинал.

Чтобы скопировать или назначить объект новому пространству памяти, используйте метод CopyTo () -.

...