728x90
1. 더티 플래그 패턴 정의
- 불필요한 작업을 피하기 위해 실제로 필요할 때까지 그 일을 미루는 패턴
2. 최적화되지 않은 순회 소스
void Render( Transform InParentWorld )
{
// 모든 노드에 대해 반복된 연산
Transform world = Local.Combine( InParentWorld );
if ( Mesh ) RenderMesh( Mesh, world );
for ( int index = 0; index < NumChilren; ++index )
{
Children[ index ]->Render( world );
}
}
- 모든 노드에 대해서 Local.Combine( InParentWorld )를 호출하고 있어 비효율적인 순회 소스
3. 더티 플래그 패턴 구현
void SetTransform( Transform InLocal )
{
Local = InLocal;
Dirty = true;
}
void Render( Transform InParentWorld, bool InDirty )
{
// 더티 플래그가 true일때만 Combine 연산을 한다.
Dirty |= InDirty;
if ( Dirty )
{
// 연산값을 저장해둔다.
World = Local.Combine( InParentWorld );
Dirty = false;
}
if ( Mesh ) RenderMesh( Mesh, World );
for ( int index = 0; index < NumChilren; ++index )
{
Children[ index ]->Render( World, Dirty );
}
}
- 처음 만들어진 노드는 아직 월드 변환 계산을 하지 않았으므로, 더티 플래그 초기 값은 참이다.
- 움직이는 기능이 호출될 경우 더티 플래그 또한 같이 켜진다.
- 월드 변환 값을 계산하기 전에 먼저 노드가 더러운지 (dirty flag)를 확인하고, 계산한 월드 변환 값을 필드에 저장한다.
- 노드가 더럽지 않다면 , Combine()을 호출하는 부분을 건너뛰고 이미 계산해 놓은 World값을 사용한다.
반응형
'Design Pattern > 게임 프로그래밍 패턴' 카테고리의 다른 글
[Design Pattern] 공간 분할 패턴 (0) | 2022.08.30 |
---|---|
[Design Pattern] 객체 풀 패턴 (0) | 2022.08.23 |
[Design Pattern] 데이터 지역성 패턴 (0) | 2022.08.16 |
[Design Pattern] 서비스 중개자 패턴 (0) | 2022.08.12 |
[Design Pattern] 이벤트 큐 패턴 (0) | 2022.08.05 |