Lobsters

Speeding up the Unreal editor by… not using unnecessarily secure hash methods

불필요하게 보안성이 높은 해시를 바꿔 Unreal Editor 가속하기

Unreal Editor가 셰이더 소스 코드에 쓰던 SHA-1 해시를 xxHash로 바꾸자, 해시 처리에 든 CPU 시간이 12.90초에서 1.59초로 줄었습니다. 저자는 Electric Dreams 샘플 프로젝트를 각 버전에서 다섯 번씩 실행해 비교했고, 변경 사항은 Epic의 검토를 거쳐 수락됐지만 당시 아직 병합 전이었습니다.

에디터 노트

이번 개선의 설득력은 보안 해시가 필요 없는 데이터에 SHA-1을 적용한 구체적인 병목을 찾아 바꿨다는 데 있습니다. 같은 샘플 프로젝트를 각 버전에서 다섯 번 실행했고, 해당 함수의 합산 CPU 시간이 12.90초에서 1.59초로 줄었습니다. 다만 수치는 모든 스레드의 CPU 시간을 합한 값이며 에디터 시작 시간 자체를 8배 줄였다는 뜻은 아닙니다. 시작 시간 효과는 코어 수에 따라 달라진다고 저자도 설명합니다. Epic의 검토 과정에서 FShaderHash로 감싸 향후 교체를 쉽게 한 점과 비에디터 빌드 오류를 고친 점도 변경의 범위를 보여줍니다. 글에 제시된 검증은 Electric Dreams 한 프로젝트의 실행 비교이므로 다른 프로젝트에서도 같은 폭으로 줄어드는지는 확인되지 않습니다.

AI 요약

소프트웨어 최적화에서 저자는 이미 잘 다듬어졌을 가능성이 큰 코드보다, 프로파일링에서 눈에 잘 띄지 않는 영역을 찾는 편을 택합니다. 과거 툴팁 생성과 에디터 현지화 파일 로딩을 최적화한 경험도 이런 접근에서 나왔습니다. 그래서 Unreal Editor 실행을 다시 프로파일링하면서 셰이더 컴파일 관련 함수는 주로 건너뛰었습니다. Epic의 엔지니어들이 이미 많은 최적화를 했으리라 봤기 때문입니다.

이번에는 프로파일러를 크게 확대해 살펴보다가 셰이더 처리 경로에서 SHA-1을 발견했습니다. SHA-1은 원래 암호학적으로 안전한 해시로 개발됐지만, 암호학적으로 깨진 뒤 민감한 정보에는 쓰지 말아야 하는 알고리즘입니다. 저자는 암호학적 보안이 필요 없는 셰이더 소스 해싱에 이 알고리즘을 쓰면 처리 속도 면에서 손해라고 판단했습니다.

셰이더 소스 해시를 xxHash로 교체

해시 대상은 셰이더 소스 코드이며 주석과 저작권 문구도 포함합니다. 소스 파일이 클 수 있어 해시해야 할 데이터가 많고, 민감한 정보도 아니므로 암호학적 보안성을 우선할 이유가 없다는 설명입니다. 저자는 Aras Pranckevičius가 과거 공개한 해시 알고리즘 비교를 참고했습니다. 대안으로는 Unreal 코드베이스에 이미 구현돼 있고 사용 중인 xxHash를 골랐습니다. xxHash가 가능한 해시 중 가장 빠르다고 주장하는 것은 아닙니다. 더 빠른 알고리즘이 있을 수 있지만, 이미 엔진에서 쓰고 검증된 구현을 적용하는 편이 간단하다고 설명합니다.

해시 알고리즘을 바꾸면서 결과를 저장하거나 전달하는 코드도 함께 수정해야 했습니다. 변경 후 저장되는 해시 크기는 20바이트에서 8바이트로 줄었습니다. 다만 저자가 확인하려 한 주된 효과는 메모리 절약이 아니라 CPU 시간 단축입니다.

다섯 번씩 실행해 측정

저자는 Unreal의 샘플 프로젝트 Electric Dreams를 변경 전 엔진과 변경 후 엔진에서 각각 다섯 번 열었습니다. 측정에는 Superluminal을 사용했습니다. 비교 수치는 게임 스레드만의 시간이 아니라 모든 스레드에 걸친 CPU 시간을 합산한 값입니다. 저자는 이 방식이 실제 에디터 실행 시간과 같지는 않다고 설명하며, 실제 시작 시간에 미치는 효과는 대략 측정 시간을 코어 수로 나눈 값이라고 덧붙입니다.

기본 엔진에서는 FSHA1::Update에 CPU 시간 12.90초가 들었습니다. xxHash를 적용한 버전에서는 FXxHash64Builder::Update에 1.59초가 들었습니다. 저자는 이를 약 8배 빠른 결과로 제시합니다. 이 수치는 해당 샘플 프로젝트와 실행 조건에서 해시 처리 함수에 쓴 CPU 시간을 비교한 것입니다.

엔진 변경 사항과 후속 작업

저자가 Pull Request를 제출한 뒤 며칠 안에 Epic에서 검토했고, 글을 쓸 당시 변경 사항은 수락됐지만 아직 병합되지는 않았습니다. 검토 과정에서 xxHash를 FShaderHash 구조체로 감싸는 수정이 추가됐습니다. 지금 동작은 같지만, 나중에 더 빠른 알고리즘으로 교체할 때 여러 코드 위치를 다시 바꾸지 않도록 한 설계입니다.

또한 저자가 에디터 빌드만 시험해 놓쳐 발생한 비에디터 빌드의 컴파일 오류도 고쳤습니다. 저자는 앞으로 Pull Request 전에 비에디터 빌드도 검사 목록에 넣어야겠다고 적었습니다.

원문: Lobsters / 번역·요약: Trawling