주요 내용으로 건너뛰기

비트맵 글꼴 압축

TouchGFX는 버전 4.25부터 글꼴 압축 기능을 지원합니다.

비트맵 글꼴 압축 기능을 이용하면 4BPP의 비트맵 글꼴을 압축할 수 있습니다. 목표는 렌더링 성능을 유지하면서 글꼴 데이터의 크기를 줄이는 것입니다.

Designer에서 글꼴 압축을 활성화하는 방법은 매우 간단합니다. Designer에서 타이포그래피에 대한 "Bpp"로 "4 - compressed"를 선택하기만 하면 됩니다.

압축된 4BPP 선택하기

이를 통해 이점을 얻을 수 있는 애플리케이션의 유형은 두 가지입니다. 바로 한자와 같이, 수천 개의 문자가 있는 애플리케이션 또는 매우 큰 문자가 있는 애플리케이션입니다. 이러한 애플리케이션에는 매우 유용합니다. 반면에 크기가 20인 영문자만을 사용하는 애플리케이션은 글꼴 데이터가 애초에 크지 않으므로 용량면에서 큰 이점을 얻을 수 없습니다.

압축률은 문자 크기, 글꼴 크기에 따라 달라집니다. 작은 글꼴은 큰 글꼴보다 압축률이 적습니다. 원본의 30%~70% 정도의 압축을 기대할 수 있습니다.

문자는 그리기 전에 캐시 버퍼로 압축이 해제됩니다. 문자가 캐시에 있지 않다면 렌더링 전에 압축 해제 비용을 지급해야 합니다. 사용되는 압축 알고리즘(실행 길이 유형)은 압축을 해제하기 쉬우므로 일반적으로 문제가 되지 않습니다. 문자가 이미 캐시에 있다면 렌더링 성능이 평소보다 약간 향상됩니다. SRAM에서 렌더링하는 것이 외부 플래시에서 렌더링하는 것보다 더 빠르기 때문입니다. 캐시 크기는 Designer에서 구성할 수 있습니다. 아래를 참조하세요.

한 글자가 텍스트에서 반복되거나 애니메이션 또는 스크롤 효과를 위해 텍스트를 다시 그려야 해서 같은 글자를 여러 번 그리게 되는 경우, 캐시를 활용하면 압축 해제에 드는 비용을 절감할 수 있는 경우가 많습니다.

Note
캐시 크기는 그리고 있는 텍스트 중에서 가장 큰 문자를 저장할 만큼 커야 합니다.

캐시가 충분히 크지 않다면 애플리케이션이 멈추게 됩니다.

여기에서 지침을 참조하세요.

플랫폼이 하드웨어 가속 그리기를 제공할 경우 이는 압축된 글꼴에도 사용됩니다.

압축된 글꼴의 대안으로는 벡터 글꼴이 있습니다. 벡터 글꼴은 하나 이상의 크기가 사용될 경우 일반적으로 압축된 글꼴보다 작지만 성능에 더 큰 부담을 줍니다.

여기에서 벡터 글꼴에 관해 읽어보세요.

성능

이 섹션에서는 수많은 한자를 사용하는 애플리케이션과 많은 숫자가 포함된 애플리케이션을 살펴보겠습니다.

첫 예제로 NotoSansCJKsc-Black.otf를 사용해 크기가 28인 글꼴을 만들어 보겠습니다. 0x4E00 ~ 0x5E00의 다양한 문자를 포함시킬 것입니다(이 외에 추가로 몇 개 더 텍스트에 사용됨). 이는 4165개의 문자를 제공합니다. 물론 실제 한자 애플리케이션에는 더 많은 문자가 포함될 수 있습니다.

애플리케이션은 24개의 문자로 된 텍스트를 표시합니다:

크기가 28인 한자

두 번째 애플리케이션은 크기 40과 크기 140의 Verdana를 사용합니다:

크기 40 및 140의 Verdana 텍스트

글꼴 데이터 크기와 문자 그리기 성능을 확인해 보겠습니다.

글꼴 데이터 크기

아래 테이블은 글꼴 데이터 크기(바이트 기준)를 보여줍니다:

글꼴크기문자압축되지 않은 크기압축된 크기절감압축비
NotoSansCJKsc-Black.otf284,1161,568,599917,170651,4291.7
Verdana.ttf409527,36912,78914,5802.1
Verdana.ttf1401140,4088,21132,1974.9

한자 압축이 0.5MB 이상의 데이터를 절감해 준다는 것을 알 수 있습니다. 이는 외부 플래시 크기를 줄이기에 충분하며 따라서 BOM 비용도 낮아질 수 있습니다.

Verdana 글꼴의 압축은 압축비가 더 높으면서도 유사한 양의 바이트를 절감하지 못했습니다. 주된 이유는 문자의 수가 훨씬 적기 때문입니다.
두 Verdana 글꼴의 데이터 합계가 22Kb에 미치지 못합니다. 이는 글꼴 데이터가 매우 작은 디바이스의 내부 플래시에도 들어갈 수 있다는 뜻입니다.

벡터 글꼴로 Noto 글꼴을 생성할 경우 글꼴 데이터 크기는 1,509,236바이트입니다. 이는 압축되지 않은 글꼴 크기보다 약간 작지만 압축된 비트맵 글꼴보다는 큽니다. 벡터 글꼴이 제공하는 큰 크기의 이점은 여러 크기의 벡터 글꼴을 사용할 때 발휘됩니다. 모든 크기의 글꼴에 대한 데이터가 공유되기 때문입니다.

렌더링

이제 압축된 문자의 렌더링 성능을 확인해 보겠습니다. 캐시 크기가 중요하다는 것을 알게 될 것입니다. 애플리케이션이 동일한 문자를 반복적으로 그리고 캐시의 크기가 이를 저장하기에 충분하다면 성능은 압축되지 않은 글꼴에 가깝고 어떤 경우에는 그보다 나을 것입니다.

캐시 크기가 10,000바이트인 중국어 애플리케이션으로 시작하겠습니다. 이는 사용된 모든 문자를 담기에 충분한 용량입니다.

배경 이미지를 포함한 전체 화면을 다시 그리는 렌더링 시간을 측정합니다.

테스트캐시 크기렌더링 시간 /ms
배경 이미지-5.28ms
압축되지 않은 Noto-7.57ms
압축된 Noto100007.55ms
압축된 Noto50009.41ms
압축된 Noto20009.42ms

표시된 모든 문자를 저장하기 위한 캐시 요구 사항은 약 8000바이트입니다. 캐시가 이것보다 크고 문자가 첫 프레임에서 압축 해제되었을 경우 이후의 모든 프레임에서 다시 압축 해제하지 않고 렌더링을 수행할 수 있습니다. 캐시가 작을 경우(5,000 또는 2,000바이트) 캐시가 모든 문자를 저장하기에 충분하지 않으므로 반복적으로 압축 해제해야 합니다. 성능은 낮아지지만 여전히 사용할 수는 있습니다.

이제 두 번째 애플리케이션을 살펴보겠습니다. 이번에는 모든 프레임에서 큰 숫자만을 다시 그립니다. 숫자는 각각 약 4,000바이트이므로 10,000바이트의 캐시는 두 개의 숫자를 저장하기에 충분합니다. 예를 들어 5,000바이트의 캐시는 한 문자만을 저장할 수 있고 반복적으로 압축 해제해야 합니다.

테스트캐시 크기렌더링 시간 /ms
배경 이미지-1.44ms
압축되지 않은 Verdana-2.46ms
압축된 Verdana100002.45ms
압축된 Verdana50003.57ms

캐시가 충분히 크면 성능에 변화가 없지만 그렇지 않다면 불이익을 받게 된다는 것을 알 수 있습니다.

마지막 예제로 수많은 'A' 문자만을 표시하는 보다 인위적인 애플리케이션을 사용해 보겠습니다:

크기 40인 Verdana 텍스트

테스트캐시 크기렌더링 시간 /ms
배경 이미지-5.19ms
압축되지 않은 Verdana-16.51ms
압축된 Verdana1000016.45ms
압축된 Verdana100016.46ms

성능은 모든 구성에서 동일합니다. 한 가지 문자 'A'만 그리므로 매우 작은 캐시만으로도 충분합니다.

캐시는 프레임에 그려지는 고유한 문자를 저장할 수 있을 만큼 충분히 커야 합니다. 이 경우에는 'A'밖에 없습니다.

결론

요약하자면, 프레임에 그려지는 문자가 캐시에 저장될 경우 압축된 글꼴은 압축되지 않은 글꼴과 동일한 성능을 보입니다. 이는 캐시가 충분히 클 경우 압축된 글꼴이 애니메이션과 텍스트 스크롤에 사용될 수 있다는 뜻입니다.

캐시가 충분히 크지 않다면 문자를 압축 해제하는 것으로 인해 얻는 성능적 이점이 크지 않습니다. 이는 압축된 글꼴은 작은 캐시로도 큰 성능 문제 없이 정적 텍스트에 사용될 수 있다는 뜻입니다.

구성

서론에서 언급했듯이, 글꼴 압축은 Designer의 개별 타이포그래피에서 선택하여 활성화됩니다. 필요한 압축 해제 코드는 애플리케이션에 의해 자동으로 포함됩니다.

캐시 크기

캐시 크기는 Designer에서 구성할 수 있습니다. Config 탭에서 "Text Configuration"을 선택하세요.

123

캐시 크기 구성.

가장 큰 압축된 문자에 필요한 것보다 캐시가 작을 경우 TouchGFX Designer는 로그에 오류를 보고합니다:

캐시가 충분히 크지 않을 경우 오류 출력

보고된 수보다 크게 글꼴 캐시를 변경합니다.

글꼴 파일은 해당 글꼴로 모든 문자를 그리는 데 필요한 최소 캐시 크기를 보여줍니다. 이 정보는 TouchGFX/generated/fonts/src/Table_xxx.cpp 파일에서 찾을 수 있습니다:

크기가 140인 Verdana의 압축 크기 및 최소 캐시 크기

위에서 크기가 140인 Verdana 글꼴로 모든 문자를 그리려면 최소 4025바이트의 캐시가 필요하다는 것을 알 수 있습니다.

캐싱 실패

캐시의 크기가 그려지는 문자를 담기에 충분하지 않을 경우 애플리케이션이 멈춥니다. 애플리케이션은 CompressedFontCache::unableToCache(const GlyphNode* glyphNode, int byteSize) 함수를 호출하나 반환되지 않습니다.

이는 생성된 파일을 수동으로 수정하는 경우에만 발생합니다.

제한 사항

동일한 글꼴을 압축된 4Bpp와 압축되지 않은 4Bpp로 사용하는 것은 불가능합니다.