Pygame | Pyopengl: Mehr als 60 FPS

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
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--
BlackJack

``pygame.Clock().tick(FPS)`` würde ja jedesmal eine neues `Clock`-Objekt erzeugen. Das dürfte deshalb nicht funktionieren.
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
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. :-))
Zuzu_Typ

Ja, es scheint sich tatsächlich um V-sync zu handeln, zumindest nach diesem post.
Antworten