Skip to content

V4.3.0-Alpha

Choose a tag to compare

@redcamel redcamel released this 17 Jul 05:11
· 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

image