[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] Scrolling


There are several "fixes" for speed, but they aren't pretty. 

The simplest is to use a smaller "large surface".  If you still need the same "size", you can use a smaller surface and simply scale the sampled surface up to fit the screen, which in itself is fairly quick.  Even if you cut the original surface in half, you cut the area by 4.  If you use smoothscale, you could probably get away with a 4x or 6x reduction, which should be plenty speedup for the game.  If the surface contains only thick-ish lines aligned along axes, huge reductions are possible.  I used this technique with 100x reductions for great gain at no visual cost. 

If scrolling is relatively infrequent, you can make a surface from the part of the large surface that is on the screen and cache it. 

Another idea is to split the updates over several frames.  For example, update the left half and the right half of the screen alternately.  Will McGugan showed that similar updating methods can be effective in "sidescrolling games" in his book. 

You can combine split updates and scrolling too.  Use a cached surface for the background.  If you're scrolling, the first frame, create a surface "A" the same size as the screen, and blit half of the required sample from the large texture onto it.  The second frame, blit the other half of the required sample onto the surface "A" and use it to update the cached surface, and hence the background. 

Another idea is to break the large surface up into little surfaces (e.g., break a 13000x13000 surface into 169 (13 in each direction) 1000x1000 surfaces), and only draw those little surfaces that are on screen.  This avoids the sampling-from-a-large-texture-bottleneck.  In the worst case here, like you have a 800x600 screen, and four little textures are on screen, sampling occurs from effectively 4*1000*1000 = 4,000,000 texels instead of 1*13000*13000 = 169,000,000 texels.  It's a bit more complicated than that, but that's the general idea.

Another solution is simply to use OpenGL--which is what I ended up doing several times--although that's probably not what you want at all.