3

ゲームウィンドウのピクセルごとに、ピクセルごとに1つの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にしたいのですが、これまでのところ、テストの結果は遅すぎて、悪いフレームレートでも実行できませんでした。それは可能ですか?もしそうなら、どのように?

4

1 に答える 1

0

私はpygameを使ったことがないので、一粒の塩で私の答えを取ります...

とは言うものの、Pythonループで360,000ピクセルを超えて反復し、それぞれでpython関数呼び出しを実行している場合、適切なフレームレートが得られる可能性は非常に低いようです。

この他の質問(コメントスレッドを読む)から、pygame.surfarrayモジュールが実際の画面データを保持する配列への参照を提供することを学びました。最後の次元が画面上のRGB値を保持するpygame.surfarray.pixels3d形状の配列への参照を返す必要があります。(rows, cols, 3)その参照を使用すると、次のようなPythonループを実行しなくても、画面上のピクセルを直接変更できます。

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が必要かどうかはわかりませんが、このアプローチでは、考えていたよりもはるかに高いフレームレートが維持されます。

于 2013-01-18T03:51:08.410 に答える