On Fri, Sep 23, 2011 at 7:04 PM, Greg Ewing <greg.ew...@canterbury.ac.nz>wrote:

> Christopher Night wrote:
>
>  I use wrappers. Let me point out there's a total of 9 functions in
>> pygame.draw. You seem to be going to a lot of effort to avoid writing 9
>> one-line functions.
>>
>
> Don't forget that function calls are expensive in Python, as
> is doing piecemeal arithmetic.
>
> Most other graphics systems these days provide a facility for
> applying a transformation to coordinates before drawing, and
> I don't think it's unreasonable to suggest that PyGame should
> do the same. Having it done for you in C would be more efficient
> than doing it in Python.
>

While that is roughly true, it's a very, very general statement to the point
where I would say that avoiding function calls on principle is premature
optimization. Keep in mind that the operation you're wrapping - a draw call
- is expensive in the first place. Anyway, a quick profile suggests that for
a small circle you can potentially gain a 7% speedup by avoiding this
function call, and a 14% speedup avoiding both the function and the
arithmetic:

>>> import timeit
>>> setup = """import pygame
... pygame.init()
... s = pygame.display.set_mode((100, 100))
... def myCirc(surf, color, (x, y), r, width=0):
...     pygame.draw.circle(surf, color, (x/10, y/10), r/10, width/10)"""
>>> timeit.timeit("myCirc(s, (255,255,255), (500, 500), 400)", setup,
number=100000)
4.9027900695800781
>>> pygame.quit()
>>> timeit.timeit("pygame.draw.circle(s, (255,255,255), (500/10, 500/10),
400/10)", setup, number=100000)
4.546515941619873
>>> pygame.quit()
>>> timeit.timeit("pygame.draw.circle(s, (255,255,255), (50, 50), 40)",
setup, number=100000)
4.1960330009460449
>>> pygame.quit()

You can decide whether that's worth it for you to avoid this function call.
For me, if my game is slow enough that I have to avoid function calls to get
reasonable performance, it means I'm doing something else wrong. :) If
performance is the goal here, I still think it's a large amount of effort
for a relatively modest gain.

For what it's worth, I would also welcome native-pygame wrappers that apply
a linear transformation. But whether pygame *should* have them wasn't the
question, as I understood it. And I can scrape by without them.

-Christopher

Reply via email to