CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C+OpenGL] programme très lent

iunity
iunity
Niveau 5
26 juin 2007 à 18:57:35

Bonjours à tous.

J´ai voulu fair un petit programme qui permettait d´afficher un mondu un peu comme dans le jeu "Versailles".
Pour ceux qui ne connaissent pas, le monde est simplement composé d´un cube texturé, à l´intérieur duquel se trouve la caméra. Les textures du cube sont spécialement prévues pour que depuis la caméra on ai l´impression d´être à l´intérieur d´un environnement vraiment en 3D (un peu comme une skybox).

J´ai donc fait un programme qui affiche un cube avec la caméra au centre. J´ai créé les textures sous Blender et j´affiche le tout à l´écran. Les flèches de direction permettent d´orienter la caméra (il reste encore quelques problèmes là dessus, mais ce n´est pas le sujet du poste).

Le code source est disponible ici (ca marche sous Linux, pour Windows il y a peut-être des bibliothèques à ajouter) :
http://rafb.net/p/bqkGjb10.html
Il se compile avec la ligne : gcc prog.c -o prog -lSDLmain -lSDL -L/usr/X11R6/lib -lGL -lGLU -lglut -lX11 -lm
Il nécessite également 6 images (image1.bmp à image6.bmp) qui doivent être dans le même dossier que l´exécutable.

Le programme est très lent. Pour vous je l´ai mis en 800x600, mais chez moi même en 320x240 j´arrive pas à avoir plus d´une image par seconde.
Je n´ai pas l´accélération graphique matérielle sur mon ordi, mais avec des programmes 3D simples comme glxgears j´arrive quand même à plus de 300 fps.
Je ne vois pas trop d´où peu venir le problème. Si quelqu´un a une idée, je le remercie par avance de bien vouloir m´en faire profiter.

iunity
iunity
Niveau 5
26 juin 2007 à 20:07:42

Ca ne marche pas. Ca compile mais quand j´exécute ça me mets le message "freeglut ERROR: Function <glutPostRedisplay> called without first calling ´glutInit´."
Le programme quitte et laisse le système en résolution 320x240.

godrik
godrik
Niveau 30
26 juin 2007 à 20:45:13

glut ? ce n´est pas obsolete, deprecated, nesurtoutpasutiliser ?

Noter, que mon nombre d´heure en programmation opengl ne dépasse pas les 100 donc prennez mes dires avec des pincettes...

Ca ne m´a pas l´air double bufferé, je m´etonne de voir : SDL_GL_SwapBuffers();

Comment sais tu que tu as tres peu de frame ? tu compte le nombre de passage dans la boucle ?

iunity
iunity
Niveau 5
26 juin 2007 à 20:58:26

Comment sais tu que tu as tres peu de frame ? tu compte le nombre de passage dans la boucle ? :d) Ca se voit lorsque le programme tourne que c´est très lent. A un moment j´avais aussi rajouté une ligne, dans la fonction drawGLScene(), qui m´affichait un truc dans la console à chaque rafraichissement de l´image.

Fvirtman
Fvirtman
Niveau 10
27 juin 2007 à 00:23:42

lesquale35 > les profs fonctionnent toujours avec glut, je sais, c´est honteux...
glut n´est plus maintenu depuis au moins 5 ans, si ce n´est + !

iunity > godrik souleve une remarque intéressante. Des fois, on croit avoir peu de frames, alors qu´on a juste un mouvement lent.
Un jour, je faisais descendre une balle, a 1 pixel par frame, je trouvais qu´elle allait lentement... et pourtant, j´allais a 50 FPS, et donc en 1 seconde, j´avançais de 50 pixels, ce qui est lent en haute résolution.

Ce que je te propose, c´est d´essayer mes tutos OpenGL (cf ma carte §3), ils ont été testés. Si ils sont lent chez toi, c´est que tu as un probleme de pilote de carte graphique. Vérifie déja cela ! :-)

dnob700
dnob700
Niveau 10
27 juin 2007 à 10:36:19

tu peut nous en dire plus sur ton système ? OS, carte graphique, pilote installé, bibliothèque utilisée, etc.

J´avais eu un problème du même genre sous linux, que j´avais corrigé en installant les bonne version des bibliothèque de développement OpenGL (mais je ne me souviens plus ce que j´avais changé précisément).

iunity
iunity
Niveau 5
27 juin 2007 à 11:10:22

Sur les conseils de Fvirtman j´ai modifié mon système de comptage de fps. En fait, il s´avère que le programme affiche les images par série puis se bloque et recommence. Par exemple, il va m´afficher 10 images d´un coup, puis plus rien pendant une seconde, puis de nouveau dix images d´un coup..
Dans mon programme, je rafraîchis l´affichage à chaque passage dans la boucle principale, même si rien n´a changé. Je l´ai modifié pour que l´image soit rafraîchie à chaque fois que je modifie l´angle de la caméra, et là c´est super fluide. J´ai un fps très bas, mais je n´ai une nouvelle image que quand j´en ai vraiment besoin, et de manière rapide

Sinon, pour répondre à dnob700, j´utilise actuellement Kubuntu 7.04 avec une carte graphique intégrée SiS (j´ai un ordinateur portable). J´ai le pilote installé par défaut.

Fvirtman
Fvirtman
Niveau 10
27 juin 2007 à 13:41:27

iunity > ce dont tu nous parles est une rustine (le fait d´afficher que quand tu modifies) : ça va bien pour un rendu souvent immobile, mais dans un jeu 3D, par exemple, comme normalement ça bouge tout le temps, le rendu se fait a chaque itération de ta boucle...

Il n´est pas normal que ton implémentation ne supporte pas ça.
Est ce que par hasard tu ne fais pas d´allocations de texture a chaque itération (remplissage de la VRAM), ou alors des erreurs du genre ?
Essaie mes tutos sur OpenGL, sur mon site, (essaie de le §3.3)pour déja etre sur, déja, de savoir si ça vient du l´installation de tes pilotes, ou bien de ton programme.

Kaoron
Kaoron
Niveau 9
27 juin 2007 à 13:48:06

Tentes aussi de voir la priorité de ton processus, si tu n´as pas d´acceleration 3D, c´est ton processeur qui prend la main, en mode fenétré avec d´autre processus tournants, ca peut donner un coup sévère à tes perfs quand le systeme jongle (et pas forcément donner des résultats de merde sur les fps de glxgears).

godrik
godrik
Niveau 30
27 juin 2007 à 14:00:40

a en croire le code qu´il a poster, il n´y a pas d´allocation dans la boucle.
Ce que tu peux faire, c´est mettre plus d´affichage pour voir ou ton programme bloque, ou utiliser un debuggeur au moment de "la pause".

iunity
iunity
Niveau 5
27 juin 2007 à 15:22:00

J´ai essayé le tuto 3.3 de Fvirtman, et ça fait la même chose. Ca rame beaucoup.

J´ai mis le processus en priorité maximale mais ça ne change rien.

Je vais essayer d´augmenter les données affichées pour trouver où ça peut poser problème.

Fvirtman
Fvirtman
Niveau 10
27 juin 2007 à 15:38:52

Installe Windows :oui:

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware