일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Three(Two) Tone Shading
- 메모리 누수
- 프로그래밍 기초
- Cell Look
- Specular
- 작업 집합
- VR
- Toon Shader
- working set
- Private Bytes
- OculusMotionVectorPass
- ASW(Application SpaceWarp)
- 게임 수학
- Cell Shader
- 가상 바이트
- 개인 바이트
- Rim Light
- Virtual Byte
- C언어
- ColorGradingLutPass
- 3d
- URP로 변경
- Cartoon Rendering
- AppSW
- Windows Build
- URP
- 벡터
- Today
- Total
WinCNT
VR기기에 대한 어플리케이션 설정이 적용되지 않는 이슈 본문
발생한 이슈
최적화 작업을 맡은 프로젝트에서, VR의 어플리케이션 설정이 적용되지 않는 이슈가 발생했다
결론부터 말하자면 원인은 어이 없을 정도로 매우 단순했다
하지만 자계(…)의 의미를 담아 글을 남기고자 한다
이슈 상세
성능 테스트를 위해 프레임을 72에서 120으로 바꾸려고 했는데, 잘 되지 않았다
원인이 보이지 않아서 다양한 가설을 세워서 검증해봤다
가설 1 : 설정 방법이 틀렸나?
이를 검증하기 위해 새로운 프로젝트를 만들어서 간단한 VR씬으로 검증해봤다
void Start()
{
#if ENABLE_VR && !UNITY_EDITOR
// VRC Refresh Rate
// OVRPlugin.systemDisplayFrequency = 72;
// OVRPlugin.systemDisplayFrequency = 90;
OVRPlugin.systemDisplayFrequency = 120;
// FFR
OVRManager.foveatedRenderingLevel = OVRManager.FoveatedRenderingLevel.Off;
// 부하에 따라 자동으로 렌더 스케일을 변경할 것인지 정하는 플래그
OVRManager.useDynamicFoveatedRendering = false;
// 시야 전체의 렌더 스케일
UnityEngine.XR.XRSettings.eyeTextureResolutionScale = 0.9f;
#endif
}
새로운 프로젝트에서는 잘 적용됐다
따라서 해당 가설은 기각
가설 2 : 프로젝트의 설정 등에서 덮어쓰고 있나?
그 다음으로 확인한 것은 프로젝트의 어딘가에서 설정이 따로 존재해서, 그로 인해 코드로 인한 설정이 덮여쓰여지고 있는지 확인해봤다
최적화 작업을 맡은 프로젝트에, 위의 간단한 VR 씬을 추가해서 확인하는 방법을 택했다
그 결과…문제 없이 잘 작동했다
따라서 이 가설도 기각
가설 3 : 설정하는 함수의 전처리 지시어가 원인?
#if ENABLE_VR && !UNITY_EDITOR의 전처리 지시어가 원인인가 일순 생각해봤다
그런데 가설2에서 잘 작동했으니 이 가설도 기각…
가설 4 : RuntimeInitializeOnLoadMethod가 원인?
해당 함수가 [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]로 실행되는 것이 원인인가 의심해봤다
새로운 프로젝트에서 같은 처리를 해봤지만…잘 작동했다
이 가설 또한 기각…
가설 5 : SingletonMonoBehaviour가 원인?
해당 클래스는 싱글톤으로 만들어져 있었다
혹시 싱글톤하고 RuntimeInitializeOnLoadMethod가 잘 작동하지 않은 것이 원인인가 검증해봤다
이것도 새로운 프로젝트에서 같은 처리를 해봤지만…잘 작동했다
이 가설 또한 기각…
원인 : #if UNITY_EDITOR
원인은 전처리 지시어 #if UNITY_EDITOR였다…
그래서 빌드에서는 제외되어서 VR 기기에 대한 설정이 적용되지 않았던 것…
매우매우매우 단순한 원인이지만, 문제는 이걸 왜 오랫동안 눈치 못 챘냐에 있다
해당 코드는 다음과 같은 형태였다
#if UNITY_EDITOR
[UnityEditor.InitializeOnLoadMethod]
private static void InitializeUnityEditor()
{
// Unity Editor에 필요한 처리
// ...
// ...
// ...
// ...
}
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
private static void Initialize()
{
// 여기서 VR기기 설정을 함
ApplicationSettings();
// 씬 로드 처리
// ...
// ...
// ...
// ...
}
#endif
즉, #if UNITY_EDITOR와 #endif 위치가 상당히 떨어져있고, 눈치채기 힘들게 되어 있었다
또한 빌드에서는 해당 클래스가 가장 먼저 실행되기 때문에, 기기에서는 문제 없이 움직인 것도 원인이다
왜 이러한 코드가 되었는지는 당사자에게 물을 수 없어 알 수 없지만, 아마 실수로 들어갔거나 일시적인 테스트로 추가한 코드가 그대로 남은 게 아닐까 한다
해결법
VR 설정 함수를 다른 곳에서 호출하거나, #endif의 위치를 바꾸면 해결된다
마무리
이번 건으로 #if UNITY_EDITOR 등의 전처리 지시어는 함수 내부에 넣는 것이 좋지 않을까 생각하게 되었다
실제로 다른 사람들은 코딩 컨벤션을 어떻게 설정하고 있을지 궁금해졌다
참고 자료
유니티 공식 문서를 참고하긴 했지만 직접적인 원인은 아니었으므로 생략한다
'Unity > Unity 개발 중 발생한 이슈 정리' 카테고리의 다른 글
파티클 시스템의 이펙트가 Dynamic Batching되지 않는 이슈 (0) | 2023.09.08 |
---|---|
URP에서 유니티짱 툰쉐이더2.0(UTS2)의 Outline이 제대로 나오지 않는 이슈 + SRP Batcher가 제대로 작동하지 않는 이슈 (0) | 2023.08.28 |
커스텀 셰이더에 Meta Pass를 추가했더니 SRP Batcher가 제대로 작동하지 않게 된 이슈 (0) | 2023.07.21 |
VR기기(Oculus Quest 2)에서 GPU Utilization(GPU U)가 FinalBlit에서 급격히 오르는 이슈 (0) | 2023.07.04 |
Bakery(라이트 맵 생성 에셋)로 작성한 라이트 맵의 텍스처 설정이 이상해서 라이트 맵이 제대로 적용되지 않던 이슈 (0) | 2023.06.30 |