Flicker?

Started by
1 comment, last by j_fish_ 20 years ago
Probably another dumb question (I feel sorta bad asking all sorts of really basic questions) but I''m trying to get some thick lines which span across the screen to have randomly placed holes in them. I have some code which I feel will complete the task but it wont let me see where the hole is cause it keeps flickering? I think that the program is just looping over and over and so its redrawing it. How would I go about changing it? The following is some of the code: glLineWidth(20.0); glColor3f(0.8f, 0.0f, 0.0f); random_integera = (rand()%251); random_integerb = -(rand()%280); random_integera = random_integera/100; random_integerb = random_integerb/100; choice = (rand()%2); if (choice == 0) random_integer = random_integera; else random_integer = random_integerb; glBegin(GL_LINES); glVertex3f(-4.0f, ycoor, 0.0f); glVertex3f(random_integer, ycoor, 0.0f); glVertex3f(random_integer+0.8f, ycoor, 0.0f); glVertex3f(4.0f, ycoor, 0.0f); glEnd(); ycoor = ycoor + 0.0003f;
Advertisement
First the flicker problem:
-> even if OpenGL normally does not exceed the fps of your desktop settings (default in graphic card settings is "vertical
synchronization" on by default -> between 60 and 100 Hz), every
change beyond 20Hz looks smooth to a human eye (therefore movies have about 25 - 29 fps).
=> the flickering will occur because the line changes more often than your eye can recognize -> flickering

The second thing is that you should not use rand() like "rand() % 2" - Especially not for small numbers after the modulo (%) operator. If you want to use the rand() function to decide between two states (0 or 1), use it like

int nState = rand () & 1L;

Which does the binary "AND" and therefore returns 0 or 1 (this resulting distribution is better than (rand() % 2)). There exists currently a thread about the rand() function.

I coded your example a bit different:
// --- global stuff ---double ycoor = 0;       // current y positiondouble ydir = 0.001;    // direction of movement (+ or -)double dGapPos;         // current position of our gap#define WAIT_STEPS 5    // steps until we change the gap posint    nWaitSteps = 0;  // change count down// --- render function ---  glLoadIdentity ();                 // default matrix  glTranslatef ( 0.0, 0.0, -0.5 );   // move a bit away  glLineWidth(5.0);                  // line width  glColor3f(0.8f, 0.0f, 0.0f);       // line color  ycoor = ycoor + ydir;              // change our line position  if ( (ycoor > 0.1) ||              // if we are out of this       (ycoor < -0.1) )              // box, change the direction  {                                  // of our movement    ydir *= -1.0;    // clear background              // and delete all lines,     glClear(GL_COLOR_BUFFER_BIT);    // -> nice effect  }  if (--nWaitSteps < 0)              // reduce our count down  {                                  // and check for zero    nWaitSteps = WAIT_STEPS;         // reset countdown    // generate random position between -0.5 and 0.5    dGapPos = rand ();               //draw a number [0,RAND_MAX]    dGapPos /= RAND_MAX;             // -> scale to [0.0,1.0]    dGapPos -= 0.5;                  // -> move to [-0.5, 0.5]  }  glBegin(GL_LINES);                 // draw the lines    // left line    glVertex3f ( -4.0f, ycoor, 0.0f );    glVertex3f (  dGapPos, ycoor, 0.0f );    // right line after gap    glVertex3f (  dGapPos + 0.3f, ycoor, 0.0f );    glVertex3f (  4.0f, ycoor, 0.0f );  glEnd();


Lord_Jake


x = rx ( 1 - x ) ; r > 3.5699
... and chaos may begin ...
x = rx ( 1 - x ) ; r > 3.5699... and chaos may begin ...
Hey thanks for the help. I will try that code out later. I figured out the flicker problem and found a more substantial problem. Using rand() doesn''t really give random numbers, if I have an srand() command to choose the seed or something like that it is more random. I just put the a test in front of the section of code where it generates the random number so it only goes through that the first time the bars get on the screen. Therefore the hole position stays the same until it is off the screen and then reset. I''m sure this code can be optimized but it works for now. Thanks again for the help. Quick example below where flicker is an int that has been set at 0 at the start of the program.

if (flicker == 0)
generate random number

flicker = 1;

This topic is closed to new replies.

Advertisement