2013-01-18 41 views
3

對於遊戲窗口中的每個像素,是否有可能(在性能方面)擁有一個單個多維數組,每個像素包含一個8位整數?我需要根據這個數組及時更新遊戲窗口。使用數組來存儲窗口的像素

我的目標類似如下:

import numpy 
window_array = numpy.zeros((600, 600), dtype=numpy.int8) 

#draw the screen 
for (y, x), value in numpy.ndenumerate(window_array): 
    if value == 1: 
     rgb = (0, 0, 0) 
    elif value == 2: 
     rgb = (50, 50, 50) 
    blit_pixel(x, y, rgb) 

我想是想30-60 FPS,但到目前爲止,我的測試中取得了那名在連跑得太慢結果壞幀率。有可能做到,如果有的話,如何做?

+0

你應該看看OpenCV的python模塊是如何工作的--cv2模塊。它認爲它使用(R,G,B)元組的numpy數組 –

+0

有沒有辦法用pygame或pyglet之類的東西來做到這一點? –

+0

我沒有使用pygame/pyglet。這只是一個建議,你應該探索cv2如何工作,看看pygame是否做了類似的事情:) –

回答

0

我從來沒有使用pygame的,所以把我的anwser用一粒鹽...

這就是說,它似乎不太可能,你會得到什麼像樣的幀速率,如果你迭代的36萬個像素用python循環,並在每一個python函數調用。

我從this other question(閱讀評論主題)瞭解到,pygame.surfarray模塊會給你一個參考持有實際屏幕數據的數組。 pygame.surfarray.pixels3d應返回對形狀爲(rows, cols, 3)的數組的引用,其中最後一個維度在屏幕上保存RGB值。與參考,你可以直接改變屏幕上的像素,而無需蟒蛇循環做這樣的事情:

import numpy 
surf_array = pygame.surfarray.pixels3d(surface) 
window_array = numpy.zeros(surf_array.shape[:2], dtype=numpy.int8) 
... 
surf_array[numpy.nonzero(window_array == 1)] = np.array([0, 0, 0]) 
surf_array[numpy.nonzero(window_array == 2)] = np.array([50, 50, 50]) 

不知道,如果是需要pygame.display.update調用實際顯示你的變化,但這種做法將維持比你想象的要高得多,更高的幀速率。