Unity/개념 및 분석

Unity Sprite Atlas [ + Sprite Sheet과 차이는?, Sprite Packer 멈춰! ]

최애뎡 2021. 7. 14. 00:02
728x90
반응형

[ * 필자 Unity 버전 == 2020.3.6f1 ]

 

https://docs.unity3d.com/kr/2021.1/Manual/class-SpriteAtlas.html

 

스프라이트 아틀라스 - Unity 매뉴얼

2D 프로젝트는 스프라이트와 다른 그래픽스를 사용하여 씬의 시각적 요소를 만듭니다. 따라서 단일 프로젝트에 다수의 텍스처 파일이 들어 있을 수 있습니다. 일반적으로 Unity는 씬의 각 텍스처

docs.unity3d.com

Sprite Atlas - 여러 개의 sprite(texture)를 하나의 texture로 결합해주는 아주 소듕한 Asset

 

* Sprite를 많이 사용하는 프로젝트에 용의 -> 2D 프로젝트가 아무래도 더 많이 사용하겠지

Unity는 scene의 각 texture에 대해 rendering 할 때마다 draw call을 발행

-> 많은 texture가 포함된 프로젝트의 경우 많은 draw call이 발생 -> 성능 저하

=> Sprite Atlas를 통해 여러 개의 draw call을 발생하는 대신 단일 texture를 호출 -> 하나의 draw call

 

https://docs.unity3d.com/kr/current/Manual/DrawCallBatching.html

 

드로우 콜 배칭 - Unity 매뉴얼

화면에 게임 오브젝트를 그리려면 엔진이 그래픽스 API(OpenGL, Direct3D 등)에 드로우 콜을 보내야 합니다. 드로우 콜에는 종종 리소스가 많이 사용되고, 그래픽스 API가 모든 드로우 콜에 중요 작업

docs.unity3d.com

* Draw call

- 간단히 게임 개발 성능에 있어서 굉장히 중요한 요소로서 cpu가 gpu에게 오브젝트를 그려달라고 명령하는 것

- 각기 다른 texture면 하나당 한번의 draw call이 발생 

=> 여러 texture을 한 texture에 모아 두고 사용하면 한 번의 draw call로 여러 texture사용 가능

==> sprite atlas and sprite sheet 사용해야 함

 

Sprite Atlas 간단히 살펴보자

먼저

https://docs.unity3d.com/2021.1/Documentation/Manual/SpritePacker.html

 

Unity - Manual: Sprite Packer

Sprite Atlas version 2 (Experimental) Sprite Packer Sprite Packer deprecation Please note that Sprite Packer is deprecated for Unity 2020.1 and newer, and will no longer be available as an option from Sprite Packer Modes. Existing Projects already using Sp

docs.unity3d.com

Atlas를 플레이 모드와 빌드에 사용하기 위해 설정

* 아래 보이는 V2는 아직 version 2인데 아직 실험적이어서 안정화될 때 까 진 V1 사용하는 게 좋을 듯

2D SpriteShape package가 있어야 Create sprite atlas asset을 할 수 있음

 

8개의 sprite를 배치한 상태

Stats를 클릭하여 상태를 보면 Batches 부분이 9로 된 것을 볼 수 있음 (1개는 배경)

* 잠시 알고 집 고갈 것 == Batch Draw Call을 하면서 생기는 모든 작업들을 통합한 것

예전에는 Batches가 아니라 DrawCall을 보여줬는데 변경됨 -> 어쨌든 draw call을 줄여야 -> Batches도 줄일 수 있음

 

이제 Sprite Atlas를 만들어서 효과를 보도록 하자

Package를 잘 추가했으면 이렇게 Create menu에 보일 것

 

만든 atlas에 sprite를 추가하는데

하나하나 추가하지 말고 Inspector window lock 걸고 옮기고 싶은 거 통째로 편하게 옮기자

* 한 폴더 안에 있는 sprite들을 모두 옮기려면 그냥 폴더 하나를 drag and drop해도 됨 (물론 sprite sheet도 가능)

* 기본 sprite 설정 당연히 가능하고 Preview로 미리 보기!

 

여기서 Atlas의 property를 보면 (sprite atlas 매뉴얼에 설명이 친절하게 되어있지만)

Type

- 타입을 Master 또는 Variant로 설정

- Master가 default

- Variant의 경우 Unity가 추가 프로퍼티 설정을 표시합니다. (해상도 적용하기에 유리)

https://docs.unity3d.com/kr/2021.1/Manual/MasterVariantAtlases.html

 

마스터 및 배리언트 스프라이트 아틀라스 - Unity 매뉴얼

Type 프로퍼티는 스프라이트 아틀라스가 ‘Master’ 또는 ’Variant__’ 타입인지 여부를 정의합니다. 기본적으로 스프라이트 아틀라스는 마스터 타입으로 생성됩니다. 배리언트 아틀라스__ 를 만들

docs.unity3d.com

* 마스터 아틀라스의 콘텐츠 복사본을 받아 자체 콘텐츠로 사용

위처럼 처음에 만든 Test_SpriteAtlas를 가져와서 Scale을 낮춰서 사용

 

Include in Build

- 빌드에 포함시키려면 체크

 

Allow Rotation

- Unity가 sprite를 sprite atlas에 패킹할 때 sprite가 회전하도록 허용하려면 체크

- 결합된 texture의 sprite 밀도를 극대화 가능

- But sprite atlas canvas ui 요소 texture가 있는 경우 이 옵션을 비활성화하라고 권유함

[ 패킹하는 동안 Unity가 sprite atlas의 texture를 회전할 때 씬의 방향도 같이 회전할 수 있다고 함 ]

 

Tight Packing

- 기본 직사각형 outline대신에 해당 sprite outline에 따라 sprite를 패킹하려면 체크

- 결합된 texturesprite 밀도를 극대화 가능

 

Padding - sprite atlas의 개별 sprite texture 사이에 있는 픽셀 수를 정의- sprite atlas에서 인접해 있는 sprite 간의 픽셀 중복을 방지하는 버퍼 역할

 

Read/Write Enabled

- 스크립트 함수(예: Texture2D.SetPixels 및 기타 Texture2D 함수)에서 텍스처 데이터에 액세스하도록 허용하려면 이 체크박스를 선택합니다. 이 프로퍼티를 활성화하면 Unity가 텍스처 데이터의 복사본을 생성합니다. 이 작업은 텍스처 에셋에 필요한 메모리 양을 두 배로 만들기 때문에 성능에 부정적 영향을 미칠 수 있습니다. 이 프로퍼티는 기본적으로 비활성화되어 있습니다. Unity는 다른 압축된 텍스처 타입을 읽을 수 없으므로 이 프로퍼티는 압축되지 않았거나 DXT 압축 방식으로 압축된 텍스처에만 유효합니다

 

Generate Mip Maps

- Mipmap 생성을 활성화하려면 체크

*https://docs.unity3d.com/kr/530/Manual/class-TextureImporter.html

 

유니티 - 매뉴얼: 2D 텍스처

절차적 머티리얼 에셋 2D 텍스처 Textures에 의해 Meshes, Particles 및 인터페이스에 활력을 부여합니다. 이것들은 오브젝트에 겹치거나 둘러싸거나 하는 사진 이미지와 동영상입니다. 이것들은 중요

docs.unity3d.com

[ Mipmap은 점진적으로 더 작게 한 사진 이미지를 여러 개 모은 목록이며, 이를 통해 실시간 3D 엔진의 퍼포먼스를 최적화합니다. 카메라에서 멀리 떨어진 오브젝트는 텍스처 작은 것을 사용합니다. 밉맵을 사용하면 33% 많은 메모리를 사용하지만, 사용하지 않으면 퍼포먼스의 손실이 현저해집니다. 게임의 텍스처에서는 항상 밉맵을 사용해야 하며, 유일한 예외는 작아질 수 없는 텍스처입니다 (예를 들어 .GUI 텍스처). ]

* 여러 사이즈의 texture을 통해 큰 사이즈를 굳이 사용할 필요가 없을 때 작은 사이즈를 사용할 수 있는 것

But 위 설명처럼 메모리 사용량은 증가하고 퍼포먼스는 좋아지는 이상한..? 홀홀

 

sRGB

- 감마 공간에 텍스처를 저장하려면 체크

* 감마 보정 시 원래 색보다 어둡게 처리되기 때문에 이미지 자체를 밝게 저장하기 위해

자세한 내용은

https://everyday-devup.tistory.com/60

 

[Unity] Gamma ( 감마 보정, 감마 색 공간 ) vs Linear ( 선형 색 공간 )

● Gamma ( 감마 보정, 감마 색 공간 ) : 선형적인 이미지의 색을 사람의 눈에 자연스럽게 모니터에 보일 수 있도록 이미지를 특정하게 수정하는 방법 ※ 베버의 법칙 : 인간의 시각은 밝기에 대해

everyday-devup.tistory.com

을 참고

-> 너무 자세하게 잘 정리 해두심

 

Filter Mode

- 변환 과정에서 스트레치 될 때 Unity가 패킹된 텍스처를 필터링하는 방식을 선택

https://docs.unity3d.com/kr/current/Manual/class-TextureImporter.html

 

텍스처 - Unity 매뉴얼

텍스처는 게임 오브젝트를 덮거나 래핑하는 이미지 또는 동영상 파일로 시각적 효과를 만들어 냅니다. 이 페이지에서는 텍스처 관리에 필요한 프로퍼티에 대해 자세하게 다룹니다.

docs.unity3d.com

Point - 텍스처를 가까이에서 보면 블럭 현상이 나타남

Bilinear - 텍스처를 가까이에서 보면 흐릿하게 보임

Trilinear - 바이리니어와 유사하게 텍스처가 서로 다른 MIP 레벨 간에 흐릿하게 보임

 

Objects For Packing

- Unity가 이 리스트의 모든 항목을 현재 선택된 sprite atlas로 패킹함

 

wow 길다 길어..

 

+

* 뭐 이렇게 까진 거의 안 하겠지만 각 sprite에서 Sprite Editor - custom outline을 통해 빈 부분을 더 줄여줄 수 있긴 함

(물론 Tight Packing 체크되어있을 경우)

 

어쨌든 sprite atlas 만들고 나니 8개에 대한 sprite의 밴치가 1로 준거 확인

 

+

https://docs.unity3d.com/kr/2021.1/Manual/FrameDebugger.html

 

프레임 디버거 - Unity 매뉴얼

프레임 디버거(Frame Debugger) 를 사용하면 실행 중인 게임을 특정 프레임에서 중지하고 해당 프레임을 렌더링하는 데 사용되는 개별 드로우 콜 을 볼 수 있습니다. 디버거는 드로우 콜의 리스트를

docs.unity3d.com

* Window - Analysis - Frame Debugger를 통해 draw call을 볼 수 있는데

 

위처럼 draw call의 정보를 볼 수 있고 프레임 재생을 제어할 수 있음

 

간단한 느낌은 이 정도이고 

https://gamedev.stackexchange.com/questions/69895/what-is-the-difference-between-a-sprite-sheet-and-a-texture-atlas

 

What is the difference between a sprite sheet and a texture atlas?

I wondering what the difference is between a sprite sheet and a texture atlas? Aren't both the same? In a sprite sheet you have some Sprites and in a texture atlas you also have some sprites, so w...

gamedev.stackexchange.com

sprite atlas vs sprite sheet

이 내용도 좀 알아야 하는데 글을 보면 일단 둘 다 비슷한 느낌인데 가장 유심히 본 답변은

=>

/*

스프라이트 시트와 텍스처 아틀라스는 거의 동일합니다. 둘 다 비트맵 이미지 파일(jpg, png 등)이며 일반적으로 그리드에 여러 개의 작은 이미지가 포함되어 있으며 좌표로 개별 이미지를 찾는 소프트웨어/게임 엔진을 사용하여 인덱싱 되고 표시됩니다. 또한 둘 다 단일 파일의 관리 및 로드만 요구하여 리소스 관리를 단순화하고 드로우 콜을 줄이는 역할을 합니다.

이 시트/아틀라스에는 캐릭터의 프레임별 애니메이션(일반적으로 "스프라이트 시트"에 사용됨)과 벽의 텍스처로 타일링될 이미지(일명 "텍스처 아틀라스")가 있습니다.

차이점은 일반적으로 구현되는 방식인 것 같습니다. 다른 답변에서 알 수 있듯이 스프라이트 시트는 애니메이션이나 버튼용 2D 게임에서 자주 사용되는 반면 텍스처 아틀라스의 이미지는 메쉬 개체의 텍스처로 사용됩니다.

컨텍스트와 이미지에 표시되는 내용이 중요하지만 프로그램이 이미지를 관리하고 조작하는 방식도 중요합니다. 게임 엔진에서 스프라이트 시트로 사용되는 이미지 파일은 개별 이미지를 차례로 재생하여 애니메이션을 만들 수 있습니다. 그러나 동일한 엔진의 텍스처 아틀라스와 동일한 이미지 파일을 메시의 타일과 동일하게 사용하여 벽돌 벽을 만들 수 있습니다.

*/

요 답변이었다.

 

이렇게 길 줄 몰 랐 어

 

+

https://docs.unity3d.com/2021.1/Documentation/ScriptReference/U2D.SpriteAtlas.html

 

Unity - Scripting API: SpriteAtlas

A Sprite Atlas stores a list of packable assets. A packable asset is either a Sprite, Texture2D of TextureImporterType.Sprite or Folder. Before the packing process begins, these packable assets will be grouped and traversed to gather all the sprites from t

docs.unity3d.com

C# calss 내용!

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.U2D; //SpriteAtlas class 사용

public class SpriteAtlasTest_ : MonoBehaviour
{
    public SpriteAtlas _SA;

    public Image testImg;
    public Sprite bindsp;
    [SerializeField]Sprite[] sp;

    private void Start()
    {
        sp = new Sprite[_SA.spriteCount];

        testImg.sprite = _SA.GetSprite("player_fly_f01");
        _SA.GetSprites(sp);

        StartCoroutine("showsprite", sp);
    }

    IEnumerator showsprite(Sprite[] sp)
    {
        foreach (Sprite _sp in sp)
        {
            testImg.sprite = _sp;
            yield return new WaitForSeconds(1f);
        }        
    }
}

간단히 사용해본.. 근데 이따위로 코드 짜면 안됨

반응형