如何在 pygame 中提高音乐视频的 FPS 速率



几天前,我制作了一个在pygame窗口中播放视频的代码。代码工作得很好,就像我最初打算的那样。但是,当我打印调试语句以查看其 fps 时,它在 30fps 左右。如果我要提高帧率,我该怎么办?

这是我使用的代码。

import sys
from color import *
import pyglet
pygame.init()
running = True
gameDisplay= pygame.display.set_mode((800,600))
window = pyglet.window.Window(visible=False)
background_vid = pyglet.media.Player()
background_vid.queue(pyglet.media.load(".\music_folder\music_vid/servant_of_evil_converted.mp4"))
background_vid.play()
def hellow():
    print "hellow bloody world"
def on_draw():
    #We have to convert the Pyglet media player's image to a Pygame surface
    rawimage = background_vid.get_texture().get_image_data()
    print "rawimage "+str(rawimage)
    pixels = rawimage.get_data('RGBA', rawimage.width *8)

    video = pygame.image.frombuffer(pixels, (rawimage.width*2,rawimage.height), 'RGBA')
    #Blit the image to the screen
    gameDisplay.blit(video, (0, 0))

circle_x=300
while True:
    pyglet.clock.tick()
    on_draw()
    print "fps: "+str(pyglet.clock.get_fps())
    for event in pygame.event.get():
        if(event.type == pygame.QUIT):
            sys.exit()
            pygame.quit()
    pygame.draw.rect(gameDisplay, red, (circle_x, 300, 300, 300), 5)
    circle_x+=1
    pygame.display.update()

所以@pydude说的并不是完全错误的。
但是,为了实际确定FPS,我会在on_draw功能中放置一个自定义计数器,这将提供更好的准确性。

此外,代码唯一真正的问题是没有将vsync=False插入到Window()装饰器中。

我已经重新设计了您的代码以使其更加模块化,我还删除了潜在的瓶颈并添加了我自己的自定义 FPS 计数器(通过 GL 而不是控制台),在这里 - 试一试看看它是否更适合您。

(注意:按 Esc 将退出应用程序)

import sys
from color import *
import pyglet
from pyglet.gl import *
from time import time # Used for FPS calc
key = pyglet.window.key
class main(pyglet.window.Window):
    def __init__ (self):
        super(main, self).__init__(800, 800, fullscreen = False, vsync = True)
        self.running = True
        self.background_vid = pyglet.media.Player()
        self.background_vid.queue(pyglet.media.load(".\music_folder\music_vid/servant_of_evil_converted.mp4"))
        self.background_vid.play()
        self.fps_counter = 0
        self.last_fps = time()
        self.fps_text = pyglet.text.Label(str(self.fps_counter), font_size=12, x=10, y=10)
    def on_key_press(self, symbol, modifiers):
        if symbol == key.ESCAPE: # [ESC]
            self.running = False
    def on_draw(self):
        self.render()
        #We have to convert the Pyglet media player's image to a Pygame surface

    def render(self):
        self.clear()
        rawimage = background_vid.get_texture().get_image_data()
        pixels = rawimage.get_data('RGBA', rawimage.width *8)
        video = pygame.image.frombuffer(pixels, (rawimage.width*2,rawimage.height), 'RGBA')
        #Blit the image to the screen
        self.blit(video, (0, 0))
        # And flip the GL buffer
        self.fps_counter += 1
        if time() - self.last_fps > 1:
            self.fps_text.text = str(self.fps_counter)
            self.fps_counter = 0
            self.last_fps = time()
        self.fps_text.draw()
        self.flip()
    def run(self):
        while self.running is True:
            self.render()
            # -----------> This is key <----------
            # This is what replaces pyglet.app.run()
            # but is required for the GUI to not freeze
            #
            event = self.dispatch_events()
            if event and event.type == pygame.QUIT:
                self.running = False
x = main()
x.run()

尝试将vsync = True切换为vsync = False并观察 FPS 计数器的差异。

使用python,打印速度非常慢。尝试每隔一段时间打印一次。

示例:(需要import random):

if random.random()>0.09:print "fps: "+str(pyglet.clock.get_fps())

最新更新