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

效能最佳化#

本主題說明擷取策略 (Grab Strategies) 的含義及其重要性。

工業相機通常會以持續且可能非常高的速率(例如每秒 60–200 張或更多畫面)產生影像。在許多應用中,如 Python、OpenCV、AI 推論等處理管線無法跟上這個速率。

這會造成根本上的供需不匹配:

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

如果沒有擷取策略,將會產生以下其中一種情況:

  • Buffer 無限制增長:不可行
  • Buffer 隨機溢位:非預期情況

擷取策略定義了 系統在負載下的運作行為。

Mental Model#

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

如果應用程式的速度比相機慢,佇列就會塞滿,因此需要決定如何處理這種情況。這就是擷取策略的用途。

Grab Strategies#

提供兩種擷取策略。

LatestImageOnly#

只保留最新的畫面。當應用程式忙碌時,較舊的畫面會被捨棄。以下視覺化圖表說明了此情況:

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。例如:

  • 檢測系統
  • 圖像記錄
  • 測量任務

Buffer Configuration#

緩衝區充當相機與應用程式之間的暫時儲存庫。您可以根據需要調整所使用的緩衝區數量。

camera.MaxNumBuffer.Value = 20

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

  • 可以容忍暫時的速度變慢。

缺點是:

  • Memory 使用量增加。
  • 延遲增加,也就是佇列增長。

重點整理#

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

策略 延遲 影格遺失 確定性
LatestImageOnly Low 是 Low
OneByOne 高(如果速度較慢) 否 High