핵심 요약! 이거만 보면돼

  • updatePrivateDsg 메서드는 백엔드의 프라이빗 DSG를 최신 상태로 유지하기 위해 사용됩니다.
  • 현재 타임스탬프와 force_update 플래그를 확인하여 업데이트가 필요한지 판단합니다.
  • 업데이트가 필요하면 뮤텍스를 사용하여 스레드 안전성을 보장하고, 공유된 DSG의 변경 사항을 프라이빗 DSG에 병합합니다
    • mesh를 제외하고, object, agent, place 등의 모든 계층을 병합
  • 이미 최신 상태라면 업데이트를 생략하여 불필요한 작업을 줄입니다.
  • 업데이트 결과를 반환하여 이후의 처리 단계에서 활용합니다.

updatePrivateDsg 함수 및 관련 코드에 대한 상세 설명

개요

  • 이 코드는 백엔드 모듈(BackendModule)에서 프라이빗 DSG(private Dynamic Scene Graph)를 업데이트하는 과정을 다루고 있습니다.
  • 프론트엔드에서 전달된 최신 그래프 정보를 백엔드의 내부 그래프에 안전하게 병합

결론

  • 업데이트 최적화: force_update와 타임스탬프 비교를 통해 불필요한 업데이트를 최소화

전체적인 흐름 및 역할

  1. 업데이트 요청: 백엔드 모듈은 새로운 입력에 따라 프라이빗 DSG를 업데이트하려고 합니다.

  2. 업데이트 여부 판단:

    • updatePrivateDsg 함수를 호출하여 업데이트가 필요한지 판단합니다.
    • 업데이트가 필요하지 않으면, 현재 입력을 스킵하고 spinOnce 함수가 종료됩니다.
  3. 동기화 및 안전한 업데이트:

    • 프라이빗 DSG공유된 DSG에 대한 뮤텍스 잠금을 설정하여 동시성 문제를 방지합니다.
    • 두 그래프를 안전하게 병합합니다.
  4. 불필요한 업데이트 방지:

    • force_update 플래그타임스탬프 비교를 통해 이미 최신 상태인 경우 업데이트를 생략합니다.
    • 이를 통해 성능을 최적화하고 리소스 낭비를 방지합니다.

코드 흐름 및 상세 분석

1. if (!updatePrivateDsg(input.timestamp_ns, force_update)) 조건문

if (!updatePrivateDsg(input.timestamp_ns, force_update)) {
  VLOG(2) << "Backend skipping input @ " << input.timestamp_ns << " [ns]";
  // 조건이 만족되지 않으면 로그를 기록하고 함수 종료
  logStatus();
  return;
}
  • 목적: updatePrivateDsg 함수를 호출하여 프라이빗 DSG를 업데이트합니다.
  • 조건 검사: 업데이트가 성공적으로 이루어지지 않으면, 현재 입력을 스킵하고 상태를 로그로 기록합니다.

2. updatePrivateDsg 함수의 정의

bool BackendModule::updatePrivateDsg(size_t timestamp_ns, bool force_update) {
  std::unique_lock<std::mutex> graph_lock(private_dsg_->mutex);
  {  // 공동 임계 영역 시작
    ScopedTimer timer("backend/read_graph", timestamp_ns);

    const auto& shared_dsg = *state_->backend_graph;
    std::unique_lock<std::mutex> shared_graph_lock(shared_dsg.mutex);
    if (!force_update && shared_dsg.last_update_time != timestamp_ns) {
      return false;
    }

    unmerged_graph_->mergeGraph(*shared_dsg.graph);
  }  // 공동 임계 영역 종료

  if (logs_) {
    backend_graph_logger_.logGraph(private_dsg_->graph);
  }

  return true;
}

2.1 함수의 목적

  • 프라이빗 DSG를 최신 상태로 업데이트합니다.
  • 공유된 DSG(shared_dsg)의 변경 사항을 프라이빗 DSG에 병합합니다.

2.2 상세 동작

  1. 업데이트 필요 여부 확인

    if (!force_update && shared_dsg.last_update_time != timestamp_ns) {
      return false;
    }
    • force_updatefalse이고, 공유된 DSG의 마지막 업데이트 시간이 현재 타임스탬프와 다르면 업데이트를 수행하지 않습니다.
    • 목적: 불필요한 업데이트를 방지하고, 이미 최신 상태인 경우 작업을 생략합니다.
  2. 그래프 병합

    unmerged_graph_->mergeGraph(*shared_dsg.graph);


profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN