跳至內容
測試伺服器
開發伺服器

效能最佳化#

本主題將說明何謂「抓取策略」,以及它們為何重要。

工業相機通常以恆定且可能非常高的幀率(例如 60–200 fps 或更高)輸出影像。在許多應用中,諸如 Python、OpenCV、AI 推論等處理流程,往往無法跟上這般幀率。

這造成了一種根本性的不匹配:

Camera (Producer) → fast
Application (Consumer) → slower

若沒有抓取策略,將會出現以下其中一種情況:

  • 緩衝區會無限增長:這是不可能的
  • 緩衝區隨機溢出:非預期行為

抓取策略定義了系統在負載下的運作方式。

心智模型#

Camera → Frame Stream → Buffer Queue → RetrieveResult() → Application

如果應用程式的處理速度慢於攝影機,佇列就會填滿,此時必須決定如何處理這種情況。這正是「抓取策略」的用途所在。

Grab 策略#

共有兩種抓取策略可供選擇。

僅顯示最新圖片#

系統僅保留最新的一幀。當應用程式處於繁忙狀態時,較舊的幀將會被捨棄。此視覺化圖示說明了這一點:

Camera:    F1 → F2 → F3 → F4
App reads:        →    F4
Dropped:   F1, F2, F3

優點:

  • 您所看到的總是最新狀態。
  • 最低延遲

缺點:

  • 幀丟失

典型應用案例:

僅在需要最新資訊、可接受畫面掉幀,且必須將延遲降至最低時,才使用LatestImageOnly。範例:

  • 即時顯示(GUI)
  • 操作員監控
  • 即時視覺化
OneByOne#

每個畫面都會被排入佇列並依序處理。不會刻意捨棄任何畫面。以下視覺化圖示說明了這一點:

Camera:    F1 → F2 → F3 → F4
App reads: F1 → F2 → F3 → F4

優點:

  • 無畫面遺失(非常適合分析/錄製)
  • 確定性處理順序

缺點:

  • 若處理速度較慢,延遲會較高
  • 持續過載可能導致緩衝區溢出風險

典型應用案例:

當每個幀都至關重要、結果必須可重現,且處理速度大致等同於擷取速度時,請使用OneByOne。範例:

  • 檢測系統
  • 影像錄製
  • 測量任務

緩衝區設定#

緩衝區在攝影機與應用程式之間扮演臨時儲存區的角色。您可以根據需要調整使用的緩衝區數量。

camera.MaxNumBuffer.Value = 20

增加緩衝區的數量具有以下優點:

  • 暫時性的速度減緩是可以接受的。

其缺點如下:

  • 記憶體使用量增加。
  • 延遲增加,也就是說,佇列變長了。

重點摘要#

並沒有所謂的「最佳」策略。選擇取決於您是需要隨時取得最新映像,還是需要所有映像。下表可作為選擇合適策略的參考依據。

策略 延遲 幀遺失 決定論
僅顯示最新圖片 Low 是 Low
OneByOne 高(即使速度較慢) 否 高