4

画面のティアリングの問題で 1 週間ほど立ち往生しています。

ここに私の問題があります: PNG 画像のシーケンスを非常に高速 (30 fps 以上) に表示できるプログラムを作成したいと考えています。これを行うために、私は pygame ライブラリ、特にpygame.display.blitandを使用しpygame.display.flipます。

コードの例を次に示します (自家製の遅延関数を使用)。

import time
import pygame

screen=pygame.display.set_mode(size, pygame.FULLSCREEN)
nbPicturesToLoad=12
pictures=range(nbPicturesToLoad)
for i in range(nbPicturesToLoad):
    pictures[i]=pygame.image.load(pictureName).convert() //Here pictureName depends on the value of i

(...)

for i in range(nbPicturesToLoad):
    timer1=time.time()
    screen.blit(pictures[i], (0,0))
    pygame.display.flip()
    timer2=time.time()
    timer=timer2-timer1
    while(timer<0.03333):
        timer2=time.time()
        timer=timer2-timer1

タイマーを使用すると、画面上で同じリフレッシュ レートを維持できます。私の問題は、画面のティアリングの問題があることを自分の目で確認できることです ( https://en.wikipedia.org/wiki/Screen_tearing )。pygame のドキュメントでは、画面の初期化に他のフラグを使用することを推奨しています ( http://www.pygame.org/docs/ref/display pygame.HWSURFACE and pygame.DOUBLEBUF ) 。どうやら、これらは画面のティアリングの問題を修正するのに役立つ可能性があります. しかし、これらのフラグを使用すると、画面のティアリングが修正されません。y.set_mode

pygame が X11 で vsync を処理できないことをどこかで見たことがあります。これは、HWSURFACE および DOUBLEBUF フラグとの違いが見られない理由を説明しています。

Raspberry Pi でこの vsync の問題に遭遇した人はいますか? 「config.txt」ファイルに入れるパラメータはありますか? これらの画面のティアリング効果を回避するために、実際の vsync 情報を取得する方法はありますか?

作成されたウィンドウで pyglet が vsync を処理できることを見てきましたが、不明な理由で pyglet ウィンドウに画像を表示できず、特に Raspberry が処理できない場合、問題が解決するかどうかは本当にわかりません今すぐvsync。

4

1 に答える 1

0

Pygame クロックを使用してタイミングを処理してみてください。実装と理解がはるかに簡単で、問題を解決できる可能性があります。

下に示された:

import pygame as py
py.init()

WINDOW = (400,400)
screen = py.display.set_mode(WINDOW)

nbPicturesToLoad=12
pictures = range(nbPicturesToLoad)
for i in range(nbPicturesToLoad):
    pictures[i]=py.image.load(pictureName).convert()

FPS = 30
clock = py.time.Clock() # Create a clock object

done = False
while not done:
    for event in py.event.get():
        if event.type == py.QUIT:
            done = True
    for i in range(nbPicturesToLoad):
        screen.fill((255,255,255))
        screen.blit(pictures[i],(0,0))
        py.display.flip()
        clock.tick(FPS) # use pygame.time.Clock to wait 1/30th of a second
py.quit()

ただし、これは画面のティアリングの問題であるため、解決策は Pygame の使用を完全に停止することです。Linux/X11 で pygame によるテアリングを回避する方法 この質問は、あなたが探しているものをカバーしているようです。

幸運を。

于 2016-05-24T10:00:15.470 に答える