1. ATF 텍스쳐

이전 장에서 배운 모든 것들을 통해 실제 프로젝트에서 Starling을 시작할 수 있습니다. 그러나 이렇게 하는 동안 수수께끼 같은 몇 가지 문제가 발생할 수 있습니다. 예를 들어,

  • 텍스처가 사용 가능한 모든 메모리를 빠르게 소모합니다.
  • 때때로 컨텍스트 손실이 발생합니다. 무슨 이런 일이!? [4]
  • 실제로 응용 프로그램의 성능에 조금 실망합니다. 더 빠른 속도를 원해요!
  • 또는 자신의 버텍스 및 프래그먼트 셰이더를 쓰고 싶지만 시작점을 알지 못하는 매조키스트 중 하나일 수 있습니다.

재미있게도, 이 장의 내용을 완벽하게 요약한 내용들입니다. 꽉 잡아요, 도로시! 우리는 이제 몇 가지 고급 주제로 뛰어 들어갈거에요!

1. ATF 텍스쳐

기존 플래시에서는 대부분의 개발자가 이미지에 PNG 형식을 사용하고 투명성이 필요하지 않은 경우 JPG 형식을 사용합니다. 그것들은 Starling에서도 매우 인기가 있습니다. 그러나 Stage3D는 압축 텍스처를 저장할 수있는 Adobe Texture Format과 같은 몇 가지 고유한 장점을 가진 대안을 제공합니다.

  • 압축된 텍스처는 기존의 일부 텍스처만 필요합니다.
  • 압축 풀기는 GPU에서 직접 수행됩니다.
  • 그래픽 메모리에 업로드하는 것이 더 빠릅니다.
  • 업로드는 비동기적으로 수행할 수 있습니다: 게임 플레이를 중단하지 않고 새로운 텍스처를 로드할 수 있습니다.[5]

1.1. 그래픽 메모리

우리가 계속하기 전에 어쨌든 텍스쳐가 얼마나 많은 메모리를 필요로 하는지 아는 것은 흥미로울 것입니다.

PNG 이미지는 모든 픽셀에 대해 4개의 채널을 저장합니다. 빨강 초록 파랑 및 알파 각 8 비트 (채널당 256 개의 값을 가짐). 512 x 512 픽셀 텍스처가 차지하는 공간을 계산하는 것은 쉽습니다:

1
2
512 × 512 RGBA 텍스처의 메모리 풋 프린트(footprint):
512 × 512 pixels × 4 bytes = 1,048,576 bytes ≈ 1 MB

JPG 이미지도 계산은 비슷합니다; 알파 채널만 제외하면 됩니다.

1
2
512 × 512 RGB 텍스처의 메모리 풋 프린트(footprint):
512 × 512 pixels × 3 bytes = 786,432 bytes ≈ 768 kB

작은 텍스처에 비하면 상당히 많은 양입니다. 그렇죠? PNG와 JPG의 기본 제공 파일 압축은 도움이 되지 않습니다. Stage3D에서 이미지를 처리하려면 이미지의 압축을 풀어야 합니다. 즉 파일 크기는 중요하지 않습니다. 메모리 소비는 항상 위 공식을 사용하여 계산됩니다.

그럼에도 불구하고 텍스처가 그래픽 메모리에 쉽게 들어 맞으면 바로 사용할 수 있습니다. 이러한 형식은 작업하기 매우 쉽습니다. 특히 응용 프로그램이 데스크탑 하드웨어를 대상으로 하는 경우에는 여러 가지 상황에서 문제가 되지 않습니다.

그러나 메모리 소비가 장치에서 사용 가능한 것보다 높은 개발 단계가 있을 수 있습니다. ATF 형식을 살펴볼 적절한 시간이 되었네요.

1.2. 압축 텍스처

위에서 우리는 전통적인 텍스처의 파일 크기가 얼마나 많은 그래픽 메모리와 관련이 있는지를 배웠습니다. 엄청나게 압축된 JPG라도 순수한 BMP 형식의 동일한 이미지 만큼의 공간을 차지합니다.

하지만 이것은 압축된 텍스처에서는 그렇지 않습니다. 그것은 GPU에서 직접 처리 할 수 있게 됩니다. 즉, 압축 설정에 따라 같은 공간에 최대 10배의 텍스처를 로드할 수 있습니다. 아주 인상적이네요. 그렇죠?

불행한 것은 각 GPU 공급 업체가 각각 다른 회사들보다 잘 할 수 있다고 생각했기 때문에 압축된 텍스쳐를 위한 몇 가지 다른 포맷을 만들었습니다. 즉 게임이 실행되는 환경에 따라 다른 종류의 텍스처가 필요합니다. 그럼 파일이 어디에서 사용될지 미리 어떻게 알 수 있을까요?

구출을 위해 ATF가 왔습니다. 이는 Adobe가 Stage3D에서 특별히 만든 형식입니다. 사실 이것은 텍스처의 최대 네 가지 버전을 포함할 수 있는 컨테이너 파일입니다.

  • PVRTC (PowerVR 텍스처 압축) 는 PowerVR GPU에서 사용됩니다. 모든 세대의 iPhone, iPod Touch 및 iPad에서 지원됩니다.
  • DXT1/5 (S3 텍스처 압축) 는 원래 S3 Graphics에서 개발했습니다. Nvidia와 AMD GPU에서 모두 지원되므로 대부분의 데스크탑 컴퓨터와 일부 안드로이드 폰에서 사용할 수 있습니다.
  • ETC (Ericsson 텍스처 압축) 는 대부분의 Android, 특히, 많은 휴대 전화에서 사용됩니다.
  • ETC2 는 고품질 RGB 및 RGBA 압축을 제공합니다. OpenGL ES 3을 지원하는 모든 Android 및 iOS 기기에서 지원됩니다.

저는 ATF가 컨테이너 형식이라는 것을 위에서 알려드렸습니다. 이는 위 형식의 모든 조합을 포함할 수 있음을 의미합니다.

ATF container
그림 37. ATF 파일은 실제로 다른 형식의 컨테이너입니다.

모든 형식 (기본값)을 포함 시키면 응용 프로그램이 iOS, Android 또는 데스크탑에서 실행 중인지 관계없이 모든 Stage3D 지원 장치에 텍스처를 로드할 수 있습니다. 아무것도 신경 쓸 필요가 없습니다!

그러나 게임이 iOS 기기에만 포된다는 것을 알고 있다면 PVRTC를 제외한 모든 형식을 생략할 수 있습니다. 또는 고급 휴대 기기 (OpenGL ES 3 이상) 만 타겟팅하는 경우 ETC2 만 포함하십시오. Android와 iOS에서 모두 작동합니다. 그렇게하면 게임의 다운로드 크기를 최적화 할 수 있습니다.

DXT1과 DXT5의 차이는 후자가 알파 채널을 지원한다는 것입니다. ATF 도구가 자동으로 올바른 형식을 선택합니다.

ETC1은 실제로 알파 채널을 지원하지 않지만 Stage3D는 내부적으로 두 개의 텍스처를 사용하여 이 문제를 해결합니다. 다시 말하지만 이것은 완전히 씬(Scenes) 뒤에서 발생합니다.

1.3. ATF 텍스처 만들기

Adobe는 ATF로 변환하거나 ATF에서 변환하고 생성된 파일을 미리 볼 수 있는 일련의 명령행 도구를 제공합니다. 것들은 AIR SDK의 일부입니다 (atftools 폴더 찾기).

아마도 가장 중요한 도구는 png2atf일 것입니다. 다음은 기본적인 사용 예입니다. 사용 가능한 모든 형식의 표준 설정으로 텍스처를 압축합니다.

1
png2atf -c -i texture.png -o texture.atf

지금 당장 사용을 시도했다면 다음과 같은 오류 메시지가 표시될 것입니다:

1
Dimensions not a power of 2!

이것이 아직 언급하지 않은 한계입니다. ATF 텍스처는 항상 2의 배수인 사이드 길이를 가져야 합니다. 약간 짜증나지만 실제로는 거의 문제가 되지 않습니다. 거의 항상 아트라스 텍스처로 사용하기 때문입니다.

대부분의 아틀라스 생성기는 2의 2승 텍스처를 생성하도록 구성할 수 있습니다.

호출이 성공하면 ATFViewer에서 출력을 검토할 수 있습니다:

ATFViewer
그림 38. ATFViewer 도구.

왼쪽의 목록에서 보려는 내부 형식을 선택할 수 있습니다. 또한 기본적으로 모든 밉맵 변형이 만들어 졌음을 알 수 있습니다.

Memory Management, 메모리 관리‘ 장에서 밉맵을 논의할 것입니다.

압축으로 인해 화질이 약간 떨어지는 것을 알 수 있습니다. 이는 모든 압축 형식이 손실이 크기 때문입니다. 메모리 크기가 작아질수록 품질이 떨어집니다. 이미지의 종류에 따라 품질이 얼마나 달라지는가 유기적인 사진 같은 질감은 잘 작동하지만 딱딱한 가장자리가 있는 만화 같은 이미지는 상당히 심하게 손상 될 수 있습니다.

물론이 도구는 다양한 옵션을 제공합니다. 물론 여러분은 iOS에만 적용가능한 PVRTC 형식만 패키지로 만들 수 있습니다:

1
png2atf -c p -i texture.png -o texture.atf

또는 메모리를 절약하기 위해 밉맵을 생략하도록 할 수 있습니다:

1
png2atf -c -n 0,0 -i texture.png -o texture.atf

또 다른 유용한 유틸리티는 atfinfo입니다. 포함된 텍스처 형식 밉맵 수 등과 같이 특정 ATF 파일에 저장된 데이터에 대한 세부 정보를 표시합니다:

1
2
3
4
5
6
7
8
9
10
11
12
> atfinfo -i texture.atf

File Name          : texture.atf
ATF Version        : 2
ATF File Type      : RAW Compressed With Alpha (DXT5+ETC1/ETC1+PVRTV4bpp)
Size               : 256x256
Cube Map           : no
Empty Mipmaps      : no
Actual Mipmaps     : 1
Embedded Levels    : X........ (256x256)
AS3 Texture Class  : Texture (flash.display3D.Texture)
AS3 Texture Format : Context3DTextureFormat.COMPRESSED_ALPHA

1.4. ATF 텍스처 사용

Starling에서 압축된 텍스처를 사용하는 것은 다른 텍스처와 마찬가지로 간단합니다. 파일 내용이 있는 바이트 배열을 팩토리 메서드 Texture.fromAtfData()에 전달합니다.

1
2
3
var atfData:ByteArray = getATFBytes(); // (1)
var texture:Texture = Texture.fromATFData(atfData); // (2)
var image:Image = new Image(texture); // (3)

(1) 원시 데이터를 파일에서 가져옵니다.
(2) ATF 텍스처를 만듭니다.
(3) 다른 텍스쳐와 같이 사용하십시오.

그게 다입니다! 이 텍스처는 Starling의 다른 텍스처와 마찬가지로 사용할 수 있습니다. 또한 아틀라스 텍스처에 가장 적합한 후보입니다.

그러나 위 코드는 텍스처를 동기적으로 업로드합니다. 즉 AS3 실행은 완료될 때까지 일시 중지됩니다. 대신 비동기적으로 텍스처를 로드하려면 메서드에 콜백을 전달합니다.

1
2
3
4
5
Texture.fromATFData(atfData, 1, true,
    function(texture:Texture):void
    {
        var image:Image = new Image(texture);
    });

매개 변수 2와 3은 배율 인수와 밉맵을 각각 사용해야 하는지 여부를 제어합니다. 네 번째는 콜백을 전달하면 비동기 적재가 시작됩니다. Starling은 그동안 아무렇지도 않게 렌더링을 계속할 수 있습니다. 콜백이 실행 되자마자 (더 빨리!) 텍스쳐를 사용할 수 있습니다.

물론 AS3 소스에 ATF 파일을 직접 포함시킬 수도 있습니다.

1
2
3
4
[Embed(source="texture.atf", mimeType="application/octet-stream")]
public static const CompressedData:Class;

var texture:Texture = Texture.fromEmbeddedAsset(CompressedData);

그러나, 이 경우 비동기 업로드를 사용할 수 없습니다.

1.5. 기타 리소스

다음 소스에서 이 주제에 대한 자세한 내용을 볼 수 있습니다:

Was this article helpful?

Related Articles