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값을 사용한다.

 

반응형

+ Recent posts