예시적으로 말하자면, 프레임 26 렌더 스레드에서, 프레임 25 GPU의 HZB Build 결과를 참조해야 하기 때문에 대기하는 것이군요. 확실히 내용 이해했습니다.
HZB 기반 Occlusion으로 변경하는 것은 이미 테스트를 진행해 봤었는데요, 말씀하신 내용과 동일하게 컬링 자체에 큰 시간이 드는 것이 아니기 때문에 효과를 전혀 얻지 못했습니다. 승환님께서 캡쳐하신 스샷에서도 동일한 결과를 볼 수 있는데요, 아마도 GPU의 HZB 결과 동기화를 기다리는 시간 자체는 동일했기 때문이라고 생각합니다.
r.NumBufferedOcclusionQueries는 비용 분할은 조금 되었지만 카메라의 회전 / 이동에 따른 깜빡임 이슈가 눈에 잘 띄는 만큼 적용이 어렵다고 판단했고,
r.DownsampledOcclusionQueries의 경우에도 현재에도 실제 오클루전 쿼리(대기를 제외한)에 큰 시간을 쓰고 있지 않기 때문에 절감 효과가 크지 않았습니다. 테스트 씬에서나 제작중인 프로젝트에서나 이는 비슷합니다.
r.AllowOcclusionQueries 0 의 사용은 어렵습니다. 진작 검토는 해봤지만 특정 각도에 따라 납득하기 어려운 프레임 하락이 나타납니다.
[Image Removed]이런 점들을 감안하면, HZB 실행 타이밍 자체가 줄어드는 과정이 필요하다고 생각하고 있습니다. 이미지는 5.6 테스트 씬의 사례인데요, RHI Thread에서 GPU에 일감을 Queue한 이후 실제 GPU의 일을 시작하는 구간 사이의 이격이 상당한 편입니다. 이런 불필요한 wait은 Shader와 Compute 스테이지 처리 간에서도 마찬가지로 보이는데요, FXSystemPreRender에서 실제로 일하는 시간은 매우 짧지만, Shader쪽 일감이 진행되기를 상당히 기다리는 형태입니다. 이 또한 HZB 일감이 시작하는 지점을 딜레이하고 있습니다.
[Image Removed]제작중인 프로젝트 관련해서 가릴 부분을 최대한 가린 후 공유드리는 분석 결과입니다.
여기에서도 1201 프레임의 RHI Thread 이후 GPU에서 일하는 순간 사이에 갭이 상당한 편입니다. RHI Thread의 실행 시점은 RDG Graph를 빌드한 이후, 즉 Execution 타이밍이 되어야 하니 Render Thread와의 갭은 이해할 수 있는 범위입니다. 그러나 RHI Thread의 실행과 GPU 사이의 갭이 크고, 그 갭이 Occlusion Culling에게 Wait 압력으로 이어진다는 점은 효율적으로 CPU / GPU를 활용하기 어렵게 만드는 요인입니다.
해당 프로파일링 결과는 dev 빌드, Screen Percentage 66%에서 촬영되었습니다 (i7-11700, 4080 super)
네이티브 4k일 때 문제가 가장 도드라지긴 하지만, screen Percentage 66% 정도에서도 이 wait은 항상 나타난다는 점이 일을 어렵게 만드는 요인들 중 하나입니다. 50%에서는 간헐적으로, 5~10프레임에 한번 정도 눈에 띄구요.
혹시 관련해서 좀 더 확인해볼 수 있는 내용이 있을까요? culling 자체의 이슈가 아닌, RDG Execution - RHI Thread - GPU 의 일처럼 보여서 제가 능동적으로 찾아볼 만한 자료가 많지 않게 느껴집니다.