Управление памятью Unity: спрайты в загруженных объектах сценариев & mdash; Как память использует масштаб?

Я создал этот класс:

public class Streams {
    /**
     * Converts Iterable to stream
     */
    public static <T> Stream<T>  streamOf(final Iterable<T> iterable) {
        return toStream(iterable, false);
    }

    /**
     * Converts Iterable to parallel stream
     */
    public static <T> Stream<T> parallelStreamOf(final Iterable<T> iterable) {
        return toStream(iterable, true);
    }

    private static <T> Stream<T> toStream(final Iterable<T> iterable, final boolean isParallel) {
        return StreamSupport.stream(iterable.spliterator(), isParallel);
    }
}

Я думаю, что он отлично читается, потому что вам не нужно думать о spliterators и booleans (isParallel).

2
задан Aggressor 3 March 2019 в 13:08
поделиться

1 ответ

Как сказал Дейв в своем комментарии, Sprite является ссылочным типом, поэтому Unity загружает спрайт в память один раз, а затем все другие экземпляры объектов, которые ссылаются на конкретную точку Sprite, на ее адрес памяти (как система указателей C). должно сработать). Так что в вашем случае, даже если вы создадите 1000 объектов из вашего объекта Scriptable, все они будут указывать на один и тот же Sprite.

Как правило, если вы используете Resources.Load() для объекта, то каждый загруженный объект будет использовать ту же ссылку на переменную, что и родительский объект Scriptable. Но если вы создаете новый объект каждый раз, когда вы хотите создать его, скажем, с помощью конструктора класса, то каждый объект (и впоследствии их переменные) будет иметь свое собственное пространство в памяти. В вашем случае это произошло бы, если бы вы использовали Sprite mySprite = new Sprite() каждый раз, когда создавали объект Scriptable.

Таким образом, нет памяти за добавление нескольких экземпляров одного и того же Sprite в ваши объекты Scriptable (использование CPU / GPU - другая проблема, не связанная с вашим вопросом, но, тем не менее, заслуживающая упоминания). Проверка вашей памяти может иметь изменяющиеся значения, если вы выполняете ее в своей игре вместе со всеми другими выполняемыми операциями, поэтому я предлагаю вам создать новый проект и затем попытаться измерить значения из инспектора. Если вы это сделаете, пожалуйста, поделитесь своими выводами здесь, так как это интересная тема.

Также, прочитайте этот пост из обмена стека GameDev для получения дополнительной информации по вашему вопросу.

0
ответ дан D.Christodoulou 3 March 2019 в 13:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: