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 random
import pyglet
from 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