pourquoi GlutPostRedisplay et la fonction de veille ne fonctionne-t-elle pas dans ce code?

J’ai essayé d’implémenter le transfert de données entre usb et cpu dans ce projet. Le transfert de données est présenté sous la forme d’un petit rectangle se déplaçant d’un composant de l’ordinateur à un autre.

Dans le code ci-dessous, GlutPostRedisplay ne fonctionne pas.

Aussi, quelqu’un peut-il me dire si sleep () utilisé est correct car les fonctions appelées dans display ne fonctionnent pas de manière synchronisée. casing () n’est jamais exécuté. Après fisrtscreen (), il passe directement à open () et oper () ne fonctionne pas.

quelle est l’erreur avec ce code ??

void operate() { URLTEXTX = 200; URLTEXTY = 950; displaySsortingng(READUSB,1); //southbrigde to northbrigde bottom(488.0,425.0,380.0); back(488.0,188.0,380.0); top(188.0,380.0,550.0); //northbridge to cpu front(230.0,350.0,595.0); top(345.0,600.0,650.0); //read from usb back(700.0,625.0,465.0); bottom(625.0,460.0,385.0); back(620.0,525.0,390.0); sleep(1); URLTEXTX = 200; URLTEXTY = 950; displaySsortingng(WRITEUSB,1); //cpu to northbridge bottom(350.0,650.0,595.0); back(350.0,230.0,600.0); //northbridge to southbridge bottom(188.0,550.0,380.0); front(188.0,488.0,380.0); top(483.0,380.0,425.0); //write to usb front(525.0,625.0,385.0); top(625.0,385.0,460.0); front(620.0,700.0,460.0); sleep(1); URLTEXTX = 200; URLTEXTY = 950; displaySsortingng(READDVD,1); //read from dvd back(600.0,560.0,810.0); bottom(570.0,810.0,600.0); back(560.0,525.0,610.0); //ram to northbridge back(450.0,230.0,580.0); //northbridge to cpu front(230.0,350.0,595.0); top(345.0,600.0,650.0); sleep(1); URLTEXTX = 200; URLTEXTY = 950; displaySsortingng(WRITEDVD,1); //cpu to northbridge bottom(350.0,650.0,595.0); back(350.0,230.0,600.0); //northbridge to ram front(230.0,450.0,580.0); //write to dvd front(525.0,570.0,600.0); top(570.0,600.0,800.0); front(560.0,600.0,800.0); sleep(1); URLTEXTX = 200; URLTEXTY = 950; displaySsortingng(READHD,1); //read from hard disc back(640.0,560.0,300.0); top(560.0,300.0,530.0); back(560.0,525.0,530.0); //ram to northbridge back(450.0,230.0,580.0); //northbridge to cpu front(230.0,350.0,595.0); top(345.0,600.0,650.0); sleep(1); URLTEXTX = 200; URLTEXTY = 950; displaySsortingng(WRITEHD,1); //cpu to northbridge bottom(350.0,650.0,595.0); back(350.0,230.0,600.0); //northbridge to ram front(230.0,450.0,580.0); //write to hard disc front(525.0,560.0,530.0); bottom(560.0,530.0,300.0); front(560.0,640.0,300.0); sleep(1); } void front(GLfloat x1,GLfloat x2,GLfloat y1)//to move in forward direction { GLfloat i; for(i=x1;i=x2;i--) { drawbit(i,i-5,y1,y1-5); glutPostRedisplay(); } } void top(GLfloat x1,GLfloat y1,GLfloat y2)//to move in upward direction { GLfloat i; for(i=y1;i=y2;i--) { drawbit(x1,x1-5,i,i-5); glutPostRedisplay(); } } void drawbit(GLfloat x1,GLfloat x2,GLfloat y1,GLfloat y2) { glBegin(GL_POLYGON); glColor3f(1.0,1.0,1.0); glVertex2f(x1,y1); glVertex2f(x2,y1); glVertex2f(x2,y2); glVertex2f(x1,y2); glEnd(); glFlush(); } void display() { glClear(GL_COLOR_BUFFER_BIT); firstscreen(); //introduction to the project sleep(3); glClear(GL_COLOR_BUFFER_BIT); casing(); //cpu case sleep(2); glClear(GL_COLOR_BUFFER_BIT); opened(); //when cpu case is opened shows internal components sleep(1); operate(); //data transfer between various components } 

Le problème est similaire à ceci: Faire une pause dans OpenGL successivement

glutPostRedisplay définit simplement un indicateur saturé pour appeler votre rappel d’affichage sur la boucle suivante. En réalité, cela ne dessine rien.

La fonction que je suppose que vous recherchez est glutSwapBuffers . Sans double tampon, la géomésortinge est dessinée directement à l’écran (bien que les commandes “dessiner” du GPU soient mises en tampon pour lesquelles vous voudriez glFlush ). Cela provoque généralement un scintillement car vous voyez des choses qui sont ensuite couvertes par une géomésortinge plus proche (à cause du tampon de profondeur). La mise en mémoire tampon double résout ce problème en effectuant un rendu dans une mémoire tampon hors écran, puis en affichant le résultat en une fois. Assurez-vous que GLUT_DOUBLE est passé à glutInit pour que vous ayez un tampon de retour.

Pendant que vous sleep() , votre application ne pourra ni capturer ni traiter les événements. Disons que vous voulez fermer la fenêtre. Jusqu’à ce que le sumil revienne, tout sera insensible. Un sumil peut toujours être important pour ne pas encombrer votre processeur. Je séparerais ces concepts.

  1. Boucle / interrogation avec une fonction de idle jusqu’à ce que votre délai soit écoulé. Ensuite, appelez glutPostRedisplay . Ajoutez glutSwapBuffers à display si vous utilisez une double mise en mémoire tampon.
  2. Ecrivez un limiteur de framerate qui appelle le sumil pour ne pas avoir de cycle.

Une méthode simple pour dessiner différentes choses après des délais définis consiste à écrire une petite machine à états …

 int state = STATE_INIT; float timer = 0.0f; void idle() { //insert framerate limiter here //calculate time since last frame, perhaps using glutGet(GLUT_ELAPSED_TIME) float deltaTime = ... timer -= deltaTime; if (timer < 0.0f) { switch (state) { case STATE_INIT: state = STATE_DRAW_FIRST_THING; timer = 123.0f; ... } glutPostRedisplay(); } } void display() { ... if (state == STATE_DRAW_FIRST_THING) { ... } ... glutSwapBuffers(); } 

À mesure que votre application grandira, je doute que ce soit facile à maintenir et que vous souhaitiez quelque chose de plus robuste, mais jusque-là, c'est un bon début.

void (*currentView)(void); simplement un void (*currentView)(void); la fonction de rappel en idle permettrait d’économiser du code en cours d’ display . Vous souhaiterez peut-être créer une machine à états orientée object. Au-delà des états booléens, vous souhaiterez peut-être examiner l'animation et l'interpolation d'images clés. Plutôt que de tout coder en dur, le stockage de la géomésortinge, des images clés et des séquences d'états dans un fichier est un moyen agréable de séparer le code et les données. XML est très agréable à utiliser car vous utilisez une bibliothèque.