PyGameのサーフェイス辺りの話。
投稿日: May 20, 2019 10:12:15 AM
画面関連、Javaなどでゲームとかを作ろうとするとピクセルグラバーの話が出てくる、メモリ上で用意したイメージを画面に反映させるとかの話。それは便利だからというのもあるけど何にしても速いから。(正確に言うと速かったから。現在はOpenJDKで当時のJREのような速度はまだ期待できない)
同じようにPyGameでサーフェイスから配列を取り出して操作してやれば早く描画出来るんじゃないかとか思ってしまうのでやってみる。
#!/usr/bin/python3
import pygame, random
from pygame.locals import *
pygame.init()
_size = (100,100)
pygame.display.set_caption("pixel test")
s = pygame.display.set_mode(_size)
p = pygame.Surface(_size )
def pix2d():
pixarray = pygame.PixelArray(p)
for i in range(100):
for j in range(100):
pixarray[i,j] = random.randint(0,255*255*255)
del pixarray
while True:
pix2d()
s.blit( p, (0,0) )
pygame.display.update()
とても小さな画面が出てきて砂嵐が表示される。
しかしかなり遅い。
問題がどこにあるのかというとファンクションpix2dの中で毎回サーフェイスから配列を作り、操作しては削除するというような手順になっている。ここまで直接的にサーフェイスと配列が繋がってる必要は無いだろうと思う。
サーフェイスが期待する配列を用意して、その配列をサーフェイスにblitしてやればことは済むはず。
ということで軽く調べていたのだけどこれといった解決法は見当たらない。
たしかにJavaのピクセルグラバーですらあんまり情報は多くなかった。似たような話だと思う。
あまり深く考えないほうがいいのかもしれない。
Python流
わたし個人的にPythonをものすごく体現しているなぁという言葉がある「それクラスにする必要ある?」ってやつなんだけども。ガチガチに固まった頭に軽くショックを与えるのに十分な威力をもった言葉だと思う。
Pythonではクラスを使わなくてもモジュールという単位で世界は分離されているので違う状態を持った同じものが複数(未知数)存在するとかいう状態でないかぎりクラスをつかうメリットはあまりない。モジュールを使えばいい。
とまあ、それは余談だけどPyGameでもPython流は存在するのだろうと思う。
PyGameの公式のドキュメントの和訳がとても参考になるのでアドレスを貼っておく。
まさにサーフェイス周りの話。軽くガツンと衝撃を受けるようなことがちらほらと見受けられる。
http://www.unixuser.org/~euske/doc/pygame/newbieguide-j.html