我在圖形庫(用於JavaScript/canvas,使用ImageData)中有一個簡單的框模糊函數。我可以爲這個功能做更多的優化嗎?
我已經做了一些優化,以避免成堆的冗餘代碼,如通過代碼複製[0..3]
而不是複製代碼,並使每個周圍的像素用一個單一的未複製的代碼行實現,結束。
這些都是優化,以減少冗餘的代碼行。我可以做的更進一步的優化,或者更好的是,我可以改變的任何事情都可以改善功能本身的性能?
運行上的200x150圖像區域這一功能,與酷睿2,需要在Firefox 3.6約450ms,在Firefox 4 45ms和鉻約55毫秒10.
各種筆記
expressive.data.get
返回一個ImageData
對象expressive.data.put
一個ImageData
的內容回寫到畫布- 一個
ImageData
是一個對象與:unsigned long width
unsigned long height
Array data
,格式r, g, b, a, r, g, b, a ...
代碼
expressive.boxBlur = function(canvas, x, y, w, h) {
// averaging r, g, b, a for now
var data = expressive.data.get(canvas, x, y, w, h);
for (var i = 0; i < w; i++)
for (var j = 0; j < h; j++)
for (var k = 0; k < 4; k++) {
var total = 0, values = 0, temp = 0;
if (!(i == 0 && j == 0)) {
temp = data.data[4 * w * (j - 1) + 4 * (i - 1) + k];
if (temp !== undefined) values++, total += temp;
}
if (!(i == w - 1 && j == 0)) {
temp = data.data[4 * w * (j - 1) + 4 * (i + 1) + k];
if (temp !== undefined) values++, total += temp;
}
if (!(i == 0 && j == h - 1)) {
temp = data.data[4 * w * (j + 1) + 4 * (i - 1) + k];
if (temp !== undefined) values++, total += temp;
}
if (!(i == w - 1 && j == h - 1)) {
temp = data.data[4 * w * (j + 1) + 4 * (i + 1) + k];
if (temp !== undefined) values++, total += temp;
}
if (!(j == 0)) {
temp = data.data[4 * w * (j - 1) + 4 * (i + 0) + k];
if (temp !== undefined) values++, total += temp;
}
if (!(j == h - 1)) {
temp = data.data[4 * w * (j + 1) + 4 * (i + 0) + k];
if (temp !== undefined) values++, total += temp;
}
if (!(i == 0)) {
temp = data.data[4 * w * (j + 0) + 4 * (i - 1) + k];
if (temp !== undefined) values++, total += temp;
}
if (!(i == w - 1)) {
temp = data.data[4 * w * (j + 0) + 4 * (i + 1) + k];
if (temp !== undefined) values++, total += temp;
}
values++, total += data.data[4 * w * j + 4 * i + k];
total /= values;
data.data[4 * w * j + 4 * i + k] = total;
}
expressive.data.put(canvas, data, x, y);
};
我認爲你在定義臨時臨時使用它之前每個如果然後如果(臨時!== undefined)是不必要的 – Miquel 2011-03-15 15:45:48
我檢查'臨時'是不是'未定義,因爲有一些情況下,我的邊緣/角落檢查方法沒有完全覆蓋,有時溫度未定義。我會重新測試,看看是否刪除檢查輸出一個不同的圖像。 – 2011-03-15 15:47:44
啊,我明白了。那是我重寫函數時可能修復的一箇舊bug。沒有未定義的檢查輸出圖像是相同的。謝謝;我現在將其刪除。 – 2011-03-15 15:50:25