Here's a quick script-ish snippet that shows how to use the batch and resource module. It also illustrates the built-in fps display. This should probably work OK, but I can't really test it on my machine at the moment.
import random import pyglet from pyglet import gl COUNT = 1000 window = pyglet.window.Window(width=1000, height=600) batch = pyglet.graphics.Batch() fps_display = pyglet.clock.ClockDisplay(color=(0.9, 0.0, 0.2, 1.0)) delta_time_display = pyglet.text.Label(x=12, y=70, font_size=25, color=(255, 0, 25, 255)) pyglet.resource.path.append('.') pyglet.resource.reindex() sprites = [] def initialize_sprites(): for i in range(COUNT): image = pyglet.resource.image("image100x100.jpeg") x = random.randint(0, window.width) y = random.randint(0, window.height) sprite = pyglet.sprite.Sprite(image, x=x, y=y, batch=batch) sprites.append(sprite) def initialize_gl(): gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_NEAREST) @window.event def on_draw(): window.clear() batch.draw() fps_display.draw() delta_time_display.draw() def update_game(dt): delta_time_display.text = "Delta Time: " + str(round(dt, 4)) # update game stuff here if __name__ == "__main__": initialize_sprites() initialize_gl() pyglet.clock.schedule_interval(update_game, 1/60.0) pyglet.app.run() On Tuesday, February 7, 2017 at 6:57:17 PM UTC+9, Benjamin Moran wrote: > > Hi Kevin, > > There are a lot of very inificient things you are doing in your code. > Calling the draw() method directly on each sprite is not recommended, since > it has to set/unset the OpenGL state for each and every one. What you want > to do instead is to create a batch: *batch = pyglet.graphics.Batch*, and > pass this into each sprite on creation. Then, you can draw everything > together with a single call to *batch.draw()* in your on_draw method. There > is a bit of information about Batches in the programming guide, but it does > need more detail: > > http://pyglet.readthedocs.io/en/pyglet-1.2-maintenance/programming_guide/graphics.html#batched-rendering > > That said, pyglet can easily render thousands of sprites if batched > properly. > > > On Tuesday, February 7, 2017 at 12:06:49 PM UTC+9, Kevin S. wrote: >> >> Hello, I started playing around with Pyglet recently and it was going >> fine until I started trying to fill the screen with images. I ended up >> with an atrocious frame rate, to the point where user mouse clicks weren't >> working properly and animations looked really bad. In order to try to test >> the limitations, I created the following test game to see what would happen: >> >> >> >> >> >> >> *import randomimport pygletfrom pyglet import gl* >> *class Game(object):* >> * width = 1000* >> * height = 600* >> * images = [* >> * {"filepath": "image100x100.jpeg", "count": 300}* >> * ]* >> * background_color = (0.3, 0.3, 0.3, 1)* >> * report_interval = 5.0* >> >> * def start(self):* >> * self.pyglet_window = pyglet.window.Window(width=self.width, >> height=self.height, vsync=False)* >> * self.pyglet_window.event(self.on_draw)* >> * self.initializeGL()* >> * self.reset_report_timer()* >> * self.initialize_sprites()* >> * pyglet.clock.schedule_interval(self.tick, 0.01)* >> * pyglet.app.run()* >> >> * def initialize_sprites(self):* >> * self.sprites = []* >> * for image_set in self.images:* >> * filepath = image_set["filepath"]* >> * count = image_set["count"]* >> * image = pyglet.image.load(filepath)* >> * for i in range(count):* >> * x, y = random.randint(0, self.width), random.randint(0, >> self.height)* >> * sprite = pyglet.sprite.Sprite(image, x=x, y=y)* >> * self.sprites.append(sprite)* >> >> * def print_report(self):* >> * print "======================="* >> * print " Call count: {}".format(self.num_calls)* >> * print " FPS: {}".format(self.num_calls / self.report_interval)* >> >> * def reset_report_timer(self):* >> * self.report_timer = 0.0* >> * self.num_calls = 0* >> >> * def initializeGL(self):* >> * gl.glEnable(gl.GL_TEXTURE_2D)* >> * gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, >> gl.GL_NEAREST)* >> * gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, >> gl.GL_NEAREST)* >> * gl.glEnable(gl.GL_BLEND)* >> * gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)* >> * gl.glPushAttrib(gl.GL_ENABLE_BIT)* >> >> * def tick(self, seconds_passed):* >> * self.num_calls += 1* >> * self.report_timer += seconds_passed* >> * if self.report_timer >= self.report_interval:* >> * self.print_report()* >> * self.reset_report_timer()* >> >> >> * def on_draw(self):* >> * self.pyglet_window.clear()* >> * pyglet.gl.glColor4f(*self.background_color)* >> * pyglet.graphics.draw(4, pyglet.gl.GL_QUADS,* >> * ('v2i', (0, 0, self.width, 0, self.width, self.height, 0, >> self.height))* >> * )* >> * pyglet.gl.glColor4f(1, 1, 1, 1)* >> * self.draw_sprites()* >> >> * def draw_sprites(self):* >> * for sprite in self.sprites:* >> * sprite.draw()* >> >> >> *if __name__ == "__main__":* >> * game = Game()* >> * game.start()* >> >> I attached the file I used as well. The GL commands I used were designed >> to get pixel perfect graphics, and I set them up a long time ago and don't >> remember exactly what they do. If you think those are teh problem please >> let me know and I will test it out. >> >> The results were pretty crumby. I found that with 100 images I was >> sitting at about 60 fps, with 200 images I went down to 30 fps, with 300 >> images I was down to 20 fps. >> >> I wanted to test out some features like the atlas and resource packages, >> but I figured I would double check to make sure I am not making any obvious >> mistakes here. Can anyone confirm that the limitations I am experiencing >> are normal? If not, what can I try to get things working a bit better? >> >> My specs are: >> >> - MacBook Pro (15-inch, Mid 2012) >> - Processor - 2.6 GHz Intel Core i7 >> - Memory - 8 GB 1600 MHz DDR3 >> - Graphics - NVIDIA GeForce GT 650M 1024 MB >> >> -- You received this message because you are subscribed to the Google Groups "pyglet-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to pyglet-users+unsubscr...@googlegroups.com. To post to this group, send email to pyglet-users@googlegroups.com. Visit this group at https://groups.google.com/group/pyglet-users. For more options, visit https://groups.google.com/d/optout.