Well, most likely your main speed down is looping through all those sprites
as it is - trying just looping through them and calling a dummy function
instead of the opengl one - and see what happens - otherwise, that seems
quite odd to me, I haven't run into that before (are you using psyco,
perhaps?)

On Thu, Feb 26, 2009 at 1:04 PM, Zack Schilling <zack.schill...@gmail.com>wrote:

> I know the PyOpenGL mailing list might be a better place to ask this
> question, but I've had a lot of luck talking to the experienced people here
> so I figured I'd try it first.
>
> I'm trying to migrate a game I created from using the Pygame / SDL software
> rendering to OpenGL. Before attempting the massive and complex conversion
> involved with moving the whole game, I decided to make a little test program
> while I learned OpenGL.
>
> In this test, I set up OpenGL to work in 2D and began loading images into
> texture objects and drawing textured quads as sprites. I created a little
> glSprite class to handle the drawing and translation. At first its draw
> routine looked like this:
>
>        glPushMatrix()
>        glTranslate(self.positionx,self.positiony,0)
>        glBindTexture(GL_TEXTURE_2D, self.texture)
>        glBegin(GL_QUADS)
>        glTexCoord2f(0, 1)
>        glVertex2f(0, 0)
>        glTexCoord2f(1, 1)
>        glVertex2f(w, 0)
>        glTexCoord2f(1, 0)
>        glVertex2f(w, h)
>        glTexCoord2f(0, 0)
>        glVertex2f(0, h)
>        glEnd()
>        glPopMatrix()
>
> Note: self.texture is a texture ID of a loaded OpenGL texture object. My
> sprite class keeps a dictionary cache and only loads the sprite's image into
> a texture if it needs to.
>
> I'd get maybe 200 identical sprites (same texture) onscreen and my CPU
> would hit 100% load from Python execution. I looked into what could be
> causing this and found out that it's probably function call overhead. That's
> 14 external library function calls per sprite draw.
>
> The next thing I tried was to create a display list at each sprite's
> initialization. Then my code looked like this:
>        glPushMatrix()
>        glTranslate(self.positionx,self.positiony,0)
>        glCallList(self.displist)
>        glPopMatrix()
>
> Well, that's nice, down to 4 calls per draw. I was able to push ~500
> sprites per frame using this method before the CPU tapped out. I need more
> speed than this. My game logic uses 30-40% of the CPU alone and I'd like to
> push at least 1000 sprites. What can I do? I've looked into passing sprites
> as a matrix with vertex arrays, but forming a proper vertex array with numpy
> can sometimes be more trouble than it's worth. Plus, I can't swap out
> textures easily mid-draw, so it makes things much more complex than the
> simple way I'm doing things now.
>
> Is there any design pattern I could follow that will get me more speed
> without sending me off the deep end with complexity.
>
> Thanks,
>
> Zack
>

Reply via email to