Hi Benjamin, Thanks so much for your feedback, I figured that I must be missing something.
I will give this a go when I get back from work. I will let you know. Kevin Steffler (780) 975-2303 kevin5steff...@gmail.com On Tue, Feb 7, 2017 at 6:28 AM, Benjamin Moran <benmora...@gmail.com> wrote: > Just wanted to say that this does work, and for reference it nets about > 40,000 sprites at 60fps on my AMD R9 380 GPU. GPU usage is at about 75-80% > in this case. The efficiency comes from the fact that the only one texture > is in use, and that the bulk of the data is already residing on the GPU. > This number of sprites is far more than you would need in a typical 2D game > or application, but it's just to illustrate what you can get. > > The real gotcha when it comes to performance is modifying a sprite's x, y, > rotation, scale, etc. properties. This will cause it's internal vertex list > to be updated, which occurs on the CPU. A common mistake is when trying to > implemnt scrolling in a 2D tiled game, some users will try to update every > sprite's x or y attribute each frame. Instead, it's better to do this on > the GPU with a call to something like glTranslatef. Then, only the > non-static sprite movements will need to be done on the CPU. > > > On Tuesday, February 7, 2017 at 7:50:47 PM UTC+9, Benjamin Moran wrote: >> >> 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/progr >>> amming_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 a topic in the > Google Groups "pyglet-users" group. > To unsubscribe from this topic, visit https://groups.google.com/d/ > topic/pyglet-users/2WCsQqL8B4E/unsubscribe. > To unsubscribe from this group and all its topics, 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. > -- 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.