Seite 1 von 1

Pygame | Pyopengl: Mehr als 60 FPS

Verfasst: Dienstag 26. April 2016, 16:01
von Zuzu_Typ
Hallo liebe Community,

Ich arbeite gerade an der Grafik-"Engine" zu einem kleinen Spiel und störe mich ein wenig an der "niedrigen" Bilderfrequenz von 60 Bildern pro Sekunde.

Ich verwende ein Standard pygame.display Fenster mit HWSURFACE, FULLSCREEN, OPENGL und DOUBLEBUF.
Dieses aktualisiere ich mich pygame.display.flip() .

Da ich im Internet nach diesem Problem gesucht habe,
habe ich versucht die maximale Bilderfrequenz per pygame.Clock().tick(FPS) festzulegen, sie bleibt aber trotzdem immer konstant auf 60.

Lässt sie sich irgendwie erhöhen?

Vielen Dank für eure Hilfe,
--Zuzu_Typ--

Re: Pygame | Pyopengl: Mehr als 60 FPS

Verfasst: Dienstag 26. April 2016, 16:17
von BlackJack
``pygame.Clock().tick(FPS)`` würde ja jedesmal eine neues `Clock`-Objekt erzeugen. Das dürfte deshalb nicht funktionieren.

Re: Pygame | Pyopengl: Mehr als 60 FPS

Verfasst: Dienstag 26. April 2016, 19:43
von Zuzu_Typ
Sorry, ich hab es auch nicht so gemacht,
sondern ein pygame.time.Clock objekt gemacht und dieses weiterverwendet.

Hier ist mal ein Beispiel (nicht von mir geschrieben, aber leicht bearbeitet):

Code: Alles auswählen

import pygame, os
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *

vertices = (
    (1, -1, -1),
    (1, 1, -1),
    (-1, 1, -1),
    (-1, -1, -1),
    (1, -1, 1),
    (1, 1, 1),
    (-1, -1, 1),
    (-1, 1, 1)
    )

edges = (
    (0,1),
    (0,3),
    (0,4),
    (2,1),
    (2,3),
    (2,7),
    (6,3),
    (6,4),
    (6,7),
    (5,1),
    (5,4),
    (5,7),
    )

surfaces = (
    (0,1,2,3),
    (3,2,7,6),
    (6,7,5,4),
    (4,5,1,0),
    (1,5,7,2),
    (4,0,3,6)
    )

colors = (
    (1,0,0),
    (0,1,0),
    (0,0,1),
    (1,0,0),
    (1,1,1),
    (0,1,1),
    (1,0,0),
    (0,1,0),
    (0,0,1),
    (1,0,0),
    (1,1,1),
    (0,1,1)
    )

def Cube():
    glBegin(GL_QUADS)
    for surface in surfaces:
        x = 0
        for vertex in surface:
            x += 1
            glColor3fv(colors[x])
            glVertex3fv(vertices[vertex])
        
    glEnd()
    
    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(vertices[vertex])
    glEnd()

def main():
    pygame.init()
    clock = pygame.time.Clock()
    display = (1920,1080)
    pygame.display.set_mode(display,DOUBLEBUF|OPENGL|FULLSCREEN|HWSURFACE)

    gluPerspective(45, float(display[0])/float(display[1]), 0.1, 50.0)

    glTranslatef(0.0, 0.0, -5)
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                surface = pygame.display.get_surface()
                pygame.image.save(surface, "D:\\Te2st.PNG")
                os._exit(0)
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    glTranslatef(-0.1,0,0)
                if event.key == pygame.K_RIGHT:
                    glTranslatef(0.1,0,0)
                if event.key == pygame.K_UP:
                    glTranslatef(0,0.1,0)
                if event.key == pygame.K_DOWN:
                    glTranslatef(0,-0.1,0)
                if event.key == pygame.K_ESCAPE:
                    print(clock.get_fps())
                    os._exit(0)
                    
            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 4:
                    glTranslatef(0,0,-1)
                if event.button == 5:
                    glTranslatef(0,0,1)
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
        Cube()
        clock.tick(120)
        pygame.display.flip()

main()
Vor der Programmbeendigung (per Escape) wird die aktuelle FPS-Anzahl auf die Konsole geschrieben.
Ich habe das Programm auch testweise einmal mit Bandicam überwacht (FPS anzeigen lassen) und der Counter bleibt duchgängig bei 60 FPS

Re: Pygame | Pyopengl: Mehr als 60 FPS

Verfasst: Dienstag 26. April 2016, 20:29
von BlackJack
@Zuzu_Typ: Vielleicht eine Hardware/Treiber-Beschränkung? Ich habe keine Ahnung wonach ein X-Server bei einem TFT-Bildschirm die maximale Bildwiederholrate festlegt, aber meiner hat sich anscheinend 60Hz ausgesucht. (Mit so etwas habe ich mich das letzte mal mit einem Röhrenmonitor auseinandersetzen müssen. :-))

Re: Pygame | Pyopengl: Mehr als 60 FPS

Verfasst: Dienstag 26. April 2016, 20:43
von Zuzu_Typ
Ja, es scheint sich tatsächlich um V-sync zu handeln, zumindest nach diesem post.