簡體   English   中英

如何在pygame中提高音樂vid的FPS速率?

[英]how can I increase FPS rate for music vid in pygame?

幾天前,我編寫了一個在pygame窗口中播放視頻的代碼。 正如我最初打算的那樣,代碼可以正常工作。 但是,當我打印調試語句以查看其fps時,它約為30fps。 如果要增加fps,該怎么辦?

這是我使用的代碼。

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

使用python時,打印速度非常慢。 嘗試每隔一段時間打印一次。

示例:(需要import random ):

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

所以@pydude所說的並不是完全錯誤的。
但是,為了真正破壞FPS,我將在on_draw函數中放置一個自定義計數器,這將提供更好的准確性。

此外,代碼的唯一真正問題是您沒有在Window()裝飾器中插入vsync=False

我對您的代碼進行了重新設計,使其更具模塊化,我還消除了潛在的瓶頸,並添加了自己的自定義FPS計數器(通過GL而非控制台),在這里-看看它是否更好為了你。

(注意:按Escape將退出應用程序)

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計數器的差異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM