import pygame import collections class GameTimer(object): def __init__(self): self.update_fps_count = None def start_loop(self): self.elapsed = 0 self.elapsed_sec = 0.0 self.timer = pygame.time.get_ticks() self.reset_fps_count() def next_frame(self, skipping=False): newticks = pygame.time.get_ticks() #if skipping: # # reset self.timer to it's value from the previous frame # self.timer -= self.elapsed self.elapsed = newticks - self.timer self.timer = newticks self.elapsed_sec = float(self.elapsed) / 1000.0 if self.elapsed != 0: self.update_fps_count(self.elapsed) def reset_fps_count(self): self.framelist = collections.deque() self.update_fps_count = self.update_fps_count_empty def update_fps_count_empty(self, elapsed): self.framelist.append(elapsed) if len(self.framelist) >= 25: self.update_fps_count = self.update_fps_count_full def update_fps_count_full(self, elapsed): self.framelist.popleft() self.framelist.append(elapsed) def elapsed(self): """ get the amount of time in milliseconds passed since the last frame was displayed """ return self.elapsed def elapsed_sec(self): """ get the amount of time in seconds passed since the last frame was displayed """ return self.elapsed_sec def num_frames(self, delay, offset=0): """ if you want something to occur every "delay" milliseconds, this will return the number of times you should make it happen in this particular frame (can be 0) """ return int((self.timer - offset) / delay) - int((self.timer - self.elapsed - offset) / delay) def loop_frames(self, delay, offset=0): return range(num_frames(delay, offset)) def get_timer(self): return self.timer def average(self, d): #spf = (float(sum(self.framelist)) / (len(self.framelist) * 1000.0)) if len(d) == 0: return 0.0 smooth = 0.85 #v2 = float(d[-1]) #for i in xrange(len(d) - 2, 0, -1): # pass v2 = float(d[0]) for i in range(1, len(d)): v1 = float(d[i]) v2 = (smooth * v2) + ((1.0 - smooth) * v1) return v2 def get_fps(self): #return ",".join([str(x) for x in sorted(self.framelist)]) if len(self.framelist) == 0.0: return 0.0 spf = self.average(self.framelist) / 1000.0 if spf == 0.0: return 0.0 #print "%s < %s" % (1.0 / spf, self.framelist) return 1.0 / spf