On 8/27/08, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote: > > I'm trying to animate a loop through a set of images at an average of > 1 fps, convert them to textures and then map them to a quad. > I'm not loading them into memory at the start, but on the fly. > Running with only three images at 1600x900 the script dies within a > minute or so with a memory error. > > I'm reassigning the texture variable (self.img) with each loop, and > have tried several ways to garbage collect it but > it appears the texture data persists until it overflows. Am I going > about this wrong, has anyone else encountered this? > > i've tried: > self.img = None > del self.img > ...etc... > > It's important for this to be scalable, so loading them all into > memory at the start is not an option. > > > from __future__ import division > from math import pi, sin, cos > from numpy import * > from pyglet import image > from pyglet.gl import * > from pyglet import clock > from pyglet import window > from pyglet.window import key > import pyglet > import random > import glob, os, sys > import gc > > try: > config = Config(sample_buffers=1, samples=4, double_buffer=True,) > w = window.Window(resizable=True, config=config) > > except window.NoSuchConfigException: > w = window.Window(resizable=True) > > def setup(): > glClearColor(0, 0, 0, 1) > glDisable(GL_DEPTH_TEST) > glEnable(GL_LIGHT0) > glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR) > glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR) > glEnable(player.img.target) > glBindTexture(player.img.target, player.img.id) > > > @w.event > def on_resize(width, height): > glViewport(0, 0, width, height) > glMatrixMode(GL_PROJECTION) > glLoadIdentity() > gluPerspective(60., float(width) / float(height), .1, 1000.) > glMatrixMode(GL_MODELVIEW) > glClearColor(0, 0, 0, 1) > glDisable(GL_DEPTH_TEST) > glEnable(GL_LIGHT0) > glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR) > glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR) > glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) > return pyglet.event.EVENT_HANDLED > > > class Player(): > def __init__(self): > self.images = ['image.png','image2.png','iamge3.png'] > self.x = 0 > self.img = image.load(self.images[0]).texture > def new_img(self,dt): > self.x += 1 > self.img = image.load(self.images[self.x%3]).texture > > def draw(self): > glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) > glBegin(GL_QUADS) > glTexCoord2f(0,0) > glVertex2f(-1,-1) > glTexCoord2f(0,1) > glVertex2f(-1,1) > glTexCoord2f(1,1) > glVertex2f(1,1) > glTexCoord2f(1,0) > glVertex2f(1,-1) > glEnd() > > > player = Player() > setup() > > pyglet.clock.schedule_interval(player.new_img, 0.001) > > > @w.event > def on_draw(): > glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) > glLoadIdentity() > glTranslatef(0,0,-3) > player.draw() > > pyglet.app.run() >
Hello, I tried your program with some reasonably-sized images but didn't see any memory leak, nor did the program crash. This probably means the problem is specific to your video driver or operating system (which you didn't specify). If you set the environment variable PYGLET_DEBUG_TEXTURE to 1, pyglet will print out its estimate of the current texture memory usage after any texture allocation or deallocation. For example, I get: 4194304 (+4194304) 8388608 (+4194304) 4194304 (-4194304) 8388608 (+4194304) 4194304 (-4194304) 8388608 (+4194304) 4194304 (-4194304) 8388608 (+4194304) 4194304 (-4194304) 8388608 (+4194304) 4194304 (-4194304) etc The number in brackets shows the change in memory since the last reading. Alex. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "pyglet-users" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/pyglet-users?hl=en -~----------~----~----~----~------~----~------~--~---
