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

Re: [pygame] Circle cut off at 60+fps, fixed by display.flip



I get that you want to understand what's going on, but beyond that, is there some problem with just using display.flip?


On Thu, Jun 12, 2014 at 3:31 AM, Abhas Bhattacharya <abhasbhattacharya2@xxxxxxxxx> wrote:
The following code draws a circle and moves it by 4px to left every step.

Problem is that at about 60 fps or more, the circle flickers and sometimes looks cut off to me (approx. illustration - http://i.imgur.com/4nKzsCP.png). The flickering is not like a screen flicker, more like state switching between full circle and cut-off circle. This problems doesnt occur at all upto 45 fps, couldnt be reproduced by screen capture or pausing the game, as if the problem is only visible to the naked eye.

Now, there could be two possibilities:

* Screen is not updated over the required region.

None of the update code depends on the fps, so the flicker should have been fps-independent. But, the problem disappears at 30/45 fps. But, surprisingly, it is also fixed if display.flip is used instead of update.

* V-sync/monitor refresh problem

Some other pygame flicker questions mentioned this problem. I thought software rendering doesnt have this problem, but not really sure. Also, why would display.flip fix this?

Ver- 1.9.2 a0

import pygame
w,h=800,200
fps=60
pygame.init()
screen = pygame.display.set_mode([w, h])
color=pygame.Color("white")
clock=pygame.time.Clock()
radius=20
x,y=800,100
def get_bbox(x,y):
  left = x - radius
  top = y - radius
  width = radius * 2
  height = radius * 2
  return pygame.Rect((left, top), (width, height))

while True:
  old_x=x
  x-=4
  screen.fill(pygame.Color("black"),get_bbox(old_x,y))
  pygame.draw.circle(screen, color, (x, y), radius, 1)
  pygame.display.update([get_bbox(x,y),get_bbox(old_x,y)])
  clock.tick(fps)