2016-05-24 9 views
1

Ich komme zu diesem Forum, weil ich auf einem Bildschirm reißen Problem seit etwa einer Woche fest bin. Zunächst muss ich sagen, dass ich wenig Wissen und Erfahrung in Himbeer und Python habe.Bildschirm reißen mit Pygame auf Himbeer Pi

Hier ist mein Problem: Ich möchte ein Programm machen, das eine Sequenz von PNG-Bildern wirklich schnell (mit einer Geschwindigkeit von 30 fps oder mehr) anzeigen kann. Dazu benutze ich die Pygame-Bibliothek, insbesondere pygame.display.blit und pygame.display.flip. Hier ist ein Beispiel für den Code (mit einer hausgemachten Verzögerungsfunktion):

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 

Der Timer ermöglicht es mir, die gleiche Aktualisierungsrate auf dem Bildschirm zu haben. Mein Problem ist, dass man mit eigenen Augen sehen kann, dass es ein Siebreißproblem gibt (https://en.wikipedia.org/wiki/Screen_tearing). In der pygame-Dokumentation wird empfohlen, andere Flags für den Bildschirm init zu verwenden (pygame.HWSURFACE und pygame.DOUBLEBUF, http://www.pygame.org/docs/ref/display. ... y.set_mode). Anscheinend könnten diese helfen, die Probleme beim Abreißen des Bildschirms zu korrigieren. Aber wenn ich diese Flags verwende, sehe ich keine Bildschirmreißkorrektur. Ich habe irgendwo gesehen, dass Pygame Vsync auf X11 nicht umgehen kann, was erklären würde, warum ich keinen Unterschied zu den HWSURFACE und DOUBLEBUF Flags sehe.

Hat jemals jemand dieses vsync Problem auf dem Raspberry Pi begegnet? Gibt es einen Parameter, der in die Datei "config.txt" eingefügt werden soll? Hat jemand eine Möglichkeit, echte vsync-Informationen zu erhalten, um diese Bildschirmreifeffekte zu vermeiden?

Ich habe gesehen, dass pyglet Vsync in den erstellten Fenstern verarbeiten konnte, aber aus unbekannten Gründen kann ich keine Bilder im Pyglet-Fenster anzeigen und ich bin mir wirklich nicht sicher, ob es das Problem beheben würde, besonders wenn Himbeere kann 't Hand vsync jetzt ...

Jede Hilfe wäre willkommen :). Chumbucket

+0

Als jemand mit Epilepsie muss ich fragen, warum Sie das tun wollen, und Sie sind sich bewusst, dass diese Art von Flackern des Displays für Menschen wie mich Probleme verursachen kann, oder? – marienbad

+0

Ich bin mir dessen voll bewusst;). Es ist kein Spiel oder etwas, das jeder herunterladen kann, es ist ein persönliches Projekt und wird nur von mir selbst benutzt: Ich entwickle einen 3D-Scanner mit einem Projektor und einer Kamera. Die Kamera nimmt die vom Projektor angezeigten Bilder auf. – Chumbucket

Antwort

0

Verwenden Sie die Pygame-Uhr, um das Timing zu handhaben, es ist viel einfacher zu implementieren und zu verstehen und es kann das Problem lösen.

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() 

Da dies jedoch ein Tearing Problem die Lösung unter Verwendung von Pygame insgesamt sein kann, zu stoppen:

unten. How to avoid tearing with pygame on Linux/X11 Diese Frage scheint abzudecken, wonach Sie suchen.

Viel Glück.

+0

Ja, es ist einfacher zu implementieren und zu verstehen, aber es hat das Problem nicht gelöst. Ich werde es sehen, danke. – Chumbucket

+0

Problem gelöst, Ihre Antwort gab mir einige andere Ideen! – Chumbucket

+2

wie hast du es gelöst, wenn ich fragen kann? Ein ähnliches Problem haben – user3235916