2013-11-23 26 views
3

我想優化一個OpenGL應用程序,並且一個熱點是 正在處理昂貴的處理(上傳到顯卡) 相對較小的數組(8-64值),其中有時 值會改變,但大部分時間保持不變。所以大多數 有效的解決方案是隻有當 它已經改變時才上傳數組。有效檢查在C++中花車陣列中的值變化

當然 只要數據發生變化,但是這將需要大量的代碼 變化,並進行快速測試,我想知道 可能的性能提升,之前的工作太多了具有最簡單的方法是設置標誌到 就完成了。

所以我想到了一個快速檢查(如雜音哈希等) 在內存中,如果數據已經改變幀和 在此檢查後決定uploding。所以問題是,如何 我可以例如。 XOR一個值的數組,如

float vptr [] = {box.x1,box.y1,box.x1,box.y2,box.x2,box.y2,box.x2,box.y1};

一起檢測可靠的值變化?

最佳&感謝, 海納

+1

這正是爲什麼**封裝**很重要的原因:如果值已存儲在類型提供訪問器設置值的對象中,添加標誌只需要在一個位置進行更改。 –

+0

@PeteBecker一般來說是真的。但是,與此同時,圖形代碼通常對性能至關重要,因此通常不得不犧牲速度。可能是這裏的情況。 – Angew

+0

@PeteBecker感謝您回答*而不讀*。問題不在於C++或面向對象的設計。這個問題在很多其他情況下都是有效的:如何快速散列一些浮點數? –

回答

0

@明,感謝你的內在加速,我會看看這個。

float vptr[] = { box.x1,box.y1, box.x1,box.y2, box.x2,box.y2, box.x2,box.y1 }; 
unsigned hashval h = 0; 
for(int i=...) 
{ 
    h ^= (unsigned&) vptr[i]; 
} 

死簡單,爲真正的微型陣列工作。編譯器應該能夠自動矢量化,數組的大小是已知的。必須測試更大的陣列。 原點:Hash function for floats

1

如果您正在使用英特爾,你可以看看英特爾內部函數。 http://software.intel.com/en-us/articles/intel-intrinsics-guide爲您提供了一個可供您探索的互動參考。在一條指令中有一堆比較多個整數或雙精度的指令,這是一個很好的加速。

+0

...如果您的編譯器支持intel intrinsics,如果它支持您需要的intel內在函數系列,並且您始終需要啓用幷包含正確的標題大部分時間。編譯器通常會將內在函數與_builtin函數_放在同一級別,因此您需要查看編譯器的手冊來處理內在函數。 – user2485710