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 <fash@xxxxxxxxxx> 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
>