2025. 3. 25. 14:54ㆍWIP/Igniter
기본적으로 현재 엔진에서 핸들 기반 리소스 관리는 '단일 소유권' 만을 인정하고, 소유권을 가진 객체가 철저하게 핸들을 발행하는 주체인 시스템에 핸들을 반환/해제할 책임을 지는 것을 기반으로 하고 있다.
단순하게 말하자면, 이미 해제된 핸들을 통해 실제 리소스의 메모리 공간에 접근할려고 하는 시도는 피할 수 있지만. 기본적으로 해제된 핸들에 대한 실제 메모리 주소를 얻고자 하는 시도 뿐 아니라 해제된 핸들에 대한 중복 반환, 소유권을 가지는 객체의 핸들 미반환(메모리 릭/핸들 릭) 문제는 여전히 남아 있다.
소유권을 가지는 객체의 핸들 미반환의 경우, Debug 빌드에 한해서 핸들을 할당할 때의 callstack을 저장 및 핸들 스토리지가 소멸하는 시점의 런타임 체크 및 어설션에 의해서 반환되지 않은 핸들에 대한 대략적인 정보를 얻을 수 있으며. 실제로 이를 통해 프로젝트 진행 중 발생한 핸들 미반환 문제에 효과적으로 대처할 수 있었다.
다만, 기본적으로 핸들들은 소유권을 가진 객체 이외에도 여러 장소에 자유롭게 복사되어 사용될 수 있다. 그렇기에 핸들을 실제 소유권자가 아님에도 해제할려고 하거나 하는 시도가 발생 할 수도 있다. 이는 해당 핸들에 대해 소유권을 제대로 확정하지 않았다는 의미이고, 명백한 실수이다. (1)
반대로, 이미 해제된 핸들에 대한 Lookup(실제 메모리 주소의 취득)은 실수가 아닌 정당한 사용방식 중 하나이다. 왜냐하면 Lookup은 유효하지 않은 핸들에 대해 nullptr를 반환하기에, 유효하지 않은 핸들에 대한 접근을 하고자한 주체가 해당 상황을 적절히 처리 할 수 있다. 다만, 이 경우에도 여전히 핸들에 대한 디버그 정보를 얻고 싶은 경우가 있을 순 있다. (2)
두가지 상황을 종합하여, 핸들이 해제된 시점에도 callstack을 기록하여 어디서 핸들이 해제되었었는지 확인을 할 수 있도록 하여, 핸들의 소유권 설정 및 수명에 대한 가정이 올바른지 빠르게 확인 할 수 있으면 좋을 것 같다는 생각을 하게 되었다.
핸들의 중복 반환은 assertion 및 즉시 callstack 출력을, 해제된 핸들에 대한 Lookup은 내부적으로 처리하진 않지만 필요한 경우 핸들에 대한 callstack 정보를 쿼리 할 수 있는 함수를 외부에 노출시켜 두는 것이 적절하다고 생각하였다.
하지만 callstack을 기록하고 저장하는데 오버헤드가 발생하기 때문에, 이들에 대한 정보 취득은 Debug 빌드(또는 디버그 정보를 포함한 릴리즈 빌드)에서만 가능하도록 하자.
'WIP > Igniter' 카테고리의 다른 글
Audio Listener와 Spatial Audio Source (0) | 2025.03.27 |
---|---|
FMOD 통합 및 기본적인 Audio API 설계 (0) | 2025.03.27 |
Material 데이터 처리에 대한 노트 (0) | 2025.03.23 |
태스크 기반 병렬화를 위한 기반 다지기 (0) | 2025.03.10 |
커스텀 가능한 Screen Coverage Based LOD (0) | 2025.02.18 |