Repository navigation
V4.3.0-Alpha
·
1705 commits
to master
since this release
RedGPU V4.3.0-Alpha-rnd 릴리즈 노트
이번 V4.3.0-Alpha-rnd 릴리즈의 주요 변경사항은 다음과 같습니다.
- WebGPU 리소스 해제(
destroy) 및 메모리 누수(Memory Leak) 방지를 위한 구조 개선 - 페이지 라이프사이클 연동 및 중복 파괴 방지 안정성 강화
- 전역 캐시의
RedGPUContext인스턴스별 격리 (다중 Canvas 지원) - 다중 뷰 환경 프러스텀 컬링 렌더링 버그 수정
🚀 주요 변경 사항 (Key Changes)
1. 메모리 누수 방지 및 리소스 명시적 정리 (destroy 메커니즘 도입)
페이지 생명주기에 따른 메모리 누수 및 GPU 자원 잔존 문제를 예방하고자, 가능한 모든 핵심 클래스 및 래퍼에 destroy 메서드와 캐시 정리 로직을 전면 구현했습니다. 특히 최상위 RedGPUContext에서 한 번의 호출로 하위의 모든 리소스가 일괄 해제(destroy)되도록 수명 주기 구조를 고도화했습니다.
| 대상 / 모듈 | 주요 변경 및 개선 내용 |
|---|---|
| 컨텍스트 및 렌더러 | - 자원 정리 메서드 도입: • RedGPUContext에 destroy 메서드 도입 및 GPU 디바이스 파괴/리소스 정리 로직 연동- 렌더러 수명 관리: • Renderer의 destroy 메서드 리팩터링 및 HD_render 루프 종료 조건 명시 |
| 씬 및 오브젝트 | - 소멸 로직 리팩터링: • Scene, Mesh, View3D, ABaseMaterial 소멸 로직 리팩터링 및 Object3DContainer 재귀 소멸 메서드 추가- 물리 GPU 자원 해제: • InstancingMesh, InstancingMeshObject3D, ParticleEmitter, SkyBox, AutoExposure, DrawDebuggerGrid 등에 destroy 메서드 구현 및 수정 |
| SkyAtmosphere | - 대기 물리 자원 해제: • SkyAtmosphere, SkyLight, AerialPerspectiveGenerator, MultiScatteringGenerator 등 SkyAtmosphere 관련 핵심 클래스에 destroy 메서드 추가 및 리소스 정리 로직 구현 |
| 조명 및 클러스터 | - 조명 자원 소멸 로직: • LightManager, ShadowManager, DirectionalShadowManager, ClusterLightManager, PassClustersLight 등에 destroy 메서드 구현 및 리소스 정리 |
| 포스트 이펙트 | - 이펙트 매니저 정리: • PostEffectManager, AMultiPassPostEffect, ASinglePassPostEffect 등에 destroy 메서드 추가 및 관련 해제 로직 구현 |
| 뷰 및 렌더 텍스처 | - 텍스처 매니저 소멸: • ViewRenderTextureManager에 소멸 로직을 추가하여 G-Buffer 및 Depth 텍스처 물리 자원 강제 해제 |
| 리소스 관리 | - 매니저 및 셰이더 정리: • ResourceManager, AController, WGSLParser, ShaderVariantGenerator, PickingManager 등에 destroy 메서드 및 정리 로직 구현 |
| 텍스처 / IBL | - 텍스처 캐시 소멸: • CubeTexture, BitmapTexture에서 ImageBitmap 리소스 정리 및 물리 GPU 텍스처 해제 로직 구현- IBL 자원 정리: • BRDFGenerator, IrradianceGenerator, PrefilterGenerator 등의 IBL 생성기에서 물리 리소스 정리 로직 연동 |
| GLTF | - 캐시 정리 및 리소스 반환: • GLTFLoader(destroyGLTFCache), GLTFCacheManager, PackedTextureManager에 캐시 정리 로직 도입- 메모리 누수 방지: • ATextField와 GLTFLoader에서 Object URL 해제 및 DOM 정리 로직 적용- 레거시 제거: • 레거시 전역 함수( destroyFileGLTFCache, destroyFileGLBCache, destroyGLTFBuffersCache) 완전 제거 |
2. 페이지 라이프사이클 연동 및 중복 파괴 방지 (안정성 강화)
웹 어플리케이션의 비정상 종료나 페이지 전환 환경에서도 GPU 자원이 잔존하지 않도록 브라우저 페이지 수명 주기와 소멸 안정성을 대폭 개선했습니다.
| 대상 / 모듈 | 주요 변경 및 개선 내용 |
|---|---|
| 중복 파괴 방지 | - 중복 소멸 에러 방지: • 컨텍스트 및 리소스 소멸 시 중복 호출로 인한 오동작 및 런타임 에러를 예방하기 위해 destroyed 플래그 도입 |
| 라이프사이클 연동 | - bfcache 대응 (pageshow) 안정화:• 기존의 뒤로/앞으로가기 복원 감지 시( event.persisted) 새로고침 로직을 구조 개선에 맞추어 이벤트 리스너 및 렌더링 루프를 명시적으로 파괴/중단(destroy() 및 abort())한 뒤 새로고침(window.location.reload())이 일어나도록 프로세스 안정화- 이탈 및 언로드 ( pagehide, beforeunload):• 이탈 시 destroy() 자동 트리거(디바이스/버퍼/캐시 해제) 및 캔버스 DOM 제거(remove()) & null 처리로 메모리 누수 원천 차단 |
| 이벤트 및 루프 관리 | - 이벤트 핸들러 일괄 해제: • 터치, 키보드, 캔버스 등 전역 및 로컬 이벤트 핸들러 참조 해제 및 requestAnimationFrame 해제 순서 안정화 |
3. 전역 캐시의 RedGPUContext 인스턴스별 격리
기존에 전역 싱글톤으로 공유되던 캐시 및 파서 자원들을 ResourceManager를 통해 RedGPUContext 인스턴스 단위로 분리하여, 다중 컨텍스트 환경에서 캐시 간 간섭이 발생하지 않도록 격리 구조를 도입했습니다. 이 변경으로 단일 페이지 내 다중 Canvas(multiCanvas)를 독립적으로 운용할 수 있게 되었습니다.
| 대상 / 모듈 | 주요 변경 및 개선 내용 |
|---|---|
| DrawBufferManager | - 싱글톤 해체 및 인스턴스 통합: • 전역 싱글톤으로 운용되던 DrawBufferManager를 제거하고 RedGPUContext 인스턴스 내부로 귀속시켜 컨텍스트별 완전 독립된 버퍼 수명 주기를 보장 |
| WGSL 파서 및 셰이더 | - WGSLParser 도입 및 파싱 단일화:• WGSL 셰이더 정보 파싱/구조체 초기화 로직을 ResourceManager로 단일화• 기존 parseWGSL 호출 코드 및 MESH_SHADER_INFO 전역 변수 완전 제거 |
| 캐시 관리자 이관 | - 전역 캐시 ➡️ 인스턴스 캐시 이관: • GLTFCacheManager 추가 및 기존 전역 GLTF 캐시 관리 로직을 ResourceManager로 이관• PackedTextureManager 추가 및 PackedTexture 캐시 관리를 ResourceManager로 이관 (destroyPackedTextureCache 인스턴스별 동작)• 샘플러 캐시 관리 로직을 ResourceManager로 통합 |
4. 설정 최적화 및 기본 메모리 사용량 최적화
지속적인 렌더링 성능 최적화와 가시성 계산 알고리즘 개선을 반영했습니다.
| 대상 / 모듈 | 주요 변경 및 개선 내용 |
|---|---|
| DrawBufferManager 버퍼 최적화 | - 메모리 버퍼 크기 최적화: • 초기 버퍼 크기 제한: 128MB ➡️ **256KB**로 대폭 축소하여 초기 메모리 점유율 최소화 |
| 조명 및 클러스터 | - 조명 연산 오버헤드 절감: • 클러스터 조명용 GPU 버퍼 크기를 약 37.87 MB ➡️ 약 12.62 MB로 축소하여 메모리 점유율 최소화 (약 25.25 MB 절감) - 설정 상수 최적화 조정: • X/Y축 타일 수: 32 ➡️ 16 • Z축 타일 수: 48 ➡️ 64 (공간 정밀도 확보를 위해 Z축 조정) |
| 컬링 및 버퍼 필드 정리 | - 미사용 필드 정리: 버퍼 상태 관리 클래스들에서 불필요하게 유지되던 정적 필드 dirtyList 제거- 레거시 API 정리: 더 이상 사용되지 않는 ensureVertexIndexBuiltin 함수를 Deprecated 처리 |
5. 버그 수정 (Bug Fixes)
비정상적인 렌더링 누락이나 예기치 못한 에러를 해결하여 서비스 안정성을 높였습니다.
| 대상 / 모듈 | 주요 변경 및 개선 내용 |
|---|---|
| 프러스텀 컬링 | - 현상: 다중 뷰 환경에서 이전 뷰의 컬링 결과(passFrustumCulling = false)가 다른 뷰에 그대로 유지되어 오브젝트가 화면에서 강제로 사라지는 렌더링 오류- 원인: GlobalSSBO 도입 이후 뷰 패스 전환 시 passFrustumCulling 상태가 초기화되지 않는 사이드 이펙트로 발생- 수정: viewList가 2개 이상인 경우, 각 뷰 패스 시작 시 passFrustumCulling을 true로 강제 초기화하도록 수정 |
6. 예제 추가
| 대상 / 모듈 | 주요 변경 및 개선 내용 |
|---|---|
| multiCanvas | 단일 페이지 내 다중 Canvas 렌더링 및 컨텍스트 독립성을 검증하기 위한 multiCanvas 데모 예제 신규 추가 |
live demo - https://redcamel.github.io/RedGPU/examples/3d/multiCanvas/index.html
