IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

[VNC] Comment font-ils (ou elles) ?


Sujet :

Algorithmes et structures de données

  1. #1
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut [VNC] Comment font-ils (ou elles) ?
    Bonsoir à toutes et tous,

    Je "m'amuse" à faire une sorte de VNC.

    Je hook donc certains messages pour détecter les zones qui ont changé, et j'envoie ces changements de la façon la plus concise possible au PC controlleur. J'ai tenté de reproduire (relativement fidèlement je crois) le protocole RFB. Je ne détaille donc pas.

    Ceci dit, je suis loin d'etre aussi performant qu'un VNC comme UltraVNC par exemple. Je cherche donc à optimiser cela. Et donc j'épluche le code d'UltraVNC, même si je ne suis pas particulièrement famillier avec le C++

    Lorsqu'UltraVNC reçoit une zone à mettre à jour, au lieu de l'envoyer lorsque cela est demandé, il me semble qu'une optimisation est faite pour n'envoyer que les (sous-)zones qui ont réellement changé.

    Le principe ok. Maintenant, la facon de s'y prendre, l'algo, je ne le saisis pas. Il me semble que c'est la fonction "FastDetectChanges" dans "vncdesktop.cpp". Je n'en comprends pas le principe : certes on découpe la zone en blocs de 32x32 pixels, mais que viennent faire là les histoires de "shifting", ces décalages (4 pixels je crois) répétés ?

    Est-ce que quelqu'un(e) est assez calé(e) "en VNC" pour m'expliquer comment doit fonctionner cet algo (sur le principe, après le codage je me débrouille). Je suis aussi preneur de toute suggestion éclairée.

    Merci d'avance.
    « La simplicité est la sophistication suprême » (Léonard de Vinci)

  2. #2
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    ce que tu dit m'interresse, je suis en train de "tenter" d'en developper un...

    je pensait pas hooker de paertout, mais plus envoyer
    1/ une BMP de l'ecran
    2/ ensuite avec un XOR compressé une carte des bits changés...


    mais surtout ce qui m'interresse : t'a utilisé quelles bibliotheques?

    je suis totalement newbee, et je pensait utiliser SDL + WxWidgets
    (sdl : evenementiel + affichage, et WxWidget : reseau et interface)
    ...

  3. #3
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    Salut hansaplast,

    J'ai eu la meme réflexion que toi, sans pour autant m'en satisfaire, car cela necessite un thread qui tourne sans cesse pour détecter des changements. Ceci dit je m'y suis peut-être mal pris. Je serais curieux de savoir comment tu t'en sors.

    J'en suis arrivé aux hooks pour être notifié des changements pour ne pas faire bosser mon appli continuellement, mais bon je n'en suis pas pleinnement satisfait car je ne suis pas aussi rapide qu'UltraVNC (d'ou ce fil...)

    L'idéal serait d'être notifié de ce que dessine le pilote graphique et donc du coup de le "dessiner" aussi à distance. C'est le principe du video driver utilisé notament par les gars d'UltraVNC. Le seul défaut est que cela ne fonctionne que sous XP/2000 (ce qui peut être suffisant).

    Tu peux donc largement t'inspirer d'UltraVNC, qui fonctionne à merveille. Ceci dit essaye aussi d'avoir une réflexion par toi même car tu pourrais très bien trouver une idée géniale.

    Pour info, en plus des hooks, j'ai tenté d'ajouter un algo simple de détection des zones ayant réellement changé (par découpage), et bien que mon algo ne soit pas trop gourmand en pross me semble-t-il (mais je peux me tromper), cela fesait trop chauffer le CPU, j'ai donc abandonné (temporairement).

    Tiens ça peut bien aider : sur le forum d'UltraVNC j'ai trouvé cette discussion contenant quelques idées et explications : http://forum.ultravnc.net/viewtopic.php?t=2393&view=previous
    Si tu comprends quelquechose, je serais heureux que tu en fasses part ici ! (je n'arrive pas à saisir le principe de décalage dont ils parlent et cela m'intrigue !)

    Voilà pour mon modeste coup de pouce de principe.

    Si tu (ou d'autres) comprends les optimisations d'UltraVNC, ou si tu réfléchis à un principe ou une optimisation interessante, n'hésite pas à revenir en parler sur ce fil, je le laisse ouvert pour cela. Je ferai bien entendu de même réciproquement.

    Concernant les bibliothèques, je ne puis t'aiguiller puisque je développe en Delphi.

    Allez bon dev'

    À+
    « La simplicité est la sophistication suprême » (Léonard de Vinci)

  4. #4
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    bien le bonjour,

    la doc sur le fonctionement d'un serveur x (ici) permet d'imaginer le fonction d'un VNC, en effet, le cahier des charges specifiait que les calculs, les entrees (clavier souris) et l'affichage doivent pouvoir se faire sur des machines differentes sur un reseau.

    L'une des grandes problematique d'un serveur x est donc de transferer le contenu d'un ecran sur un reseau sans pour autant envoyer une "video" trop gourmande en bande passante.

    Cette doc ne vous donnera pas un code magique qui vous ecrira ce VNC, mais il me semble que c'est une lecture interessante et pertinente dans le cadre du developpe;ent d'un VNC, ne serait-ce que pour s'impregnier de la philosophie. Et ca ne peut qu'apporter de nouvelles idees.

  5. #5
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    Ta suggestion de lecture me semble judicieuse. C'est tellement mieux quand c'est "pensé pour" à la base.

    Je vais étudier ça, merci bien.
    « La simplicité est la sophistication suprême » (Léonard de Vinci)

  6. #6
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    En ce qui concerne le partage de l'affichage sur le réseau, en effet un serveur X est sans égal, puisque fondamentalement pensé pour. J'aurais rêvé qu'il en soit de même pour M$ Windows, mais ça ne l'est bien pas (du tout).

    La "clé" de l'efficacité d'un serveur X tient je crois, suite à la lecture de la doc proposée, dans ces quelques lignes :

    Citation Envoyé par X11 Concept et Architecture
    Plutôt que d’envoyer toutes les information graphiques de l’écran, X propose d’envoyer uniquement la commande graphique (trace de ligne, affichage de texte,...) et de le faire effectuer par la machine distante (console).
    Ce que j'en comprends c'est : au lieu de bêtement d'envoyer "du bitmap" (peu importe l'efficacité de la compression et de la détection de changements), X a été pensé à la base pour envoyer "du vectoriel" (des commandes quoi), c'est bien sûr infiniment et incomparablement plus efficace...

    Pour revenir à notre problème, comment faire avec Windows, pour être notifié des commandes d'affichage (attention j'affiche tel texte là, attention j'affiche telle chose ici, etc...) ? Il ne me semble pas que les messages windows fassent tout......

    Des suggestions ? (question à poser dans le forum windows probablement)
    « La simplicité est la sophistication suprême » (Léonard de Vinci)

  7. #7
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    de mon coté, je n'ait guere avancé, etant debutant, je me demene avec WxWidgets, et autres...

    de mon coté, je pense faire un petit soft tout simple, non optimisé selon les OS, donc, je vous lirait avec hardeure, mais je ne pense pas vous donner des nouvelle de mon projet honteusement mauvais :'(

    bonne chance

    et merci de ces partages d'info

    edit :
    Tiens ça peut bien aider : sur le forum d'UltraVNC j'ai trouvé cette discussion contenant quelques idées et explications : http://forum.ultravnc.net/viewtopic.php?t=2393&view=previous
    Si tu comprends quelquechose, je serais heureux que tu en fasses part ici ! (je n'arrive pas à saisir le principe de décalage dont ils parlent et cela m'intrigue !)
    de ce que j'ai compris : ils parlent de detecter un scrolling (le fait, par exemple de faire "monter" ou "descendre" la barre d'ascenseur d'internet explorer... pour ce faire, il faut decouper l'ecran en plusieures parties, et les comparer a l'image precedente...
    si je susi po assez clair, redemande moi, (il me semble vraiment que c'est ca...)

    nouvel edit :

    Lorsqu'UltraVNC reçoit une zone à mettre à jour, au lieu de l'envoyer lorsque cela est demandé, il me semble qu'une optimisation est faite pour n'envoyer que les (sous-)zones qui ont réellement changé.

    Le principe ok. Maintenant, la facon de s'y prendre, l'algo, je ne le saisis pas. Il me semble que c'est la fonction "FastDetectChanges" dans "vncdesktop.cpp". Je n'en comprends pas le principe : certes on découpe la zone en blocs de 32x32 pixels, mais que viennent faire là les histoires de "shifting", ces décalages (4 pixels je crois) répétés ?
    donc, je le re-dit : je pense que c'est pour detecter de nouvelle zone "fixes" masi ayant bougées (ayant subit un scroll = un mouvement = un decalage vers le haut, par exemple...)

  8. #8
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    bon, je ne suis qu'un noob, donc, j'ai tres peu avancé...
    je vient de finir ma partie client serveur...

    donc, maitenant, je m'interesse a la gestion de la sourie...

    je sait envoyer des messages a windows, afin de simuler un deplacement (enfin, j'ai trouvé un tuto la dessus) par contre, je ne sait pas le faire en multi OS...

    j'utilise wxwidgets, et vait etre obligé d'utiliser une fonction de QT...
    pour le graphisme, je pensait utiliser la SDL... (ca fait lourd, je sait)

    avez vous des connaissance, permettant dans l'un ou l'autre de ces biblio, ou une autre, d'envoyer des evenements a l'os?

    savez vous comment fonct l les autre VNC?

    milles mercis!

  9. #9
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    Salut hansaplast,

    Citation Envoyé par hansaplast
    pour ce faire, il faut decouper l'ecran en plusieurs parties, et les comparer a l'image precedente...
    si je susi po assez clair, redemande moi, (il me semble vraiment que c'est ca...)
    En effet, je suis d'accord avec toi sur cette description de principe de FastDetectChanges.

    Mais je vois bien qu'il y a plus à comprendre, il me semble qu'il y a un décalage, et que tous les pixels ne sont pas testés. C'est ce que je ne saisis pas.
    J'aimerais donc en comprendre le fonctionnement précis, independemment de l'implementation, disons niveau algo :
    Exemple :
    "On a en entrée une liste de fenetres, un bitmap contenant l'ecran à l'instant t-1, un nouveau bitmap à l'instant t, on découpe un quadrillage, et pour chaque carré on test tels pixels, puis ensuite on décale pour que nianinainia.... , on redécoupe, puis...."

    Citation Envoyé par hansaplast
    j'utilise wxwidgets, et vait etre obligé d'utiliser une fonction de QT...
    pour le graphisme, je pensait utiliser la SDL... (ca fait lourd, je sait)
    Je ne développe pas avec ces outils, je ne te serai donc d'aucune utilité niveau implémentation.

    Par contre, sur le principe, je te fais partager mon état d'avancement :

    Je passe beaucoup de temps à l'optimisation de mon code, et je suis à présent satisfait de l'implémentation. L'amélioration théorique qu'il me reste à faire est la détection de déplacement justement.

    Il y a deux façons, je crois, d'aborder le pb : détection des messages windows, et réaction en conséquence, ou détection purement graphique. Il me semble que FastDetectChanges a choisi la seconde solution. Pour le moment, je cherche du côté de la première, sans résultat significatif.

    Toute suggestion ou éclaircissement sont les bienvenus !
    « La simplicité est la sophistication suprême » (Léonard de Vinci)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment qu'ils font ?
    Par zecreator dans le forum La taverne du Club : Humour et divers
    Réponses: 3
    Dernier message: 04/01/2015, 10h31
  2. Google Pac-Man : comment font-ils ?
    Par Christophe P. dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 25/05/2010, 11h58
  3. labrute.fr mais comment font-ils ?
    Par Charlie111 dans le forum Débuter
    Réponses: 1
    Dernier message: 10/02/2009, 09h40
  4. Chargement de page deezer - comment font ils ?
    Par Tricky-ft dans le forum Flash/Flex
    Réponses: 4
    Dernier message: 02/02/2009, 15h28
  5. [Technique] Index, comment font les moteurs de recherche ?
    Par bat dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 25/10/2002, 15h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo