class Argon(object): def __init__(self, width, height): self.width = width self.height = height self.load = ImageCache([in_module('assets'), os.getcwd(), '.']) self.default_font = self.load.font('AnonymousPro_17') self.running = False self.flags = HWSURFACE | OPENGL | DOUBLEBUF self.listeners = {} self.frame_latency = [] pygame.display.set_mode((self.width, self.height), self.flags) glEnable(GL_TEXTURE_2D) glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) self.render = Renderer(self, self.default_font) def listen(self, fn): self.listeners[fn.__name__] = fn return fn def run(self): self.running = True while self.running: now = time.time() self.listeners["on_frame"](now) pygame.display.flip() self.frame_latency.append(time.time() - now) while len(self.frame_latency) > 100: self.frame_latency.pop(0) for event in pygame.event.get(): if event.type == QUIT: self.running = False event_dispatch(event, self.listeners) def clear(self, color): r, g, b, a = color glClearColor(r/255.0, g/255.0, b/255.0, a/255.0) glClear(GL_COLOR_BUFFER_BIT) def bind(self): glBindFramebuffer(GL_FRAMEBUFFER, 0) def unbind(self): pass def show_performance_log(self): latency = self.frame_latency font = self.default_font if len(latency) > 0: avg = sum(latency) / len(latency) high = max(latency) text = "avg=%.2fms high=%.2fms" % (avg * 1000, high * 1000) self.render.text((0, self.height - font.height + font.baseline), text)