본문 바로가기
VTK/[VTK] 소스코드 분석

1. vtkTimeStamp

by 헛둘이 2025. 7. 20.

vtkTimeStamp는 vtk의 가장 근간이 되는 클래스로, 객체의 변경? 업데이트? 여부를 관리하는 클래스

vtk는 수많은 상속구조로 되어 있는데 이 vtkTimeStamp는 아무 것도 상속받지 않은 단독 클래스다.

 

Modified라는 함수 내에서 static으로 atomic<uint64> 형태의 카운팅 변수를 들고 있고, 객체가 업데이트되면 이 정수값을 증가시킨후 객체의 내부 MTime 변수에 대입한다.

이 정수값이 가장 큰 오브젝트가 가장 최근에 업데이트된 객체라는 것을 알아차릴 수 있고, 업데이트 유무도 이 정수값을 통해 확인할 수 있다.

 

ModifiedTime을 통해 내부적으로 변경 여부를 관리한다 (생성자에서 0으로 초기화)

New, Delete는 클래스 단위에서 객체의 생성(new)과 소멸(delete)를 함수형태로 관리하는 것에 지나지 않아 보임

 

TimeStamp 비교 연산자를 오버로딩해서 어느 객체가 더 최근에 업데이트되었는지를 검사한다.

 

객체를 MTimeType으로 변환할 수 있는 변환연산자 제공

 

static 형태로 해당 클래스 공용으로 쓸 수 있는 변수 GlobalTimeStamp를 0U로 초기화한 후,

Modified가 호출될 때마다 이 변수의 값을 증가시켜 멤버변수 ModifiedTime에 대입한다.

 

  // Here because of a static destruction error? You're not the first. After
  // discussion of the tradeoffs, the cost of adding a Schwarz counter on this
  // static to ensure it gets destructed is unlikely to be worth the cost over
  // just leaking it.
  //
  // Solutions and their tradeoffs:
  //
  //  - Schwarz counter: each VTK class now has a static initializer function
  //    that increments an integer. This cannot be inlined or optimized away.
  //    Adds latency to ParaView startup.
  //  - Separate library for this static. This adds another library to VTK
  //    which are already legion. It could not be folded into a kit because
  //    that would bring you back to the same problem you have today.
  //  - Leak a heap allocation for it. It's 24 bytes, leaked exactly once, and
  //    is easily suppressed in Valgrind.
  //
  // The last solution has been decided to have the smallest downside of these.
  //
  // Good luck!
  
  -translate
  // 여기 이 코드가 존재하는 이유는 정적(static) 객체의 소멸 시 발생하는 오류 때문입니다. 
// 당신이 처음 겪는 사람은 아닙니다. 여러 대안들을 논의해 본 결과,
// 이 static 객체가 제대로 소멸되도록 Schwarz 카운터를 도입하는 비용보다,
// 그냥 메모리를 누수(leak)시키는 편이 더 나은 것으로 판단되었습니다.
//
// 가능한 해결책들과 그에 따른 트레이드오프는 다음과 같습니다:
//
//  - Schwarz 카운터: VTK의 각 클래스마다 정적 초기화 함수(static initializer)가 필요해지며, 
//    이 함수는 정수 값을 증가시키는 역할을 합니다. 이는 인라인(inline) 최적화가 불가능하고,
//    ParaView의 시작 속도를 느리게 만듭니다.
//
//  - 이 static 객체만을 위한 별도의 라이브러리를 만드는 방법: 
//    그러나 VTK는 이미 너무 많은 라이브러리를 가지고 있고,
//    이 static이 하나의 kit에 포함된다면 지금과 똑같은 문제가 다시 발생하게 됩니다.
//
//  - 힙 메모리를 한 번만 할당하고 누수시키기(leak): 
//    메모리 크기는 24바이트에 불과하고, 단 한 번만 누수되며,
//    Valgrind에서 쉽게 무시(suppress)될 수 있습니다.
//
// 마지막 방법(누수)이 위 옵션 중에서 가장 부작용이 적은 것으로 결정되었습니다.
//
// 행운을 빕니다!

 

Modified Time을 관리하는 여러 방법 중 지금의 24바이트를 누수시키는 방법은 나머지 선택지 중에 가장 나은 선택이었다는 설명

 


hmTimeStamp(vtkTimeStamp)

 

hmTimeStamp.h

 

 

hmTimeStamp.cpp

 

 

 


5Q

 

1. 이 클래스의 구현 이유

 - 객체의 업데이트 여부를 관리하고 업데이트가 필요한 객체만 업데이트할 수 있도록 구현하기 위해

 

2. GlobalTimeStamp가 overflow될 가능성은?

 - 이론적으로는 가능하나 현실적으로 일어날 수 없음 (초당 10억번의 Modified가 호출되어도 292년이 걸림)

 

3. 객체의 생성/소멸을 내부 함수 New/Delete로 관리하는 이유

 - New/Delete 함수를 통해 생성/소멸 시점을 추적할 수 있음

 

4. operator >, <는 주로 어디에 쓰이는지

 - 객체간의 정렬, 비교, 우선순위 판단에 쓰임

 - 각 객체는 MTime을 가지고 있기 때문에 이 MTime을 가지고 가장 최근에 업데이트된 객체를 추릴 수 있음

 - 객체 상태 비교에 쓰임 (어느 객체가 더 최근에 수정되었는지)

 

5. 이 클래스로부터 기대할 수 있는 성능적 이점

 - 이후에 등장할 vtkObserver와 결합되어 더 강력한 성능적 이점 부여

 - Observer에서 해당 객체에 대한 업데이트를 진행하려할 때, '정말 변경되었는가'에 대한 답을 줄 수 있음

'VTK > [VTK] 소스코드 분석' 카테고리의 다른 글

2. vtk의 Observer Pattern (1. vtkObserver)  (2) 2025.07.20

댓글