Путаница: разница между SKSpriteNode и SKTexture.

Я запутался с SKSpriteNode и SKTexture Node. Я видел в руководствах, что SKSpriteNode можно использовать для добавления изображения, например [SKSpriteNode spritenodewithimagename:@"someimag"]; и в SKTexture происходит то же самое, что и [SKTexture texturewithimge/file];

в чем разница между текстурой и изображением. Если мы добавляем изображение с помощью SKSpriteNode, то в чем причина использования SKTexture или если мы используем SKTexture и атласы текстур, то почему мы добавили изображение для добавления в SKSpriteNode.

Путаница есть, какая разница между ними обоими.


person Programmer    schedule 28.09.2013    source источник


Ответы (1)


SKSpriteNode — это узел, который отображает (рендерит) SKTexture на экране в заданной позиции с дополнительным масштабированием и растяжением.

SKTexture — это класс хранения, который содержит файл изображения в формате, подходящем для рендеринга, а также дополнительную информацию, такую ​​как прямоугольник кадра, если текстура ссылается только на меньшую часть атласа изображения/текстуры.

Одна из причин их разделения заключается в том, что вы обычно хотите, чтобы несколько спрайтов рисовались с помощью одной и той же SKTexture или из одного и того же SKTextureAtlas. Это позволяет избежать необходимости хранить в памяти копии одного и того же изображения для каждого отдельного спрайта, что легко стало бы непомерно чрезмерным. Например, текстура размером 4 МБ, используемая 100 спрайтами, по-прежнему использует 4 МБ памяти, а не 400 МБ.

Обновить, чтобы ответить на комментарий:

Термин «текстура» исходит из 70-х годов.

Текстура — это хранящееся в памяти представление изображения, отформатированное специально для использования при рендеринге. Распространенные форматы изображений (PNG, JPG, GIF и т. д.) плохо подходят для рендеринга с помощью графического чипа. Текстуры - это «формат изображения», который графическое оборудование и средства визуализации, такие как OpenGL, понимают и стандартизировали.

Если вы загружаете PNG или JPG в текстуру, формат изображения изменяется. Глубина цвета, альфа-канал, ориентация, структура памяти, метод сжатия могут измениться. Могут быть введены дополнительные данные, такие как уровни мип-карты, которые представляют собой исходную текстуру, уменьшенную на определенный процент, чтобы рисовать более удаленные полигоны с версией той же текстуры с более низким разрешением, что уменьшает алиасинг и ускоряет рендеринг.

Это только царапает поверхность, хотя. Важно помнить, что ни один движок рендеринга не работает с изображениями напрямую, они всегда конвертируются в текстуры. В основном это связано с эффективностью процесса рендеринга.

Всякий раз, когда вы указываете изображение непосредственно в API, таком как Sprite Kit, например spriteWithImageNamed:, внутренне происходит следующее: средство визуализации сначала проверяет, существует ли текстура с заданным именем изображения, и если да, то использует ее. Если такое изображение еще не загружено, оно будет загружено, преобразовано в текстуру и сохранено с именем изображения в качестве ключа для дальнейшего использования (это называется кэшированием текстуры).

person LearnCocos2D    schedule 28.09.2013
comment
Это отличный ответ. Устранил мою путаницу, но почему они называют это текстурой. Что такое текстура и что такое изображение? Изображения называются текстурами в SpriteKit. Если да, то почему мы указываем изображение непосредственно в узле Sprite как [SKSpriteNode SpriteNodeWithImageName: etcImage]; вместо указания изображения в SKTexture и доступа к нему с помощью SKSpriteNode. Будет ли изображение по-прежнему называться текстурой, если мы получим к нему доступ с помощью SKSpriteNode? Извините, что задаю дополнительные вопросы, но мне нужно немного больше разъяснений. И буду благодарен вам, если вы мне это тоже разъясните. Потому что это тоже связано с этим. - person Programmer; 28.09.2013
comment
@LearnCocos2D, вы сказали it will load the image, convert it to a texture, and store it with the image name as key for future reference означает ли это, что я могу просто создавать новую текстуру с тем же именем каждый раз, когда хочу создать новый спрайт (например, при сенсорном экране), и он будет кэширован, или мне нужно создать текстуру как свойство и затем, когда я создаю новый узел спрайта, получаю текстуру из этого свойства? - person Dima Deplov; 03.10.2014
comment
Отличный ответ! Спасибо, я чувствую себя менее невежественным - person ; 04.10.2014
comment
@flinth, вы можете сделать и то, и другое, или, если у вас есть существующий спрайт, просто создайте новый спрайт с помощью sprite.texture, поэтому вам не нужно это дополнительное свойство. Получение текстуры по имени сопряжено с некоторыми накладными расходами, поэтому, если у вас уже есть ссылка на текстуру, быстрее использовать ее, хотя обычно это играет роль только в том случае, если вы создаете несколько спрайтов на кадр и используете имя текстуры. - person LearnCocos2D; 04.10.2014