Wednesday, August 01, 2007

GFX Demo Code

This little piece of code draws random sprites all over an 800x600 window using GFX. The GFX specific stuff has been commented, all the rest is standard Python/Pygame stuff.

  1 import random
2 import pygame
3 from gfx import gl, array, ext
4
5
6 def main():
7 pygame.init()
8 flags = pygame.OPENGL|pygame.DOUBLEBUF|pygame.HWSURFACE
9 pygame.display.set_mode((800,600), flags)
10
11 #setup the opengl window
12 gl.init((1280,800))
13
14 #create an image batch of 10000 images, which uses the texture 'sprite.png'
15 image_count = 10000
16 texture = ext.GLSurface(pygame.image.load('sprite.png'))
17 image_batch = ext.ImageBatch(image_count, texture)
18
19 #create 10000 random images, and use the whole texture for each image
20 for i in xrange(image_count):
21 x,y = random.randint(0,795), random.randint(0,595)
22 w,h = 5,5
23 vertices = (x,y),(x,y+h),(x+w,y+h),(x+w,y)
24 texture_coords = (0,0),(0,1),(1,1),(1,0)
25 image_batch.set_quad(i, vertices, texture_coords=texture_coords)
26
27 clock = pygame.time.Clock()
28 running = True
29 while running:
30 #clear the display
31 gl.clear((0.0,0.0,0.0,1.0))
32 #draw the image batch
33 image_batch.draw()
34 clock.tick()
35 pygame.display.flip()
36 if pygame.QUIT in (i.type for i in pygame.event.get()):
37 running = False
38 print 'FPS:', clock.get_fps()
39
40
41 if __name__ == "__main__":
42 main()
43

7 comments:

Richard Jones said...

Curses! I don't have pygame installed . I modified the example to use pyglet to set up the window etc. but GFX uses pygame internally :(

Richard Jones said...

OK, I've patched GFX to use pyglet :)

Mostly that involved removing code ;)

I get 136 FPS on my powerbook G4

Richard Jones said...

Oh, I nearly forgot. pyglet has a "lots of sprites" benchmarking program for both itself and pygame. They're in the pyglet svn under contrib/scene2d/examples/los.py and tools/los_pygame.py

Anonymous said...

Very cool. I can do 100,000 64x64 pixel-sized sprites at 7 fps. That's on an Intel Core Duo @ 2.13 GHz and a Nvdia 7900GS.

--Mike

illume said...

coolness.

Not sure what you're using for rendering... Looks like a display list? That seems like the quickest way to do non moving images.

Did you know about the point sprite extensions?

eg.
http://oss.sgi.com/projects/ogl-sample/registry/ARB/point_sprite.txt

I can't remember the earliest extension which was used in quake 1... but it's accelerated by most hw opengls.

There's a bunch of examples if you search the web for point sprites.

Simon Wittber said...

illume: I'm using vertex arrays, so these sprites are completely dynamic, as compared to static display lists.

Richard Jones said...

I played with point sprites in pyglet back when I started the new job.

Through ctypes (just about the slowest way you can do anything ;) using point sprites and vertex arrays I can happily animate a sparker with 1000 sparkles at ~150fps on my crappy G4 powerbook.

And it's sooo easy.

Popular Posts