Pyglet - 游戏运行缓慢,对事件和事物感到困惑

时间:2012-09-14 18:24:39

标签: python events python-3.x pyglet

好吧,我正在用Pyglet做一个小游戏/原型,我对事件感到困惑。 游戏运行得很糟糕,通过分析我知道这是因为on_draw()由于pyglet.clock.schedule_interval()每秒被调用60次。我不确切地知道为什么on_draw()目前正在使用它可以获得的所有CPU,这将是很好的知道。通过剖析更多,我知道绘制100个Sprites也需要大量的CPU,比我认为应该采取的更多(我甚至不知道它应该采用CPU还是只采用GPU)。

  1. on_draw()默认做什么,我可以避免任何无用的额外内容吗?
  2. 如何制作schedule_interval()不会触发on_draw()
  3. 任何有效的绘图/ blitting方法?
  4. 一些代码:

    screen = pyglet.window.Window(800, 600, vsync=False, caption="Project")
    
    tileimage = pyglet.image.create(50, 50, pyglet.image.SolidColorImagePattern((0, 255, 0, 255)))
    
    class tileclass(pyglet.sprite.Sprite):
        def __init__(self, x, y):
            pyglet.sprite.Sprite.__init__(self, tileimage)
            self.x = x
            self.y = y
            self.rect = pygame.Rect(self.x - self.width / 2, self.y - self.height / 2, self.width, self.height)
            self.image.anchor_x = self.width // 2
            self.image.anchor_y = self.height // 2
    
    tiles = []
    
    x = 25
    y = 25
    for i in range(100):
        tiles.append(tileclass(x, y))
        if x == 475:
            x = 25
            y+=50
        else:
            x+=50
    
    @screen.event
    def on_draw():
        screen.clear()
        for t in tiles:
            t.draw()
        fps.draw()
    
    pyglet.clock.schedule_interval(update, 1/60) #Logic stuff
    

    感谢。

1 个答案:

答案 0 :(得分:3)

尝试将精灵添加到批处理中,然后绘制它。在pyglet中,绘制调用的速度很慢,就像OpenGL的工作方式一样。基本上,您希望尽可能减少绘制的数量并尽可能地将事物组合在一起。通过创建一个批处理,然后将所有精灵添加到其中,最后只绘制批处理,我的示例得到了大幅改进。

http://pyglet.org/doc/programming_guide/displaying_images.html#sprites

这与pygame有点形成鲜明对比,其中小图像比大图像便宜,并且通常通过绘制更少的像素(通常仅重绘自上一帧以来具有变化的屏幕的部分等等)来使游戏更快。