what you describe sounds like what happens when a game hogs 100% of the CPU, but some background process needs to periodically do something (like say every 3 seconds)
Looking at the code, it doesn't have anything in it that will yield the CPU. The solution is usually to sleep if you are getting a faster frame rate than you need. As a quick hack test/fix, you could try uncommenting the sleep(.01) line, I would bet that you don't get the periodic lag anymore if you do that On 10/26/06, Farai Aschwanden <[EMAIL PROTECTED]> wrote:
Nice looking rain and proper code! I experienced a tiny lag like every 3 seconds. I experienced that also in other games/demos, couldnt find out why. Did other ppl also experienced this and/or knew why or is it only on my Mac? Greetings Farai Am 26.10.2006 um 20:40 schrieb Kamilche: > > I was inspired to create a rain generator after seeing someone > else's on the Internet today, and thought I'd post it here: > > [code] > > import pygame > import random > import time > > SCREENSIZE = 640, 480 > > class Rain(object): > ' Rain generator' > drops = [] > height = 160 > speed = 1 > color = (255, 255, 255, 255) > chance = .05 > > def __init__(self, **kwargs): > ' Allow programmer to change settings of rain generator' > self.__dict__.update(kwargs) > > def Render(self, screen): > ' Render the rain' > dirtyrects = [] > for drop in self.drops: > drop.Render(dirtyrects, screen) > if drop.dead: > self.drops.remove(drop) > else: > dirtyrects.append(drop.rect) > if random.random() < self.chance: > self.drops.append(Rain.Drop(self.height, self.speed, > self.color)) > return dirtyrects > > class Drop(object): > ' Rain drop used by rain generator' > pos = None > dead = 0 > > def __init__(self, height, speed, color): > ' Initialize the rain drop' > w, h = 3, int((random.randint(80, 120) * height) / 100.0) > self.pic = pygame.Surface((w, h), pygame.SRCALPHA, > 32).convert_alpha() > self.height = self.pic.get_height() > self.maxy = SCREENSIZE[1] + h > self.speed = 1 > self.pos = [random.random() * SCREENSIZE[0], -self.height] > factor = float(color[3])/h > r, g, b = color[:3] > for i in range(h): > self.pic.fill( (r, g, b, int(factor * i)), (1, i, > w-2, 1) ) > pygame.draw.circle(self.pic, (255, 255, 255), (1, h-2), 2) > self.rect = pygame.Rect(self.pos[0], self.pos[1], > self.pic.get_width(), self.pic.get_height()) > > def Render(self, dirtyrects, screen): > ' Draw the rain drop' > self.pos[1] += self.speed > self.rect.topleft = self.pos > self.speed += .2 > if self.pos[1] > self.maxy: > self.dead = 1 > else: > screen.blit(self.pic, self.pos) > > def main(): > # Initialize pygame > pygame.init() > screen = pygame.display.set_mode(SCREENSIZE, 0, 32) > > # Create rain generator > rain = Rain() > > # Main loop > nexttime = time.time() > ctr = 0 > quit = 0 > while not quit: > > # Uncomment the following line to make the rain go slower > #time.sleep(.01) > > # Track FPS > if time.time() > nexttime: > nexttime = time.time() + 1 > print '%d fps' % ctr > ctr = 0 > ctr += 1 > > # Draw rain > dirtyrects = rain.Render(screen) > > # Update the screen for the dirty rectangles only > pygame.display.update(dirtyrects) > > # Fill the background with the dirty rectangles only > for r in dirtyrects: > screen.fill((0, 0, 0), r) > > # Look for user quit > pygame.event.pump() > for e in pygame.event.get(): > if e.type in [pygame.QUIT, pygame.KEYDOWN, > pygame.MOUSEBUTTONDOWN]: > quit = 1 > break > > # Terminate pygame > pygame.quit() > > if __name__ == "__main__": > main() > > [/code] > > If the spaces have been eaten, I also posted it at > http://incarnation.danbo.com/ubbthreads/showflat.php? > Cat=0&Number=10483&an=0&page=0#Post10483 >
