2010-12-20 67 views
0

我正在嘗試使用不直接呈現給屏幕的pygame繪製快速線條。我已經獲得了一個Python列表,其大小與所需分辨率的像素數量一樣大,並存儲與線算法命中像素的次數相對應的整數值。使用此功能,可以建立2D熱圖,而不是繪製平面像素值,而是根據線條穿過的像素值增加像素值,「熱」像素獲得更亮的顏色。在pygame中繪製快速線條

這樣做的原因是我們事先並不知道這些線條中有多少會被繪製,以及任何給定像素將被擊中的最大次數。由於我們想縮放輸出以便每個渲染具有正確的最大和最小RGB值,因此我們不能只畫到屏幕上。

有沒有更好的方式來繪製這些線比比較天真的Bresenham算法?這裏的功能的drawLine的關鍵部分:

# before the loop, to save repeated multiplications 
    xm = [] 
    for i in range(resolution[0]): 
    xm.append(i * resolution[0]) 

    # inside of drawLine, index into the f list, of size resolution[0] * resolution[1] 
    for x in range(x0, x1 + 1): 
    if steep: 
     idx = y + xm[x] 
     f[idx] += 1 
    else: 
     idx = x + xm[y] 
     f[idx] += 1 

最終的結果被縮放並拉到基於的F內的最高值的畫面。例如,如果最大值爲1000,則可以假設每個像素的RGB值爲(f [i] * 255)/ 1000.

配置文件信息表示運行時由索引查找支配進入f。我在這裏使用了前面的問題來證明這些基本列表比Python中的numpy數組或數組更快,但對於這樣的繪製線,似乎仍然有改進的空間。

什麼是一個好的和快速的方法來繪製未知數量的行到屏幕上,知道你會縮放到最後的輸出渲染到屏幕?有沒有一種好方法來擺脫索引開銷?

回答

1

嘗試Cython或類似的東西。 (如果你這樣做,我會想知道是否/如何多,幫助)

用Cython是一種編程語言,以 簡化編寫C和C++的擴展 模塊CPython的Python的 運行。嚴格地說,Cython 語法是Python語法的超集 另外支持:直接 從Cython代碼中調用C函數或C++ 函數/方法。 強類型的Cython變量, 類和類屬性爲C 類型。 Cython編譯爲C或C++ 代碼而非Python, 結果用作Python擴展 模塊或作爲嵌入CPython運行時的獨立應用程序 。 (http://en.wikipedia.org/wiki/Cython)

+0

當然,你需要'cdef'正確,否則它會帶來**最多** 10%。 – delnan 2010-12-20 17:12:05

+1

完美的,具有numpy和適當的cdef語句的Cython已經大大改善了事情,即使是最基本的添加。我將繼續阻塞,但到目前爲止,轉換爲numpy數組上的顯式int索引時速度快了大約80%-90%。謝謝! – swrittenb 2010-12-20 18:34:16