From b080d35999bd9536f1ef18d1be4590285a3bd0b3 Mon Sep 17 00:00:00 2001 From: "Mr. Gallo" Date: Thu, 25 Oct 2018 00:08:22 -0400 Subject: [PATCH] Optimize _load() numyp.array() can simply take self.img to drastically reduce the computing time (~90%). 350ms to 24ms on my computer. `renderer.render_image()` still takes 24ms when calling `text("hello", (50, 50))`. 13ms for the `gloo.Program.draw()` function in that same `render_image` function line #263. Partially resolves #69 --- p5/core/image.py | 1 + tests/test_image_load.py | 71 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 tests/test_image_load.py diff --git a/p5/core/image.py b/p5/core/image.py index d01f9c4e..21e7af92 100644 --- a/p5/core/image.py +++ b/p5/core/image.py @@ -168,6 +168,7 @@ def _load(self): self._size = (width, height) data = np.array(self._img.getdata(), dtype=np.uint8) + data = np.array(self._img, dtype=np.uint8) self._channels = len(self._img.getbands()) diff --git a/tests/test_image_load.py b/tests/test_image_load.py new file mode 100644 index 00000000..799d6776 --- /dev/null +++ b/tests/test_image_load.py @@ -0,0 +1,71 @@ +import sys +import unittest +import threading +import types +import time +from time import perf_counter as pc + +sys.path.append('../') +from p5 import * + +from p5 import PImage, font, renderer +from vispy.gloo import Program + +# def assertRuntime(milliseconds): +# def inner(func): +# def wrapper(self, *args, **kwargs): +# start = pc() +# func(self, *args, **kwargs) +# elapsed = int((pc() - start) * 1000) +# assert elapsed < milliseconds, f"{func.__name__} runtime exceeds {milliseconds} milliseconds. Took {elapsed}." +# return wrapper +# return inner +# +# +# class TestImageLoad(unittest.TestCase): +# +# @assertRuntime(1000) +# def test_image_load(self): +# try: +# run() +# except: +# print("shutting down") +# text("hello", (5,5)) +# self.assertTrue(True) + +def timer(func): + def inner(limit=None): + def wrapper(*args, **kwargs): + start = pc() + func(*args, **kwargs) + elapsed = int((pc() - start) * 1000) + + if limit and elapsed > limit: + print(f"{frame_count}: WARN: {func.__name__}() exceeds {limit} ms. Took {elapsed} ms.") + else: + print(f"{frame_count}: {func.__name__}: {elapsed} ms.") + return wrapper + return inner + +text = timer(text)() +font.image = timer(font.image)() + +def hello(): + print("hello") + +setattr(PImage, "_load", timer(PImage._load)()) +renderer.render_image = timer(renderer.render_image)() +setattr(Program, "draw", timer(Program.draw)()) + + +def setup(): + size(640, 480) + +def draw(): + background(255) + ellipse((50, 50), 100, 100) + text("hello", (50, 50)) + no_loop() + exit() + +run()