unicode

5 개의 포스트

github

일찍 멈추지 마라: 메모리 속도로 소스 코드의 대소문자를 정규화하기 (새 탭에서 열림)

GitHub는 코드 검색 엔진 Blackbird에서 대규모로 수행되는 유니코드 케이스 폴딩을 메모리 대역폭에 가까운 속도로 최적화했다. 핵심은 비ASCII 문자를 만나면 즉시 중단하는 기존 최적화를 제거하고, 전체 버퍼를 분기 없이 처리해 컴파일러의 SIMD 벡터화를 유도한 것이다. Apple M4에서 단순 구현의 약 3.1GiB/s 처리량을 45GiB/s 이상으로 끌어올렸으며, 분기 없는 코드는 벡터화를 가능하게 할 때만 이점이 있다는 점도 확인했다. ## 케이스 폴딩과 소문자 변환의 차이 - 케이스 폴딩은 표시를 위한 변환이 아니라 문자열 비교를 위한 정규화다. - 대소문자만 다른 문자열을 동일하게 취급하기 위해 사용된다. - 검색 엔진 - 정규식의 `(?i)` 옵션 - 대소문자를 구분하지 않는 사용자명과 호스트명 - 일반적인 소문자 변환과 달리 케이스 폴딩은: - 로케일에 독립적이다. - 문맥에 의존하지 않는다. - 비교 관계가 일관되고 대칭적이다. - 그리스어 final sigma, 터키어의 `I`, 독일어 `ß`처럼 소문자 변환과 케이스 폴딩 결과가 달라지는 문자가 있어 `to_lowercase`를 대체 수단으로 사용하면 잘못된 검색 결과가 발생할 수 있다. - 공개된 Rust `casefold` 크레이트는 Unicode `CaseFolding.txt`의 단일 문자 변환인 C·S 상태만 구현한다. - `ß → ss`와 같은 다중 문자 변환은 지원하지 않는다. - 터키어 전용 폴딩도 지원하지 않는다. - ripgrep과 정규식 엔진도 유사한 제한을 둔다. ## GitHub에서 케이스 폴딩이 중요한 이유 - Blackbird는 1억 8천만 개 이상의 저장소와 480TB가 넘는 소스 코드를 색인한다. - 색인 전에 모든 바이트를 폴딩하고, 검색 결과 후보를 확인할 때도 케이스 폴딩이 반복적으로 수행된다. - 소스 코드는 대부분 ASCII이므로 ASCII 경로를 메모리 속도로 처리하는 것이 가장 큰 성능 개선 요소다. - 비ASCII 입력은 드물기 때문에, 최적화의 목표는: - 흔한 ASCII 경로를 최대한 빠르게 만들고 - 드문 유니코드 경로가 ASCII 성능을 방해하지 않게 하는 것이다. ## 조기 종료를 제거한 ASCII 처리 기존 방식은 비ASCII 바이트를 만나면 즉시 반복문을 종료하고 유니코드 처리로 넘겼다. ```text if byte >= 0x80 { break } ``` 하지만 이 데이터 의존적 `break`는 컴파일러의 루프 벡터화를 막는다. 개선된 구현은 다음과 같이 동작한다. - 모든 바이트를 끝까지 순회한다. - `high_bit_acc |= byte`로 모든 바이트의 최상위 비트를 누적한다. - 반복문이 끝난 뒤 누적값을 한 번만 검사해 비ASCII 문자가 있었는지 확인한다. - 따라서 반복문 내부에는 데이터에 따른 분기나 조기 종료가 없다. 이 방식은 비ASCII 여부를 동일하게 알아내면서도 SIMD 명령을 사용할 수 있게 한다. ## 분기 없는 ASCII 대소문자 변환 ASCII 대문자 변환도 조건문 대신 산술 연산으로 처리한다. - `b.wrapping_sub(b'A') < 26` - 바이트가 `A`부터 `Z` 사이일 때만 참이 된다. - 별도의 분기 없이 대문자 여부를 0 또는 1 마스크로 만든다. - `u8::from(is_upper) << 5` - 대문자이면 ASCII의 비트 5를 설정해 소문자로 바꾼다. - 그 외 문자는 아무 변화가 없다. - 모든 바이트를 항상 저장하므로 조건부 저장 명령도 제거된다. 결과적으로 루프는 다음 특성을 갖는다. - 데이터 의존적 분기 없음 - 조기 종료 없음 - 연속적인 메모리 접근 - LLVM이 NEON 기반 16바이트 단위 SIMD 코드 생성 가능 ## 벤치마크와 성능 개선 Apple M4에서 5.7KB ASCII 버퍼를 처리한 누적 측정 결과는 다음과 같다. - 조기 종료와 분기 조건을 사용하는 순진한 구현: **3.1GiB/s** - 본문만 분기 없이 바꾸고 조기 종료를 유지한 구현: **2.6GiB/s** - 조기 종료를 제거한 구현: **7.6GiB/s** - 대문자 판별과 저장까지 분기 없이 처리한 최종 구현: **45GiB/s 이상** 성능 향상의 핵심은 단순히 분기를 없앤 것이 아니다. - 조기 종료 제거가 루프 벡터화를 가능하게 했다. - 대문자 변환의 분기 제거가 완전한 벡터화를 가능하게 했다. - 최종 성능은 사실상 메모리 대역폭 한계에 도달했다. ## 스칼라 코드에서는 분기 없는 방식이 느릴 수 있다 - 조기 종료를 유지한 채 본문만 분기 없이 바꾼 구현은 오히려 3.1GiB/s에서 2.6GiB/s로 느려졌다. - 기존 분기 방식은 실제로 값이 바뀌는 대문자일 때만 저장한다. - 소문자, 숫자, 공백이 대부분인 일반 텍스트에서는 조건부 저장 분기가 매우 잘 예측된다. - 반면 분기 없는 구현은 모든 바이트를 무조건 저장해 불필요한 쓰기 트래픽이 발생한다. - 따라서 분기 없는 코드는 그 자체로 항상 빠른 것이 아니다. - 이 사례에서는 분기 없는 코드가 SIMD 벡터화를 가능하게 하는 수단이었기 때문에 최종적으로 큰 이득을 냈다. 실용적으로는 데이터 규모가 크고 반복 횟수가 많은 바이트 처리에서 조기 종료가 정말 최적인지 확인해야 한다. 특히 루프의 조기 종료가 SIMD 벡터화를 막는다면, 전체 버퍼를 일정한 흐름으로 처리하고 마지막에 상태를 확인하는 방식이 훨씬 빠를 수 있다.

discord

디스코드 패치 노트 (새 탭에서 열림)

Discord는 2024년 12월 5일 성능, 안정성, 사용성 개선과 버그 수정을 포함한 패치 노트를 공개했다. 모바일 프로필 개편, iOS 미디어 선택기 성능 향상, Unicode 15.1 이모지 및 애니메이션 WebP 지원이 주요 변경 사항이다. 또한 앱 개발자를 위한 Webhook Events가 추가됐으며, 이번 업데이트 이후 패치 노트는 겨울 휴가로 잠시 중단되고 2025년 2월 초 재개될 예정이다. ### 모바일 프로필과 미디어 성능 개선 - 모바일 사용자 프로필과 프로필 편집 화면을 데스크톱과 유사한 디자인으로 개편했다. - 최신 디자인 시스템을 적용해 레이아웃과 시각적 일관성을 개선했다. - iOS 미디어 선택기의 이미지 로딩 시간을 대부분의 상황에서 90% 이상 단축했다. - Discord 내부 카메라로 촬영한 뒤 미디어 선택기를 열 때 발생하던 빈 화면도 많은 경우 제거했다. ### 이모지와 이미지 형식 지원 확대 - Unicode 15.1 이모지를 지원해 새로운 이모지를 사용할 수 있게 됐다. - Unicode 15.1 지원은 이전 버전과 완전히 호환되지 않으므로, 다른 사용자에게 이모지가 빈 상자나 대체 문자로 보이면 클라이언트 업데이트가 필요하다. - 데스크톱과 웹 앱에서 임베드 및 즐겨찾기에 애니메이션 WebP를 지원한다. - 애니메이션 이모지를 GIF 대신 WebP 형식으로 요청하도록 변경해 파일 크기와 앱 성능을 개선했다. - Bluesky URL에 대한 임베드도 정상적으로 지원한다. ### 앱 개발자를 위한 Webhook Events - 앱이 Gateway 연결을 직접 유지하지 않고도 이벤트를 받을 수 있는 Webhook Events를 출시했다. - 실시간 지연 시간이 중요하지 않은 앱은 복잡한 Gateway 연결 관리 없이 이벤트를 수집할 수 있다. - 관련 기능은 Discord 개발자 문서에서 확인할 수 있다. ### 프로필·서버·설정 관련 버그 수정 - 프로필 배너가 지정한 영역대로 제대로 잘리지 않던 문제를 수정했다. - 모바일 프로필 화면에서 Shop과 설정 알림 점의 위치가 일관되지 않던 문제를 해결했다. - 프로필 길이가 길 때 `Send Message`, `Add Friend` 버튼이 제대로 표시되지 않던 문제를 수정했다. - 프로필에서 사용자를 차단할 때 실수 방지를 위한 확인 절차를 추가했다. - 역할을 한 번에 30명 초과 사용자에게 추가하려 할 때 조용히 실패하던 동작을 수정하고, 작업을 최대 30명으로 제한했다. - 역할 추가·삭제 후 역할 이름이 잘못 표시되던 UI 문제를 해결했다. - 데스크톱 서버 목록 하단이 잘못된 어두운 상자로 렌더링되던 문제를 수정했다. - Nitro 선물 화면의 라이트 테마 버튼, Android 버튼 아이콘과 배경, 모바일 Nitro 설명 문구 등의 표시 문제를 개선했다. - 단축 URL이 올바르게 미리보기되지 않던 문제와 프로필의 게임 스트리밍 제목이 비어 보이던 문제를 수정했다. ### 채팅과 메시지 입력 개선 - DM 알림 사이를 이동할 때 메시지 초안이 다른 DM으로 옮겨가던 문제를 수정했다. - 멘션이 사용자 이름 대신 사용자 ID로 표시되던 문제를 해결했다. - iOS에서 멘션이 아닌 `@` 뒤의 텍스트가 무시되던 문제를 수정했다. - 전체 화면 Text in Voice에서 텍스트 자동 완성으로 이모지를 추가할 수 있도록 개선했다. - 입력창과 타이핑 표시기가 겹치거나 하단 여백이 사라지는 문제를 해결했다. - 새 DM 화면에서 첨부 파일을 열 때 UI가 비정상적으로 늘어나던 문제를 수정했다. - 스레드 생성 중 이모지 선택기를 열면 화면이 응답하지 않던 iOS 문제를 해결했다. - iOS에서 스레드를 열 때 메시지 작성자가 아닌 스레드 생성자의 프로필이 열리던 문제를 수정했다. - 메시지 전달 입력창의 테마, 읽지 않은 멘션 표시기의 배경색, 온보딩 바 정렬 문제도 수정했다. ### Activities와 앱 권한 화면 - 일부 서버의 Activities에서 사용자 이름이 잘못 표시되던 문제를 해결했다. - 앱 승인 화면에서 스크롤바가 없는 위젯인데도 스크롤해 수락하라는 안내가 표시되던 문제를 수정했다. ### 음성·영상 통화 개선 - 음성 제어 버튼의 원형 배경이 사라지던 문제를 수정했다. - 데스크톱에서 Push to Talk와 Voice Activity를 전환한 뒤 Voice Activity가 다시 활성화되지 않던 문제를 해결했다. - Android에서 다른 앱을 화면 공유할 때 마이크가 작동하지 않던 문제를 수정했다. - 통화 화면의 Activity 버튼 크기와 겹침 문제를 개선했다. - iOS 앱 특정 버전에서 화면 공유가 실패하던 문제를 수정했으며, 해당 문제의 사용자는 최신 버전으로 업데이트해야 한다. - iOS 스피커 모드 통화 중 근접 센서가 화면을 꺼버리던 동작을 방지했다. - 모바일 통화 종료 후 평가 모달이 조작되지 않던 문제를 해결했다. - 통화 상태 표시 아이콘의 모서리 둥글기도 일부 조정했다. 이번 패치는 새 기능 추가와 함께 모바일·iOS·Android별 UI 및 통화 문제를 폭넓게 다룬 업데이트다. 특히 미디어 선택기 성능 개선, WebP 지원, Unicode 업데이트가 체감 효과가 큰 변경이므로 모든 플랫폼에서 최신 Discord 클라이언트로 업데이트하는 것이 좋다.

figma

이모지의 힘 | 피그마 블로그 (새 탭에서 열림)

이 글은 이모지가 단순한 장식이 아니라 디지털 환경에서 감정, 의도, 말투, 몸짓을 보완하는 커뮤니케이션 수단이라고 설명합니다. 유니코드 이모지 소위원회는 한 번 추가된 문자를 되돌릴 수 없기 때문에, 특정 사물보다 다양한 맥락에서 활용 가능한 보편적이고 표현력 높은 이모지를 우선합니다. 이모지의 의미는 고정된 것이 아니라 사용 맥락과 문화에 따라 다층적으로 형성됩니다. ## 디지털 소통에서 이모지의 역할 - 대면 대화에서 자연스럽게 전달되는 요소를 보완합니다. - 말의 리듬과 속도 - 목소리의 크기와 억양 - 시선, 표정, 몸짓 - 감정과 대화의 의도 - 같은 이모지라도 어떤 문장에 붙이는지, 문장 앞뒤 어디에 배치하는지에 따라 의미가 달라집니다. - 사용 경험이 쌓일수록 이모지는 별도의 학습 없이도 자연스럽게 사용하는 표현 수단이 됩니다. - 온라인 활동이 늘어날수록 대면 소통과 디지털 소통 사이의 간극을 줄이는 역할이 커지고 있습니다. ## 이모지는 새로운 개념보다 오래된 인간 표현을 디지털화한다 - 이모지는 완전히 새로운 개념을 만들어내기보다, 문자와 시각 표현에 이미 존재하던 생각과 감정을 코드화합니다. - 사랑, 욕망, 유머, 종교성, 고통 같은 개념은 역사와 문학, 광고, 타투 등 다양한 맥락에서 오래전부터 사용되어 왔습니다. - 하나의 이모지가 하나의 뜻만 갖는 것은 아닙니다. - 예를 들어 ‘불타는 하트’는 종교적 의미, 속쓰림, 열정이나 욕망 등을 모두 나타낼 수 있습니다. - 따라서 이모지의 실제 의미는 사전적 정의보다 사람들이 어떤 상황에서 어떻게 사용하는지에 의해 결정됩니다. - 사람들이 자신이 이모지를 사용한다고 생각하는 방식과 실제 사용 방식 사이에는 차이가 있을 수 있습니다. ## 유니코드 표준과 이모지의 지속 가능성 - 유니코드 컨소시엄은 세계의 문자와 언어를 디지털 환경에서 호환되도록 만드는 표준화 기관입니다. - 이모지 소위원회는 새로운 이모지를 선정하고, 각 플랫폼에서 interoperable하게 표시되도록 인코딩합니다. - 유니코드에 코드 포인트가 추가되면 사실상 삭제하거나 되돌릴 수 없습니다. - 일반적인 소프트웨어처럼 출시 후 폐기하거나 수정하는 방식이 어렵습니다. - 한 번의 결정이 장기간 유지되므로 신중한 검토가 필요합니다. - 빠르게 변하는 온라인 커뮤니케이션과, 장기적 안정성을 중시하는 표준화 절차 사이의 균형이 중요합니다. - 유니코드는 새로운 유행을 즉시 만드는 체계라기보다, 이미 사회에 존재하는 표현을 안정적으로 디지털화하는 체계에 가깝습니다. ## 새로운 이모지 선정 기준 - 이모지는 이미 3,500개 이상 존재하며, 저장 공간과 시스템 복잡성 측면에서 무한히 늘리기 어렵습니다. - 과거의 구체적인 사물 중심 접근에서 벗어나 인간의 감정과 관계를 강화하는 표현을 더 중요하게 보고 있습니다. - 선정 가능성이 높은 이모지는 다음과 같은 특징을 가집니다. - 전 세계적으로 의미가 통하는 개념 - 감정, 의도, 몸짓 등 인간 표현의 기본 요소를 나타내는 개념 - 여러 상황에서 유연하게 사용할 수 있는 상징적 표현 - 기존 이모지와 결합해 새로운 의미를 만들어내는 표현 - 특정 대상에 지나치게 한정되지 않는 넓은 개념 - 반대로 특정 품종이나 매우 구체적인 사물을 추가하면 유사한 항목을 계속 요구하게 됩니다. - 예를 들어 골든 리트리버를 추가하면 푸들 등 다른 품종도 추가해야 한다는 문제가 생깁니다. - 중요하거나 인기 있는 제안이라도 기존 이모지로 이미 표현 가능하거나 지나치게 구체적이면 채택되지 않을 수 있습니다. 이모지를 사용할 때는 단순히 그림의 사전적 의미에 의존하기보다 문맥, 배치, 상대방과의 관계를 함께 고려하는 것이 좋습니다. 새로운 이모지도 구체적인 대상을 하나씩 늘리기보다는 여러 감정과 상황을 표현하고 기존 문자와 조합할 수 있는 보편적인 기호가 더 오래 유용할 가능성이 큽니다.

figma

폰트가 깨질 때 (새 탭에서 열림)

폰트 폴백(font fallback)은 현재 글꼴에 필요한 글리프가 없을 때 다른 글꼴이나 대체 표시를 사용하는 컴퓨터 타이포그래피机制이다. 네모 상자, 깨진 이모지, 플랫폼마다 다르게 보이는 특수문자, 이모지 삽입 후 줄이 내려가는 현상 등은 대부분 이 메커니즘과 관련 있다. 이는 단순한 버그라기보다, 서로 다른 글꼴·문자 집합·운영체제가 텍스트를 처리하는 과정에서 발생하는 필연적인 결과다. ## 일상에서 나타나는 폰트 폴백 - 지원되지 않는 문자는 네모 상자, 물음표, 십자가가 들어간 상자 등으로 표시될 수 있다. - 발신자와 수신자의 환경에 설치된 글꼴이나 지원하는 문자 범위가 다르면 같은 이모지가 분해되거나 전혀 다른 모양으로 보인다. - 트위터 등에서 보이는 ‘특수 폰트’는 실제 글꼴을 바꾼 것이 아니라 유니코드의 다른 문자나 기호를 조합한 경우가 많다. - 이런 문자는 화면에서는 장식적으로 보일 수 있지만, 스크린 리더가 부자연스럽게 읽거나 다른 환경에서 빈 상자로 표시될 수 있다. - 이모지를 추가했을 때 줄 높이나 기준선이 변하는 것도 해당 글리프의 크기와 글꼴 메트릭이 기존 텍스트와 다르기 때문이다. - 카오모지나 결합 문자는 플랫폼·폰트별 지원 차이로 정렬과 모양이 달라질 수 있다. ## 글리프와 글꼴의 문자 범위 - 글리프는 글꼴이 실제로 그려내는 문자 모양을 뜻한다. 문자 자체와 글리프는 구분되지만, 글에서는 이해를 돕기 위해 대략적인 의미의 ‘문자’로 설명한다. - 서유럽권 글꼴도 대문자·소문자·숫자·문장 부호·악센트·기호 등을 포함해 수백 개의 글리프가 필요하다. - 중국어·일본어 글꼴은 수천 개의 한자를 포함해야 하므로 필요한 글리프 수가 훨씬 많다. - 합자(ligature), 숫자 스타일, 대체 글자 모양 같은 OpenType 기능을 지원하려면 기본 문자 외의 글리프도 추가해야 한다. - 라틴 문자만 지원하더라도 서유럽, 중부 유럽, 그리스어, 키릴 문자, 베트남어 등으로 범위를 넓히면 글리프 수가 계속 증가한다. - 모든 문자를 하나의 글꼴에 넣는 것은 현실적으로 어렵기 때문에 글꼴 제작자는 지원 범위를 선택해야 한다. ## `.notdef`: 글꼴이 모르는 문자의 표시 - 글꼴이 요청받은 문자를 포함하지 않을 때 사용하는 마지막 대체 글리프의 이름이 `.notdef`다. - 일반적으로 사각형, 십자가가 있는 상자, 물음표가 들어간 상자 등으로 표시된다. - `.notdef`는 특정 유니코드 문자가 아니라, 해당 글꼴 내부에서 “이 문자를 표현할 수 없다”는 사실을 나타내는 글리프다. - 화면에 네모가 표시되어도 내부의 텍스트 데이터가 네모 문자로 바뀌는 것은 아니다. - 따라서 텍스트를 복사하면 원래 문자가 유지되며, 나중에 해당 문자를 지원하는 글꼴로 바꾸면 제대로 표시될 수 있다. - 표시 모양과 크기는 글꼴 디자이너가 정하므로 글꼴마다 빈 사각형, 십자가, 장식된 상자 등 다양한 형태가 나타난다. ## 금속 활자와 디지털 글꼴의 차이 - 금속 활자 시대에는 글자와 글꼴의 활자가 물리적으로 결합되어 있어, 존재하지 않는 문자를 출력하려는 문제가 상대적으로 적었다. - 디지털 환경에서는 텍스트와 글꼴이 분리되어 있다. - 사용자는 다른 사람이 오래전에 작성한 텍스트나, 작성 당시 존재하지도 않았던 글꼴이 필요한 문자를 열 수 있다. - 이 때문에 글꼴은 자신이 표현할 수 없는 문자를 만났을 때 `.notdef` 같은 대체 수단으로 응답해야 한다. - 폰트 폴백은 이러한 디지털 텍스트 환경에서 서로 다른 문자 집합과 글꼴을 연결하는 핵심 장치다. ## 실용적인 결론 특수문자나 이모지를 사용할 때는 상대방의 운영체제와 글꼴 지원 여부가 다를 수 있음을 고려해야 한다. 장식용 유니코드 문자는 접근성과 호환성이 떨어질 수 있으므로 중요한 정보에는 일반 텍스트를 함께 제공하고, 디자인 작업에서는 여러 글꼴과 환경에서 폴백 결과를 확인하는 것이 좋다.

figma

Figma 이모지 출시의 (새 탭에서 열림)

Figma는 사용자 요청이 많았던 이모지 지원을 추가하면서, 운영체제마다 다르게 표시되는 이모지 문제를 해결하고자 했다. 브라우저나 OS의 이모지 렌더링에 의존하지 않고, 개별 이모지를 64×64 컬러 PNG로 제공한 뒤 캐싱하는 방식을 선택했다. 이를 통해 플랫폼 간 일관성과 디자이너가 요구하는 시각적 품질을 모두 확보했다. ## 이모지가 제품에 필요한 이유 - 이모지는 감정, 말투, 뉘앙스를 전달하는 디지털 커뮤니케이션의 시각 언어로 자리 잡았다. - Figma에서 실제 서비스 화면을 디자인하려면 광고 문구, 메시지, 트윗 등에 사용되는 이모지도 정확히 표현할 수 있어야 했다. - 이모지 지원 부족으로 일부 팀이 Figma를 이탈할 정도로 사용자 요구가 컸다. - Mac에서는 `Control + Command + Space`, Windows에서는 터치 키보드의 이모지 아이콘으로 입력할 수 있다. ## 이모지 표준과 플랫폼별 차이 - 이모지는 1999년 일본 휴대전화 사업자가 텍스트만으로 감정을 표현하기 어렵다는 문제를 해결하기 위해 처음 만들었다. - 통신사마다 자체 이모지 세트를 사용하면서 플랫폼 간 호환 문제가 발생했다. - 2009년 Unicode Consortium이 이모지를 문자 체계에 포함하고, 각 이모지에 고유 코드 포인트를 부여했다. - 예를 들어 `U+1F355`는 피자 이모지를 의미한다. - Unicode는 코드와 기본 지침을 정의할 뿐, 구체적인 그림의 디자인은 플랫폼에 맡긴다. - 따라서 같은 이모지도 Apple, Google, Facebook, Twitter, Samsung 등에서 서로 다르게 보일 수 있으며, 감정이나 의미가 왜곡될 위험이 있다. ## Figma에서 OS 렌더링을 사용할 수 없었던 이유 - Figma는 Mac, Windows 등 여러 플랫폼에서 협업하므로 모든 사용자가 동일한 디자인을 봐야 한다. - 브라우저가 운영체제의 이모지 라이브러리를 사용하면 같은 코드가 플랫폼마다 다른 이미지로 렌더링된다. - 이는 협업 디자인 도구에서 시각적 일관성을 훼손하고, 사용자가 의도한 이모지의 의미를 바꿀 수 있다. ## Slack 방식과 한계 - Slack은 Apple 이모지를 표준으로 정하고, 모든 이모지를 하나의 대형 PNG 파일에 담아 자체 호스팅했다. - 사용자가 이모지를 선택하면 대형 이미지의 해당 영역만 표시하므로 삽입 속도가 빠르다. - 그러나 PNG 기반 방식은 확대 시 화질이 떨어지고, 저해상도 이미지가 된다. - 채팅 화면에서는 문제가 크지 않지만, 시각 품질에 민감한 디자이너가 사용하는 Figma에는 적합하지 않았다. ## Figma의 개별 PNG와 캐싱 방식 - Figma는 각 이모지를 별도의 64×64 풀컬러 PNG로 제공했다. - 처음 특정 이모지를 삽입할 때는 이미지를 불러오느라 약간의 지연이 발생한다. - 이후에는 해당 이미지를 캐시해 재사용하므로 반복 사용 시 빠르게 표시된다. - 하나의 거대한 PNG를 내려받는 대신 필요한 이모지만 관리해 메모리 효율도 높였다. - 결과적으로 Slack 방식보다 높은 해상도를 유지하면서도 플랫폼에 관계없이 동일한 이모지를 표시할 수 있었다. 사용자 요구가 제품 이탈과 직결될 수 있는 기능이라면 우선순위를 재평가해야 한다. 특히 협업·디자인 도구에서는 운영체제에 따른 렌더링 차이를 그대로 허용하기보다, 일관된 리소스 제공과 캐싱을 조합해 품질과 성능을 함께 관리하는 것이 효과적이다.