Hi Benjamin,

Tried it out last night, got up to about 9000 sprites before having
issues.  Thanks a lot for the tip for scrolling as well, I was definitely
making that mistake so you saved me a lot of hassle.

The next problem I have is ordering the sprite rendering with a z value,
and it looks like I should read this thread
<https://groups.google.com/forum/#!topic/pyglet-users/zj6L_617w3k> to get
up to speed.

Thanks for all the help!

Kevin Steffler
[email protected]

On Tue, Feb 7, 2017 at 12:55 PM, Kevin Steffler <[email protected]>
wrote:

> 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
> [email protected]
>
> On Tue, Feb 7, 2017 at 6:28 AM, Benjamin Moran <[email protected]>
> 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/to
>> pic/pyglet-users/2WCsQqL8B4E/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to
>> [email protected].
>> To post to this group, send email to [email protected].
>> 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 [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/pyglet-users.
For more options, visit https://groups.google.com/d/optout.

Reply via email to