10
votes

Manière facile d'afficher une image de mise à jour continue en C / Linux

Je suis un scientifique qui est assez à l'aise avec C pour calcul numérique, mais j'ai besoin d'aide pour afficher les résultats. Je souhaite pouvoir afficher une bitmap de manière continue mise à jour dans une fenêtre, ce qui est calculé à partir de données en temps réel. J'aimerais pouvoir mettre à jour l'image assez rapidement (par exemple, 1 image / seconde, de préférence 100 fps). Par exemple:

char image_buffer[width*height*3];//rgb data
initializewindow();

for (t=0;t<t_end;t++)
{
   getdata(data);//get some realtime data
   docalcs(image_buffer, data);//process the data into an image
   drawimage(image_buffer);//draw the image
}


0 commentaires

5 Réponses :


7
votes

Gui Stuff est une roue régulièrement réinventée et il n'y a aucune raison de ne pas utiliser un cadre.

Je recommanderais d'utiliser qt4 ou wxwidgets. Si vous utilisez Ubuntu, GTK + suffira au fur et à mesure que cela parle de gnome et peut être plus confortable pour vous (qt et wxwidgets nécessitent les deux C ++).

regarder GTK + , qt et wxwidgets .

Voici les tutoriels pour tous les 3:


0 commentaires


2
votes

En plus de la réponse de JED Smith, il existe également des cadres de niveau inférieur, comme OpenGL, qui est souvent utilisé pour la programmation de jeux. Étant donné que vous souhaitez utiliser un taux élevé de trafics, je considérerais quelque chose comme ça. GTK et similaires ne sont pas principalement destinés aux écrans de mise à jour rapide.


1 commentaires

Je pense que vous aurez besoin de quelque chose avec OpenGL pour gérer l'ouverture d'une fenêtre, et je pense que SDL est un bon choix là-bas. Je vous suggère de commencer avec SDL, (avec le programme de mise sur la mise à jour ou du code de retournement décrit dans d'autres réponses), si cela n'est pas assez rapide, essayez les appels OpenGL à partir du cadre SDL.



9
votes

Je recommanderais aussi SDL. Cependant, il y a un peu de compréhension que vous devez vous rassembler si vous souhaitez écrire des programmes rapides, et ce n'est pas la chose la plus facile à faire.

Je suggérerais Cet article O'Reilly comme point de départ.

mais je vais réduire les points les plus importants de une perspective de calcul.

double tampon

Quel appels SDL "Double tampon" est généralement appelé PAGE Tournant .

Ceci signifie essentiellement Que sur la carte graphique, il y a deux morceaux de mémoire appelés pages , chacun suffisamment grand pour contenir des données d'écran. L'une est rendue visible sur le moniteur, l'autre est accessible par votre programme. Lorsque vous appelez sdl_flip () , la carte graphique commute leurs rôles (c'est-à-dire que le visible devient accessible au programme et vice versa).

L'alternative est, plutôt que d'échanger les rôles des pages, copiez plutôt les . Data à partir de la page accessible au programme à la page Monitor (en utilisant sdl_updaterect () ).

La page à rebondissement est rapide, mais a un inconvénient: après la basculement de la page, votre programme est présenté avec un tampon contenant les pixels de 2 images. Ceci va bien si vous devez recalculer chaque pixel chaque image.

Toutefois, si vous n'avez besoin que de modifier les petites régions de l'écran, chaque image et que le reste de l'écran n'a pas besoin de changer, alors < Code> Mise à jour peut être une meilleure façon (voir aussi: sdl_updaterects ( ) ).

Ceci dépend bien sûr de ce que vous êtes informatique et comment vous le visualisez. Analysez votre code générateur d'image - vous pouvez peut-être le restructurer pour obtenir quelque chose de plus efficace?

Notez que si votre matériel graphique ne prend pas en charge la page à rebours de la page, SDL utilisera gracieusement l'autre méthode pour vous .

logiciel / matériel / openGL

C'est une autre question que vous rencontrez. Fondamentalement, les surfaces logicielles vivent dans la RAM, les surfaces matérielles vivent dans la RAM vidéo et les surfaces OpenGL sont gérées par Magic OpenGL.

Selon la version du matériel, du système d'exploitation et de la SDL, modifiant programme de manière programmative les pixels d'une surface matérielle. Peut impliquer beaucoup de copier de la mémoire (VRAM à RAM, puis de retour!). Vous ne voulez pas que cela se produise chaque cadre. Dans de tels cas, les surfaces logicielles fonctionnent mieux. Mais alors, vous ne pouvez pas tirer parti de la double tampon, ni des blits accélérés matériels.

Les blits sont des copies de blocs de pixels d'une surface à une autre. Cela fonctionne bien si vous voulez dessiner beaucoup d'icônes identiques sur une surface. Pas si utile si vous générez une carte de température.

OpenGL vous permet de faire beaucoup plus avec votre matériel graphique (accélération 3D pour un démarrage). Les cartes graphiques modernes ont beaucoup de puissance de traitement, mais il est un peu difficile à utiliser à moins que vous fabriquiez une simulation 3D. Le code d'écriture pour un processeur graphique est possible mais très différent de l'ordinaire c.

Démo

Voici un programme SDL de démonstration rapide que j'ai fait. Ce n'est pas censé être un exemple parfait et peut avoir des problèmes de portabilité. (Je vais essayer de modifier un meilleur programme dans cet article lorsque j'ai le temps de passer du temps.) xxx


1 commentaires

Votre macro "pel" ne semblait pas mettre les pixels corrects au bon endroit. Cependant, le reste m'a mis sur la bonne voie. Merci.



0
votes

Dans mon expérience XLIB via l'extension MIT-SHM a été significativement plus rapide que les surfaces SDL, je ne suis pas sûr que j'ai utilisé SDL de la manière la plus optimale cependant.


0 commentaires