원문 캡처 · larstofus.com
원문 캡처 · larstofus.com

언리얼 엔진의 에디터 실행을 최적화하기 위해 셰이더 소스 코드에 쓰던 SHA1 대신 xxHash를 적용한 결과, 해시 계산에 든 전체 CPU 시간이 12.90초에서 1.59초로 줄었다. 변경은 에픽게임즈가 검토해 수락했지만, 글을 쓸 당시 아직 메인 브랜치에 병합되지는 않았다.

글쓴이는 프로파일링 중 셰이더 컴파일 관련 함수를 확대해 살펴보다가 SHA1을 사용하는 FSHA1::Update를 발견했다. 해시 대상은 주석과 저작권 표시를 포함한 셰이더 소스 코드로, 민감한 정보가 아니므로 암호학적 보안이 필요한 해시를 쓸 이유가 없다고 판단했다. SHA1은 보안에 쓰기에는 이미 깨진 알고리즘이며, 속도도 빠르지 않다고 설명했다.

대안으로 선택한 xxHash는 언리얼 엔진 코드에 이미 구현돼 있었다. 글쓴이는 xxHash가 가장 빠른 해시라고 주장하는 것은 아니며, 엔진에서 이미 사용하고 검증된 구현을 활용하는 편이 더 간단했다고 밝혔다. 해시값을 저장하거나 전달하는 코드도 함께 수정해야 했고, 해시값 크기는 20바이트에서 8바이트로 줄었다.

성능 비교에는 언리얼 엔진 샘플 프로젝트 Electric Dreams를 사용했다. 변경 전후 각각 에디터에서 5회씩 열어 총 10회 측정했고, 프로파일링 도구는 Superluminal을 사용했다. 글에서 제시한 시간은 게임 스레드만이 아니라 모든 스레드의 CPU 시간을 합산한 값이다. 따라서 실제 에디터 시작 시간에 미치는 효과는 측정 시간보다 작으며, 글쓴이는 대략 측정값을 코어 수로 나눈 정도라고 설명했다.

기본 엔진에서는 FSHA1::Update에 12.90초가 들었고, xxHash를 적용한 버전에서는 FXxHash64Builder::Update에 1.59초가 들었다. 이는 해당 해시 계산의 전체 CPU 시간이 약 8분의 1로 줄었다는 뜻이지, 에디터 실행 시간이 8배 빨라졌다는 뜻은 아니다.

변경 사항은 풀 리퀘스트로 제출돼 에픽게임즈의 검토를 거쳐 수락됐다. 검토 과정에서 xxHash를 FShaderHash 구조체로 감싸 향후 다른 해시 알고리즘으로 바꾸기 쉽게 했고, 에디터가 아닌 빌드에서 발생하던 컴파일 오류도 수정했다.