0

グリッド画像を表示し、連続する画像レイヤーでペイントする単純なタイル ゲームを開発しています。ので、私は持っています-

list_of_image_tiles = { GRASS: pygame.image.load('/grass.png').convert_alpha(), TREES: pygame.image.load('/trees.png').convert_alpha(), etc}

その後、私はこれらをブリットします-

DISPLAYSURF.blit(list_of_images[lists_of_stuff][TREES], (col*TILESIZE,row*TILESIZE))

DISPLAYSURF.blit(list_of_images[lists_of_stuff][GRASS], (col*TILESIZE,row*TILESIZE))

簡潔にするために、多くのコードは含めていませんが、パフォーマンスが非常に遅いことを除いて、基本的には機能します。DISPLAYSURF のものをコメントアウトするとパフォーマンスが飛躍的に向上するので、DISPLAYSURF のもの、またはおそらく pygame.image.load ビットを実行するためのより良い方法が必要だと思います (convert_alpha() が最善の方法です。 -イメージアプローチ?)

サイコと呼ばれるものが役立つかもしれないと読みましたが、それをどのように適合させるかはわかりません。パフォーマンスを改善する方法についてのアイデアは大歓迎です。

4

2 に答える 2

2

できることがいくつかあります。

  1. 「マルチレイヤー」ブリットを に 1 回だけ実行してから、surfaceそのsurfaceすべてのフレームを にブリットしDISPLAYSURFます。
  2. screen.update(rectangle_list)の代わりに更新して使用する必要がある画面の部分を特定しますscreen.flip()

編集して 1 の例を追加します。注: コードの多くを提供しなかったので、これを私のやり方に合わせました。

# build up the level surface once when you enter a level.
level = Surface((LEVEL_WIDTH * TILESIZE, LEVEL_HIGHT * TILESIZE))
for row in range(LEVEL_HIGHT):
    for col in range(LEVEL_WIDTH):
        level.blit(list_of_images[lists_of_stuff][TREES], (col * TILESIZE, row * TILESIZE))
        level.blit(list_of_images[lists_of_stuff][GRASS], (col * TILESIZE, row * TILESIZE))

次に、描画部分のメインループで

# blit only the part of the level that should be on the screen
# view is a Rect describing what tiles should be viewable
disp = DISPLAYSURF..get_rect()
level_area = Rect((view.left * TILESIZE, view.top * TILESIZE), disp.size)
DISPLAYSURF.blit(level, disp, area = level_area) 
于 2016-10-24T16:33:13.677 に答える