[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [pygame] Back to the Scrolling



Pete,

> everyone feel free to send in ideas on how this could be improved a bit.
> if there's a nice general way to get rid of the python overhead in
> scrolling, i'm all for it. the big performance problem with full
> scrolling is really copying all that memory around, and SDL makes it
> happen twice internally, ugh.

I suggest not adding any scrolling specific code to Pygame.  It seems that 
there are so many different kinds of scrolling -- with different cases, that 
many different game engines would have very different needs from a scrolling 
engine.  (For example, some have two or three layers of independantly moving 
backgrounds, others have two or three layers of backgrounds that move 
together.  Then some have foregrounds.  And sprites have to fit into it all 
to, and depending on what kind of scrolling, the sprites can be optimized 
into it all in a number of different ways...)  Beyond all that, there are 
different algorithms (sort of) for doing different things, depending on 
special cases.  Like if certain blocks or sprites can be assumed to have no 
transparency...

One idea I had a while ago for making it possible to eliminate the python 
overhead in scrolling / other tight loops is by using pyrex.  
http://www.cosc.canterbury.ac.nz/~greg/python/Pyrex/
Pyrex generates C modules from "python-like" code that includes special 
keywords for doing C-stuff.

To really be able to use pyrex for pygame, I think pyrex would have to be 
extended to be able to include header files.  (I believe this is planned...  
Right now header files have to be redefined within your pyrex files.)  Then 
scrolling (or whatever) could #include "pygame.h" and "SDL.h" and do 
PySurface_AsSurface conversions on pygame objects.  The code would then be 
freed up to use SDL directly.  Although until pyrex can include header files, 
the following gets the basics done...

cdef extern from "SDL.h":
    cdef struct SDL_Surface:
        char *pixels
        int pitch

cdef extern from "pygame.h":
    SDL_Surface *PySurface_AsSurface(object s)

Then you can cast python objects to SDL surfaces, and do your blitting and 
other stuff without the overhead of python.  (Currently, for each SDL 
function you want to use you need to define it within the pyrex file, 
however.  The code listed above I used for generating a mandelbrot, so I only 
needed access to the surface pixel data.  Everything else I used 
python/pygame for.)  The resulting C code was (I think) about 20 or 40 times 
faster than the python version.  I don't expect the speed up would be as 
impressive for a scrolling engine, but I suspect it would help.

Anyway, for a conclusion.  My reason for suggesting pyrex for this problem is 
that I don't think a built in scrolling engine would cover many of the 
different kinds of scrolling engine needs that exist. On the other hand, 
maybe a simple one would meet enough peoples needs that it would be useful.  
:)

Thanks
Phil

____________________________________
pygame mailing list
pygame-users@seul.org
http://pygame.seul.org