3

好的,我正在用 Pyglet 制作一个小游戏/原型,我对事件感到困惑。游戏运行不佳,通过分析我知道这是因为on_draw()每秒被调用 60 次,因为pyglet.clock.schedule_interval(). 我不完全知道为什么on_draw()目前正在使用它可以得到的所有 CPU,这很高兴知道。通过更多分析,我知道绘制 100 个 Sprites 也需要很多 CPU,比我认为它应该占用的要多(我什至不知道它应该占用 CPU 还是只占用 GPU)。

  1. 默认情况下会做什么on_draw(),我可以避免任何无用的额外内容吗?
  2. 我怎样才能schedule_interval()做到不触发on_draw()
  3. 任何有效的绘图/blitting方法?

一些代码:

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

谢谢。

4

1 回答 1

5

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

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

这与 pygame 有点不同,pygame 小图像比大图像便宜,并且您通常通过绘制更少的像素来加快游戏速度(通常只重绘自上一帧以来发生变化的屏幕部分,依此类推)。

于 2012-09-14T20:20:21.410 回答