VTK 소스 코드 읽기--타임 스탬프-vtkTimeStamp 클래스

머리말        

        VTK 프레임워크에서 대부분의 클래스는 vtkObject에서 파생됩니다. vtkObject는 관찰자/명령(Observer/Command) 디자인 패턴을 구현하고 수정 시간을 내부적으로 유지하여 시각화 파이프라인의 실행을 제어합니다. 시각화 파이프라인은 VTK에서 중요한 개념이며 파이프라인의 연결은 SetInputConnection()/GetOutputPort() 인터페이스를 사용하여 연결되어야 합니다. VTK는 파이프라인 실행을 제어하기 위해 "지연 평가"(Lazy Evaluation) 체계를 채택하고 "요청 데이터"가 발행된 경우에만 파이프라인이 실행됩니다.

        특히 지연 할당은 각 개체의 내부 수정 시간을 기반으로 파이프라인을 실행할 시기를 결정하는 것을 의미합니다. 귀하 또는 프로그램이 "요청 데이터"를 보낼 때만 파이프라인이 실행됩니다(앞서 언급한 vtkObject에 중요한 vtkTimeStamp가 있습니다 . 유형의 멤버 변수 MTime , vtkObject에서 파생된 파이프라인의 각 개체는 자체 내부 수정 시간( Modified() )을 추적하고, "요청 데이터"를 만나면 개체가 수정 시간을 비교하고, 발견되면 수정 시간이 변경됩니다. 개체가 실행됩니다.). 즉, VTK는 파이프라인의 실행을 제어하기 위해 Command-Driven(Demand Driven) 방식을 사용하는데, 이 방식의 장점은 Data Object가 변경될 때 바로 계산할 필요가 없고, 요청이 있을 때만 처리를 시작하며 데이터와의 원활한 상호 작용을 위해 계산에 필요한 시간을 최소화합니다.

일반적으로 Update() 함수를         명시적으로 호출할 필요는 없습니다 . 왜냐하면 렌더링 엔진의 끝에서 Render() 함수를 호출하면 액터가 렌더링 요청을 받은 다음 액터가 매퍼를 요청하기 때문입니다. 매퍼는 상위 레이어에 있는 필터의 데이터를 요청하고, 필터는 최종적으로 소스에 데이터를 요청하므로 전체 파이프라인이 실행됩니다. 위의 코드 세그먼트에 나열된 것처럼 데이터를 읽은 후 일부 정보를 출력하려는 ​​경우가 아니면 정보를 가져오기 전에 Update() 함수를 명시적으로 호출해야 합니다.

vtkTimeStamp

        vtkTimeStamp 클래스는 이전 기사의 "지연 할당" 구현에서 중요한 링크이며 VTK의 타임스탬프 클래스입니다.

        vtkTimeStamp 클래스는 개체의 실행(실행) 및 수정(수정) 시간을 기록합니다.

        vtkTimeStamp 클래스는 Modified() 메서드가 실행될 때 고유한 시간을 기록합니다. 이 시간은 단조롭게 증가하는 것이 보장됩니다. vtkObject 클래스 및 해당 파생 클래스는 이 개체를 사용하여 수정 및 실행 시간을 기록합니다. vtkTimeStamp 클래스는 두 vtkTimeStamp 객체 간의 이진 <> 비교 연산자를 지원합니다 .

        vtkMTimeType 유형은 vtkType.h 파일에서 정의됩니다.

typedef vtkTypeUInt64 vtkMTimeType;
#define VTK_MTIME_TYPE_IMPL VTK_TYPE_UINT64
#define VTK_MTIME_MIN VTK_TYPE_UINT64_MIN
#define VTK_MTIME_MAX VTK_TYPE_UINT64_MAX

        자세한 코드 내용은 다음과 같습니다.

class vtkTimeStamp
{
public:
  vtkTimeStamp() { this->ModifiedTime = 0; }
  static vtkTimeStamp* New() { return new vtkTimeStamp; }
  void Delete() { delete this; }
  // 修改对象的修改时间
  void Modified(){
	#if defined(VTK_USE_64BIT_TIMESTAMPS) || VTK_SIZEOF_VOID_P == 8
	static std::atomic<uint64_t> GlobalTimeStamp(0U);
	#else
	static std::atomic<uint32_t> GlobalTimeStamp(0U);
	#endif
	this->ModifiedTime = (vtkMTimeType)++GlobalTimeStamp;
  }
  // 获取对象的修改时间
  // 当前时间只是一个单调递增的无符号长整数
  // 这个数字有可能回绕回零,整数溢出,从最大值溢出成0
  // 这应该只发生在已经运行了很长时间的进程中,同时在程序中不断地改变对象
  // 当这种情况发生时,典型的后果应该是某些过滤器会在真正不需要时进行自我更新
  vtkMTimeType GetMTime() const { return this->ModifiedTime; }

  // 比较两个vtkTimeStamp对象的时间早和晚
  bool operator>(vtkTimeStamp& ts) { return (this->ModifiedTime > ts.ModifiedTime); }
  bool operator<(vtkTimeStamp& ts) { return (this->ModifiedTime < ts.ModifiedTime); }

  // 允许vtkTimeStamp类型转换为vtkMTimeType类型时返回unsigned long
  operator vtkMTimeType() const { return this->ModifiedTime; }

private:
  vtkMTimeType ModifiedTime;
};

추천

출처blog.csdn.net/liushao1031177/article/details/124516678