Pyglet如何使用Batch批量渲染多个对象及batch参数报错解决
错误原因
你自定义的ball类的构造方法没有声明接收batch关键字参数,也没有将该参数透传给父类pyglet.sprite.Sprite的构造方法,因此传入batch=xxx时会抛出参数不匹配的错误。
修改步骤
1. 调整ball类的构造方法
在__init__参数列表中新增batch、group可选参数,调用父类构造时传入这两个参数即可支持批量渲染:
class ball(pyglet.sprite.Sprite): # 新增batch、group可选参数,默认值设为None def __init__(self, parent, image='Red_Circle.png', x=0, y=0, batch=None, group=None): self.texture = pyglet.image.load(image) # 把batch、group传给父类Sprite的构造方法 pyglet.sprite.Sprite.__init__(self, self.texture, x=x, y=y, batch=batch, group=group) self.parent = parent self.direction = UP | RIGHT # Starting direction
2. 修正主窗口的实例创建逻辑
你之前的代码存在两处可优化问题:
- 循环创建ball实例时漏传了第一个必填参数
parent batch和生成的ball列表是局部变量,渲染阶段无法调用,需要改成实例属性
修改后的main类__init__代码:
class main(pyglet.window.Window): def __init__ (self, width=800, height=600, fps=False, *args, **kwargs): super(main, self).__init__(width, height, *args, **kwargs) self.x, self.y = 0, 0 # 把batch设为实例属性 self.batch = pyglet.graphics.Batch() # 把ball列表设为实例属性,方便后续更新位置 self.ball_sprites = [] for i in range(100): x, y = i * 10, 50 # 补全parent参数,传入batch ball1= ball(self, x=x, y=y, batch=self.batch) self.ball_sprites.append(ball1) self.ball = ball(self, x=100, y=100) self.alive = 1
3. 调整渲染逻辑实现批量绘制
不用逐个调用ball的render()方法,直接调用batch.draw()即可一次性渲染所有加入该批次的精灵,渲染效率更高:
def render(self): self.clear() # 先更新所有批量生成的ball的位置 for ball in self.ball_sprites: ball.update(0.01) ball.update() # 调用batch.draw完成批量渲染 self.batch.draw() # 单独的ball按需渲染 self.ball.update(0.01) self.ball.update() self.ball.render() self.flip()
调整完成后即可正常使用Batch完成批量渲染,不会再抛出参数错误。
内容的提问来源于stack exchange,提问作者yuo
相关产品推荐
相关产品推荐

