[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
Re: [pygame] Hardware Accelerated Scrolling Text
Hello Steve,
the 100 % CPU - Issue:
if you have an inner game loop like
quit = 0
while guit == 0:
check_events()
do_game_logic()
paint()
or any other inner loop which runs the whole time, you are telling the
computer to use every available clock cycle for the next step in your
program.
This is quite normal and wanted, normally, because you want to run your
game at the highest framerate possible. Most games do that, that's why
quake II still uses your cpu to the max, it'll just render more frames
in the same time than when it was released.
But you can give other processes a window to do stuff somewhere in your
inner loop. Pygame has a function
pygame.time.wait(time_in_ms) for this.
it returns the actually waited time in ms. It isn't super - precise, but
a pygame.time.wait(1) in your inner loop will give the os and other
processes enough time to do their normal stuff (no more system lagging
because of pygame app).
if you pygame.time.wait() for longer delays i guess you can drop the cpu
- usage of your app.
but normally it's ok for a game to use the max cpu, as long as it gives
the rest of the system a little time now and then.
for smooth scrolling you should use double buffering, add DOUBLEBUF to
your display init:
surface = pygame.display.set_mode((640,480), FULLSCREEN|DOUBLEBUF)
and use
pygame.display.flip()
to update the screen.
If you don't use double buffering, you should only
pygame.display.update() the region(s) which changed, so if you know the
scrolling text is in the middle of the screen, just update the area
where the screen is changed. If the top and bottom third of the screen
is black anyways, just update the middle third and triple your framerate.
The last thing, which is a little more complicated, is making the whole
application timer - based, which leads to the best results on computers
with different speeds anyways.
Let a timer run in your main loop, and give the moving stuff (your
text) a speed of, let's say, 20 pixels per second, that would be one
pixel each 50 milliseconds.
Calculate the movement by dividing the milliseconds elapsed through the
scrollingspeed (elapsed / 50) and place the text where it should go
after that calculation.
Now it moves at the same speed no matter which framerate is used and
should appear smoooth and nice and everything.
Sorry if you already tried all that and it wasn't useful in some way,
you should give some example code in that case.
All the best and everything
Daniel