我正在嘗試使用不直接呈現給屏幕的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數組或數組更快,但對於這樣的繪製線,似乎仍然有改進的空間。
什麼是一個好的和快速的方法來繪製未知數量的行到屏幕上,知道你會縮放到最後的輸出渲染到屏幕?有沒有一種好方法來擺脫索引開銷?
當然,你需要'cdef'正確,否則它會帶來**最多** 10%。 – delnan 2010-12-20 17:12:05
完美的,具有numpy和適當的cdef語句的Cython已經大大改善了事情,即使是最基本的添加。我將繼續阻塞,但到目前爲止,轉換爲numpy數組上的顯式int索引時速度快了大約80%-90%。謝謝! – swrittenb 2010-12-20 18:34:16