2013-01-18 5 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,하지만 지금까지 내 테스트도 실행에 너무 느렸다 결과를 산출 한 나쁜 framerate. 그렇게 할 수 있습니까? 그렇다면 어떻게 할 수 있습니까?

+0

OpenCV의 python 모듈이 작동하는 방법을 살펴보아야합니다. cv2 모듈입니다. 그것은 (R, G, B) 튜플의 numpy 배열을 사용한다고 생각합니다. –

+0

파이 게임 또는 파이 그릿과 같이 할 방법이 없습니까? –

+0

pygame/pyglet을 사용하지 않았습니다. 이것은 cv2가 어떻게 작동 하는지를 알아 내고 파이 게임이 비슷한 일을하는지보기위한 제안 일뿐입니다 :) –

답변

0

내가 파이 게임을 사용하지 않는, 그래서 소금 곡식 내 anwser을 결코 ... 말했다

는, 당신이 360,000 픽셀 반복하는 경우 어떤 괜찮은 프레임 속도를 얻을려고하고 있다는 것을 매우 가능성이 보인다 파이썬 루프와 각 파이썬 함수 호출을하고.

this other question (코멘트 스레드 읽기)에서 pygame.surfarray 모듈이 실제 화면 데이터를 보유하고있는 배열에 대한 참조를 제공한다는 것을 알게되었습니다. pygame.surfarray.pixels3d은 모양의 배열 (rows, cols, 3)에 대한 참조를 반환해야하며 여기서 마지막 치수는 RGB 값을 화면에 유지합니다. 그 참조하면, 당신은 같은 일을 파이썬 루프를 필요로하지 않고, 직접 화면의 픽셀을 변경할 수 있습니다 pygame.display.update에 대한 호출이 실제로 변경 사항을 보여주기 위해 필요한 경우

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]) 

확실하지,하지만이 방법은 유지됩니다 당신이 염두에 두었던 것보다 훨씬 더 높은 프레임 속도.

관련 문제