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

DirectX Discussion :

DirectX et les images jpg, png et bmp


Sujet :

DirectX

  1. #1
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 141
    Points
    11 141
    Par défaut DirectX et les images jpg, png et bmp
    bonjour,


    pour le travail j'utilise une application qui implémente des fonctions directX pour afficher des images 2D et 3D.
    Je me suis aperçu que les temps de chargement de ces images variaient considérablement d'un format à l'autre !


    Les images testées font toutes 800x600 pixels.
    • Avec une bitmap 24 bits, le temps de chargement est très court bien que le fichier soit volumineux (1,4Mo) ;
    • Avec une images 8 bits indexée, le temps de chargement s'allonge ;
    • Avec les formats jpg et png c'est catastrophique


    Je n'ai plus en tête ces temps de chargement au moment où je poste le message mais ils varient pratiquement du simple au double.
    Je précise que dans mon cas ces durées sont critiques : un temps de chargement supérieur à 30ms est considéré comme "long".


    1- Pourquoi les temps de chargement des images varient considérablement d'un format à l'autre ?
    Est-ce inhérent à directX, à l'application qui implémente ces fonctions ou à la carte graphique ?


    2- J'ai vu que pour le format jpg, je pouvais créer des images entrelacées ou désentrelacées. Est-ce que directX ou la carte vidéo gère différemment des ces deux types d'images ? Si oui comment ?


    Pour info :
    je travaille avec Windows XP, carte graphique Quadro FX 550, deux écrans LCD en 1280x1024 à 60Hz.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 394
    Points : 5 005
    Points
    5 005
    Par défaut
    bonjour,

    alors déjà il faut voir qu'à la base les bmp, png et jpg ne sont pas du tout stockés pareil :

    - le bmp est un simple header suivi d'un tableau de valeurs qui représente directement la valeur pour chaque pixel de ton image -> le cout de décodage de l'information est nul

    - le jpg est nettement plus compliqué : http://fr.wikipedia.org/wiki/JPEG#La_compression_JPEG
    sur le schéma, en bas de droite à gauche, on voit tout de suite la teneur en calcul de la lecture d'un jpg

    - j'ai pas de schéma pour le png, mais de toute façon c'est plus couteux en temps de calcul que le bmp.

    donc même si on doit lire un "gros" bmp, le cout de lecture peut être considéré comme gratuit, à l'inverse des 2 autres qui doivent subir une décompression et une ré-interprétation des données.

    et finalement que ça soit directx, la cg ou une bibliothèque tierce, à résolution équivalente, un bmp sera plus rapide à chargé qu'un png ou jpg.
    (bien sur dans le cas ou la vitesse de lecture d'un fichier sur le disque ne devienne pas handicapant)

    pour l'entrelacement je sais pas.

  3. #3
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 141
    Points
    11 141
    Par défaut
    Citation Envoyé par stardeath Voir le message
    et finalement que ça soit directx, la cg ou une bibliothèque tierce, à résolution équivalente, un bmp sera plus rapide à chargé qu'un png ou jpg.
    (bien sur dans le cas ou la vitesse de lecture d'un fichier sur le disque ne devienne pas handicapant)
    ok il semblait bien que c'était la décompression des images qui posait problème...

  4. #4
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par Auteur Voir le message
    ok il semblait bien que c'était la décompression des images qui posait problème...
    Il y a deux paramètres à prendre en compte : la vitesse de décompression et la place mémoire occupée par le stockage de masse.

    Stocker toutes les images sous forme BMP pour les textures n'est pas réaliste le plus souvent (sauf pour le plus simple des jeux.. et encore là c'est une mauvaise utilisation des ressources) à cause de la place prise sur le disque dur ou le DVD. Mais en même temps stocker sous forme de JPEG peut rendre le chargement long.. et c'est encore un plus gros problème si les textures doivent être chargées en continu pendant le jeu (monde ouvert ou, simplement, pas assez de RAM disponible pour faire tenir un niveau de détail correct)ou sur un système avec des capacités de décompression réduites (console ?).

    Ceci dit il y a des intermédiaires. Par exemple les jeux actuels utilisent des textures au format DXTC (un dérivé du S3TC). Le format DXTC s'il est compressé à l'avance peut prendre moins de place qu'un BMP simple et être quasi immédiat à décompresser (la décompression se fait en temps réel par la carte graphique).

    Mais même le DXTC peut encore être trop volumineux pour certains supports/types de jeux. Par exemple Quake Wars utilisait une seule grosse texture pour tout le terrain de jeu et ne pouvait pas stocker sous forme DXTC parce que c'était encore trop gros (le nombre de DVD était un problème mais aussi la vitesse de transfert depuis le DVD). Ils ont donc réimplémenté une variante de JPEG (block compression, discrete cosine transform, runlength encoding et huffman) mais optimisé pour la vitesse de décompression et dans un espace de couleur adapté à leur "monde".

    Bref il y a sans doute beaucoup à faire, et beaucoup dépend du type de jeu envisagé et des contraintes (limité par les temps d'accès DVD ? par la puissance du processeur central ? Décodage possible et/ou natif sur le GPU ?)/

    LeGreg

  5. #5
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 141
    Points
    11 141
    Par défaut
    Le logiciel en question n'est pas pour réaliser des jeux

    Il ne gère que des images bmp, jpg, tif et png. Pour les objets 3D on peut définir une image parmi les formats supportés comme texture.

    Ce qui me surprend quand est que le temps de chargement d'une image est lié uniquement à directX, la carte graphique n'a visiblement aucun rôle là dedans ?

  6. #6
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par Auteur Voir le message
    Le logiciel en question n'est pas pour réaliser des jeux
    Les règles d'optimisation sont les mêmes pour les logiciels de jeu et les autres. Si c'est lent dans un cas ce sera lent dans l'autre.

    Citation Envoyé par Auteur Voir le message
    Il ne gère que des images bmp, jpg, tif et png. Pour les objets 3D on peut définir une image parmi les formats supportés comme texture.

    Ce qui me surprend quand est que le temps de chargement d'une image est lié uniquement à directX, la carte graphique n'a visiblement aucun rôle là dedans ?
    Tout dépend ce qui domine le temps de chargement. En général ce sont soit les accès au disque (ou autre mémoire de masse), soit les calculs (de décompression). Mais si l'image était déjà décompressée en mémoire (pour être chargée en mémoire graphique de manière opportune) alors parfois le transfert par le bus PCI-E peut avoir une importance non négligeable (voire être le point d'étranglement et causer des micro-saccades).

    Il est aussi envisageable de faire la phase de décompression sur la carte graphique (DirectCompute va dans ce sens). Et là la puissance de calcul de la carte graphique aura une importance plus ou moins grande.

    M'enfin dans ton cas, ton problème parait assez théorique sauf si tu as accès au code source de ton programme et que tu peux le modifier pour l'améliorer (ou si tu as accès direct au développeur et lui faire des suggestions pour la prochaine version)..

  7. #7
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 386
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 386
    Points : 20 476
    Points
    20 476
    Par défaut
    Citation Envoyé par Auteur Voir le message
    Il ne gère que des images bmp, jpg, tif et png. Pour les objets 3D on peut définir une image parmi les formats supportés comme texture.

    Ce qui me surprend quand est que le temps de chargement d'une image est lié uniquement à directX, la carte graphique n'a visiblement aucun rôle là dedans ?
    C'est normal !
    Pour charger une jpg il faut la décompresser la décoder il faut faire un arbre de Huffman je crois.

    http://www.ijg.org/

    Tandis que pour lire une bmp c'est tout bête : il faut lire l'entête avec un simple fread ( de 128octets) lire au besoin la palette de couleurs et lire le reste qui n'est qu'un gros bloc de triplets r g b .

    http://www.cplusplus.com/src/

    Donc si tu fais un simple fread ou même une API de Windows pour lire un fichier cela va se faire très vite !
    Cela se comprend parfaitement que le temps de lecture d'une jpg soit plus long qu'une bmp.
    En plus quand tu lis une bitmap il faut au besoin aligner les octets composant la teinte R G B avec un format compatible pour la carte graphique.


    Citation Envoyé par Auteur Voir le message
    2- J'ai vu que pour le format jpg, je pouvais créer des images entrelacées ou désentrelacées. Est-ce que directX ou la carte vidéo gère différemment des ces deux types d'images ? Si oui comment ?
    A ma connaissance non le format de fichier fut-il Png ou Jpg c'est en amont ; Direct X doit toujours décompresser et décoder la bitmap ; si tu veux afficher une bitmap avec le GDI il faut d'abord la décoder pour en faire un bloc d'octets compatible avec le mode d'affichage et la carte graphique.
    La carte graphique elle ne connait que des octets pour la couleur.
    Avec les API win32 il n'ya rien en natif pour lire une jpeg c'est à toi de fournir le code pour pouvoir la décoder

  8. #8
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 141
    Points
    11 141
    Par défaut
    si c'est directX qui gère les images quel est le rôle de la carte graphique (en dehors d'afficher) ?


    Que fait directX et que fait la carte graphique ?
    Quels sont leurs rôles respectifs ?

  9. #9
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 386
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 386
    Points : 20 476
    Points
    20 476
    Par défaut
    Citation Envoyé par Auteur Voir le message
    si c'est directX qui gère les images quel est le rôle de la carte graphique (en dehors d'afficher) ?

    Que fait directX et que fait la carte graphique ?
    Quels sont leurs rôles respectifs ?
    Salut Auteur eh bien c'est tout simple Direct X c'est une sorte d'interface entre l'OS et la machine , le programmeur et le hardware.
    Toi en tant que programmeur tu programmes des commandes ( instructions Direct3d , méthodes d'interface, langage HLSL pour les shaders etc..) et Direct X va s'arranger pour traduire cela en bas niveau je suppose via le Device Driver de la carte afin que le processeur de la carte graphique puisse comprendre..
    par exemple lors d'un appel à pd3dDevice->SetTransform(D3DTS_VIEW, ViewMatrix); le processeur de la carte graphique sait qu'il faut effectuer des transformations sur la matrice définissant celle de l'espace vue

    Citation Envoyé par Auteur Voir le message
    si c'est directX qui gère les images quel est le rôle de la carte graphique (en dehors d'afficher)
    eh bien Direct X s'occupe de lire soit une bmp ou bien une Png, jpeg etc...
    une fois la décompression effectuée, on obtient une sorte d'image "brute" qui sera placée et stockée dans la mémoire vidéo de la carte.
    Ceci dit j'ai peut-être un peu tort parce que peut-être que le GPU des cartes graphiques actuelles possèdent des instructions pour décompresser automatiquement des jpeg ou autres..
    mais cela on n'a pas à s'en occuper, Direct X doit le savoir et doit détecter si la carte est capable de le faire ou non

    Computational functions
    Modern GPUs use most of their transistors to perform calculations related to 3D computer graphics. They were initially used to accelerate the memory-intensive work of texture mapping and rendering polygons, later adding units to accelerate geometric calculations such as the rotation and translation of vertices into different coordinate systems. Recent developments in GPUs include support for programmable shaders which can manipulate vertices and textures with many of the same operations supported by CPUs, oversampling and interpolation techniques to reduce aliasing, and very high-precision color spaces. Because most of these computations involve matrix and vector operations, engineers and scientists have increasingly studied the use of GPUs for non-graphical calculations.

    In addition to the 3D hardware, today's GPUs include basic 2D acceleration and framebuffer capabilities (usually with a VGA compatibility mode).

    [edit] GPU accelerated video decoding
    Most GPUs made since 1995 support the YUV color space and hardware overlays, important for digital video playback, and many GPUs made since 2000 also support MPEG primitives such as motion compensation and iDCT, this process of hardware accelerated video decoding, where portions of the video decoding process and video post-processing are offloaded to the GPU hardware, is commonly referred to as "GPU accelerated video decoding", "GPU assisted video decoding", "GPU hardware accelerated video decoding" or "GPU hardware assisted video decoding".
    [ame]http://en.wikipedia.org/wiki/Graphics_processing_unit[/ame]

  10. #10
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 141
    Points
    11 141
    Par défaut
    Merci pour toutes ces explications

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

Discussions similaires

  1. [Toutes versions] Insérer les images "jpg" d'un répertoire
    Par Heureux-oli dans le forum Contribuez
    Réponses: 0
    Dernier message: 20/01/2015, 10h01
  2. [AC-2003] Image jpg, png non reconnus
    Par mercatog dans le forum IHM
    Réponses: 1
    Dernier message: 13/07/2009, 15h08
  3. Entêtes Des IMAGES JPG, PNG
    Par bs.box dans le forum Langage
    Réponses: 2
    Dernier message: 13/11/2008, 10h38
  4. DirectX, récupérer les images d'une vidéo
    Par edid dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 18/01/2007, 19h05
  5. Copier toute les images jpg et bmp d'un répertoire
    Par ShortcutZ dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 08/09/2006, 16h00

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