我正在使用相機流。我每幀帶來1,228,800字節,所以效率非常關鍵,每字節納秒快速增加。在大型數組中設置順序項子集的最高性能方法是什麼?
我已經想出了一些示例代碼,以儘可能簡潔地描述問題,而不會顯得過於人爲。
這個例子中的代碼有很多效率低下的問題,例如定義循環內部的變量,或者分割亮度值而不是使用複合值。這些不是我關心的問題,只是爲了讓示例更簡單。
我需要建議的是C#中最高性能的方法,用於在非常大的數組中確定某個位置的3個連續值,比如在下面的情況下,我將BGR設置爲255,同時跳過第4個字節。
編輯:爲了澄清,有關的問題是我重新索引輸出爲每個正在設置的索引。如果我已經有了前一個項目的位置,似乎應該有一些方法可以不遍歷每個值的整個數組。
// Colors are stored as 4 bytes: BGRX where X is always 0
public byte[] Input = new byte[640 * 480 * 4];
public byte[] Output = new byte[640 * 480 * 4];
public int Threshold = 180;
public void ProcessImage() {
for (int i = 0; i < Input.Length; i += 4) {
var brightness = (Input[i] + Input[i + 1] + Input[i + 2])/3; // some value under 255
if (brightness > Threshold) {
// What is the most efficient way possible to do this?
Output[i] = 255 - Input[i];
Output[i + 1] = 255 - Input[i + 1];
Output[i + 2] = 255 - Input[i + 2];
}
else {
Output[i] = Input[i];
Output[i + 1] = Input[i + 1];
Output[i + 2] = Input[i + 2];
}
}
}
搞清楚如何去除循環中的(難以預測的)分支('if(brightness> Threshold)')可能會產生最高的效率。 – spender
這不是你如何計算亮度。如果你不能讓相機吐出一個位圖,所以你可以使用像ColorMatrix這樣的內置.NET類,然後使用像Emgu CV這樣的圖像處理庫。 –
正如我在我的問題中所說的那樣,爲了使示例儘可能簡單,代碼中存在很多低效率。請回答這個問題,而不是批評我已經確定爲人爲的代碼。 –