2011-06-18 22 views
9

私はPygameに単純なトップダウンRPGを書いていますが、それはかなり遅いことがわかりました....私はPythonやPygameがC/C++やイベントのようなコンパイル言語で作られたゲームのFPSと一致するとは思っていませんByte Javaのようにコンパイルされたものの、Pygameの現在のFPSは15と同じです。PNGや24ビットマップの代わりに16ビットのビットマップをレンダリングしようとしましたが、速度を少し上げてしまいましたが、必死でモノクロのモノクロビットマップそれはFPSを35にしました。しかしそれ以上はありません。今私が読んだほとんどのゲーム開発の本によれば、ユーザーがゲームグラフィックに完全に満足するためには、第2dゲームのFPSは少なくとも40でなければならないので、パイゲームのスピードを上げる方法はありますか?PythonとPygameをスピードアップする方法はありますか?

+9

まだプロファイリングしていませんか? –

+0

まだプロファイルされていますか?申し訳ありませんが、私は理解していません。あなたが言っていることを説明してください。 – ApprenticeHacker

+4

問題は、(すべてのプロジェクトのように)あなたのコードにある可能性が高いです。プロファイリングはどこを見つけるかです。検索ボックスに「python profiling」と入力してください。[またはここに行く](http://stackoverflow.com/questions/582336/how-can-you-profile-a-python-script)。 –

答えて

13

使用サイコは、:

import psyco 
psyco.full() 

また、doublebufferingを有効にします。たとえば:あなたがそれを必要としない場合

from pygame.locals import * 
flags = FULLSCREEN | DOUBLEBUF 
screen = pygame.display.set_mode(resolution, flags, bpp) 

また、アルファをオフにできます。

screen.set_alpha(None) 

代わりのたびに画面全体を反転し、変更された領域を追跡し、のみを更新します。たとえば、次のようなもの(メインループ):

events = pygame.events.get() 
for event in events: 
    # deal with events 
pygame.event.pump() 
my_sprites.do_stuff_every_loop() 
rects = my_sprites.draw() 
activerects = rects + oldrects 
activerects = filter(bool, activerects) 
pygame.display.update(activerects) 
oldrects = rects[:] 
for rect in rects: 
    screen.blit(bgimg, rect, rect) 

ほとんどの(すべての)描画関数がrectを返します。

あなたはまた、より迅速なイベント処理のためにのみいくつかの許可されたイベントを設定することができます。

また
pygame.event.set_allowed([QUIT, KEYDOWN, KEYUP]) 

、私は手動でのバッファの作成を気にしないだろうと私は経験してきたように、HWACCELフラグを使用していないだろういくつかの設定でそれに問題があります。

これを使用して、私は小さな2dプラットフォームのために合理的に良いFPSと滑らかさを達成しました。

+1

ありがとう、DOUBLEBUFフラグは私に40FPSの目標に必要な最後のブーストを与えました。私は別々の矩形をレンダリングしようとしますが、私のRPGのすべてのスプライトがタイルエンジンによって巨大な表面に最初にブリットされ、その表面が画面上でブリットされるので、大きな違いはありません。ありがとう!私は最終的に私が望む40FPSを得ました。^_^ – ApprenticeHacker

+2

"私のRPGのすべてのスプライトは、タイルエンジンによって最初に巨大な表面にブリットされ、その表面は画面上でブリットされます" ええ、それは問題です。 blitする必要があるものだけをblitする必要があります。スプライトの周囲にバウンディングボックスを置き、実際に画面に触れるものだけをblitします。 – wisty

1

Psyco(http://psyco.sourceforge.net/introduction.html)を試してみることができます。それはしばしばかなりの違いを作ります。 python2ため

+0

ありがとう、私はPsycoを試しましたが、計算とプログラムの実行がかなりスピードアップしていますが、私が言っているのはグラフィックスのレンダリングです。残念ながら、1秒あたりのフレーム数は何もありません。 pygameはSDLのラッパーなので、すべてのレンダリングはCで行われますか?私はSDLをC言語で使用していますが、その速度では知られていませんでした。しかし、1秒間に60〜65フレームを表示することができました。 – ApprenticeHacker

2

画像を使用する場合は、画像のconvert()関数を使用して画像を変換することが重要です。 私はconvert()が通常はかなり遅いアルファを無効にすることを読んだ。 16ビットの色深度と画像の変換機能を使用するまでは、スピードの問題もありました。今私のFPSは、画面に大きな画像を合成しても約150です。

image = image.convert()#video system has to be initialed 

また、回転とスケーリングには多くの時間が必要です。大きい、変換されたイメージは、不変の場合、別のイメージに保存することができます。

考えてみると、一度計算して結果を複数回再利用することです。

2

まず、blitingを高速化するアルファを無効にするため、常に 'convert()'を使用してください。 その後、更新が必要な画面の部分だけを更新します。

global rects 

rects = [] 

rects.append(pygame.draw.line(screen, (0, 0, 0), (20, 20), (100, 400), 1)) 

pygame.display.update(rects) # pygame will only update those rects 

注:

リストに彼らの最後の位置から矩形を含める必要がスプライトを動かします。

3

画像を読み込むときに、透明度やその他のアルファ値が絶対に必要な場合は、Surface.convert_alpha()メソッドを使用します。私はプログラミングしていたゲームのためにそれを使っていましたが、パフォーマンスが大幅に向上しました。 例えば:あなたのコンストラクタでは、使用して画像を読み込む:

self.srcimage = pygame.image.load(imagepath).convert_alpha() 

私の知る限り、あなたがイメージに行う任意の変換は、このメソッドの呼び出しの性能を保持します。例えば:あなたはconvert_alpha()がそれに走ってきた画像を使用している場合

self.rotatedimage = pygame.transform.rotate(self.srcimage, angle).convert_alpha() 

が冗長になります。

2

これらのすべては、偉大な提案をしているとうまく動作しますが、心の中で二つのことを維持する必要があります:

1)表面に表面をブリッティングする直接描画するよりも高速です。したがって、固定された画像をサーフェス(メインゲームループの外側)にあらかじめ描画しておき、サーフェスをメインスクリーンに描画する方が効率的です。

# pre-draw image outside of main game loop 
image_rect = get_image("filename").get_rect() 
image_surface = pygame.Surface((image_rect.width, image_rect.height)) 
image_surface.blit(get_image("filename"), image_rect) 
...... 
# inside main game loop - blit surface to surface (the main screen) 
screen.blit(image_surface, image_rect) 

2)あなたは、ユーザーが見ることができないものを描くことにより、リソースを浪費していないことを確認してください:exmampleください。

if point.x >= 0 and point.x <= SCREEN_WIDTH and point.y >= 0 and point.y <= SCREEN_HEIGHT: 
    # then draw your item 

これらは、FPSを高く保つのに役立つ一般的な概念です。

関連する問題