Contenu connexe
Similaire à 정희석, 셰이더 리소스 빌드 자동화 할 수 없나요?, NDC2013
Similaire à 정희석, 셰이더 리소스 빌드 자동화 할 수 없나요?, NDC2013 (20)
Plus de devCAT Studio, NEXON
Plus de devCAT Studio, NEXON (20)
정희석, 셰이더 리소스 빌드 자동화 할 수 없나요?, NDC2013
- 1. 셰이더 리소스 빌드 자동화 할 수 없나요?
넥슨 N스퀘어개발본부
W엔지니어링팀
정희석
2013. 04.24
- 6. 작은 코드 블럭을 더해가는 방식Micro Shader
Uber Shader
Shader Editor (Material Editor)
일반적으로 사용하는 코드 조합 방식
- 7. 모든 기능을 가진 코드에서 기능 별로 빼가는 방식
Micro Shader
Uber Shader
Shader Editor (Material Editor)
일반적으로 사용하는 코드 조합 방식
- 8. 전용 툴 사용하여 Code Gen
Micro Shader
Uber Shader
Shader Editor (Material Editor)
일반적으로 사용하는 코드 조합 방식
- 10. 더하기 조합 빼기 조합
혼합하여 사용
#include “...”
#include “...”
#if …
#endif
- 13. ShaderSetting [
.Version = 1
.BaseSetting = “CommonMesh”
LOD [
CompileOptions [
CompileOption [
.Name = “AlphaTest.Enable”
.Value = true
]
…
]
]
LOD [
…
]
]
LOD 0
LOD 1
상속
부모에도 옵션이 있다면
값을 Override
- 14. 하지만 렌더러, 머신 환경에 따른 조합은 고려 하지 않음
이렇게 조합을 통해 실제 컴파일 하여 사용하는 셰이더는
약 60개
- 17. 그래픽 카드와 같은 머신 환경 마다 다른 분기
셰이더 코드에서
#if Platform.* ~ #endif 형태
머신 환경을 반영하여
전처리 과정에서 치환
C++에서
- 22. 3 Step 비동기 로드
전처리 태스크
컴파일 태스크
CreateShader
태스크
#include처리, 옵션 값 치환
컴파일 하여 바이너리 생성
(가장 오래 걸림)
DirectX 접근
- 23. 3 Step 비동기 로드
전처리 태스크
컴파일 태스크
CreateShader
태스크
[백그라운드]
[백그라운드]
[메인]
- 24. 이제 셰이더 로딩 중에도 클라이언트 응답은 한다
그러나 여전히 진행은 느리고
반복되는 로딩에 의한 생산성 저하
- 26. 컴파일 된 바이너리를 파일로 저장
이름
바이너리 Key
조합된 소스코드의 해시 값
최초 한번만 로딩, 이후에는 저장된 바이너리 로드
- 31. 최적화 및 릴리즈를 위해
사용할 바이너리를 미리 빌드 해놓자
그런데 어떤 조합으로 빌드를 시켜야 할까?
- 34. 컴파일 실패 속출
모든 조합으로 컴파일을 해보니…
당연히 여러 기능들을 분류 하다 보니
컴파일 되지 않는 조합 존재
- 38. ShaderBuild [
.ShaderSetting = "Shader://VTMeshRenderer.shaderSetting"
BuildOptions [
BuildOption [
.Name = "VTLighting.Enable"
Build .Value = true
Build .Value = false
]
BuildOption [
.Name = "VTSkinning.Enable"
Build .Value = true
Build .Value = false
]
…
빌드 할 옵션 값 리스트
Permutation 조합
렌더러 세팅
- 40. 앞에서 컴파일 된 바이너리를 조합 수만큼 파일로 저장하고
저장된 바이너리를 다시 읽어 오는 경우
2. 소스코드가 다르더라도 바이너리가 같을 수 있음
1. 저장된 바이너리를 찾기 위해서 소스코드 조합을 마쳐야 함
- 41. 굳이 옵션 조합 결과인 소스코드로 구분할 필요가 없다
해당 소스코드를 만드는 것은 조합 옵션 리스트다
- 42. 바이너리 Key
옵션 리스트의 Hash값
이름 CompileOption.Lighting.Enable=True,
CompileOption.Skinning.Enable=False,
…
…
- 44. 번들 파일 구조 (x 셰이더 수)
Version
옵션 리스트 Hash값 : File Offset
옵션 리스트 Hash값 : File Offset
…
바이너리
바이너리
…
Offset
Offset
Offset
- 45. 각 번들 파일 별 용량: 약 700kb
빌드 결과
총 용량: 약 50mb
빌드 시간: 약 1시간 ~ 1시간 반 정도
- 46. 이제까지 셰이더는 DX Effect 포맷 사용
VS, PS를 구분해서 최적화를 할 수가 없다
컴파일이 편하다
테크닉
- 49. Techniques [
Technique [
.Name = "Default"
Passes [
Pass [
.RasterizerState = "NoCull"
.DepthStencilState = "DepthTestOnly"
.BlendState = "AlphaBlend"
.SamplerStatePS0 = "PointClamp"
.VertexShader = "DefaultVSMain"
.PixelShader = "DefaultPSMain"
.HullShader = "null"
.GeometryShader = "null"
.DomainShader = "null"
컴파일 할 메인 함수
DX9에선 사용 안 함
State는 따로 정의
- 50. 번들 파일을 다시 최적화 해보자
이제 서로 다른 셰이더 파일 조합끼리도
같은 VS, PS 바이너리를 사용할 수 있다
- 51. 번들 인덱스 파일 구조 (x 셰이더 수)
Version
옵션 Hash값 : File Offset
옵션 Hash값 : File Offset
…
함수이름 : 바이너리 File Offset
함수이름 : 바이너리 File Offset
…
Offset
Offset
Offset
번들 바이너리 파일 구조 (1개)
Version
바이너리
…
Offset
Offset
Offset
바이너리
- 53. 서버 부하와
긴 빌드 시간 때문에
데일리 빌드로 새벽에 수행
CruiseControl.NET 으로 빌드 시스템에 등록
- 58. 빌드 전략 수정
작업자
빌드 서버
1. 코드 체크인
2. 로컬로 컴파일하도록 클라이언트 Config On
팀원
3. 문제 없이 실행
4. 새벽 빌드 후 다시 클라이언트 Config off
- 61. 요약
- 관리하기 쉽게 적절한 기준으로 조합 룰을 정하자
- 리소스 로드는 응답속도 빠르도록 최적화 하면 할 수록 좋다
- 복잡한 시스템 때문에 완전한 빌드 자동화를 하기 힘들다면
문제점을 찾기 쉽고, 관리가 편리한 시스템을 구성하자