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

Langage Delphi Discussion :

EOutOfResources sur resize d'un bitmap


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 12
    Points : 7
    Points
    7
    Par défaut EOutOfResources sur resize d'un bitmap
    Bonjour,

    Pour scroller un tres grand document (partition musicale), je le decoupe en bandes d'images (portées) que je dessine à la demande en fonction de la position du scrolling et que je colle sur l'ecran via un CopyRect, puis je les conserve en cache pour que le scrolling soit plus fluide ensuite (plus de dessin à faire, uniquement le CopyRect).

    Si vous avez suivi jusque la, lisez la suite

    Cela peut consommer pas mal de memoire sur des tres grands documents, et il arrive que j'ai une exception EOutOfResources.

    Ce que je ne comprends pas, c'est que cela arrive avant que la RAM soit pleine. Par ex. j'ai 2Go de RAM et ca plante autour de 900Mo. Je ne sais donc pas trop quelle "memoire" est saturée, et donc comment prévenir cela en limitant mon cache perso.

    Pour le moment j'attends que l'exception se produise, et a ce moment je vide entierement le cache, pas top top... la memoire fait les montagnes russes.

    Pour info l'exception se produit sur une commande Bmp.Width := XXX, que j'appelle juste apres la creation du bitmap via Bmp := Graphics.TBitmap.Create.

  2. #2
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Salut

    Je pense que tu charges un peu trop la mule ...

    remarque : si le logiciel n'est pas pour ton usage exclusif, tu devrais peut-être tabler sur un espace mémoire plus petit que 2 Go (veinard, j'en ai que le quart).

    En ce qui concerne ton problème, l'idée de placer tes pages d'image dans un cache en mémoire est bonne pour la rapidité mais le résultat est là : tu consommes tout de même de la mémoire, mince!

    Une idée consiste à définir un cache qui ne prend que quelques pages (2 par exemple ou une valeur paramétrée selon tes besoins) en avant de la page courante et autant en arrière, comme cela l'occupation mémoire est moindre et parfaitement contrôlée. Ceci marche si l'utilisateur ne passe pas son temps à défiler et prend le temps de lire sa partition morceau par morceau. L'astuce consiste à entretenir le cache en arrière plan.

    Si tu as accès à ACDSEE, regardes comment il précharge les images quand tu les défiles, tu remarqueras que si tu regarde une image un certain temps, la suivante apparaît tout de suite mais pas si tu défiles trop vite.

    (je n'ai pas d'exemple Delphi et je pense qu'une telle gestion doit être assez sophistiquée alors bon courage)

    Autre suggestion, tu travailles sur un format Bitmap ? Si tes partitions sont vectorielles, il y a peut-être moyen de faire mieux (là aussi pas de solutions précises à donner).

    cordialement

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 865
    Points : 11 333
    Points
    11 333
    Billets dans le blog
    6
    Par défaut
    ton bmp est-il en 24 bits (voire plus) : tu n'as pê pas besoin de coder sur autant de couleurs ; utilise une palette, ou du N&B pour diminuer la mémoire consommée
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Bonjour, je suis d'accord avec ton système de cache, par contre quelques optimisations sont necessaires.
    Pourquoi ne pas charger seulement les images dont tu as immédiatement besoin.
    Dans ton cas, tu t'occupes seulement de précharger l'image de droite et gauche au fur et à mesure puis tu vides celles qui sont trop "loin" avec biensur un controle sur la vitesse du scroll. 2Go c'est vraiment énorme, plafonne sur une utilisation mémoire de 256/512 ce qui correspond à une grande majorité d'utilisateurs.
    L'idée de tourlourou n'est pas mauvaise non plus, des partitions musicales ne sont pas des oeuvres d'art, tu peux les afficher en noir et blanc sans altérer leurs qualitées ce qui nécessite beaucoup moins de mémoire. Si tu as plusieurs fiches, ne les créent pas au démarrage de l'application mais plutot lorsque tu en as besoin puis détruit les quand elles ne sont plus utilisées.
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Merci pour toutes ces idees. Je vais effectivement essayer d'appliquer un cache qui reste autour de la zone visible, bien que cela pose pas mal de problemes techniques dans mon cas precis. L'idee de tout mettre en cache etait liée à la lecture sonore de la partition, pour laquelle il faut limiter au maximum tout autre traitement afin d'eviter un ralentissement de la lecture pendant le dessin d'une bande. A ce sujet, j'ai une question :

    Si je créé un timer avec une priorité très basse, et que ce timer appel une fonction "Dessiner". Cela revient-il à faire mon dessin dans un thread de priorité très basse, ou bien ce n'est pas aussi simple que ca, et il faut manuellement créer une gestion de thread ?

    Pour le nombre de couleurs, c'est une tres bonne idee. Je ne peux pas faire du noir et blanc mais la palette dont j'ai besoin est restreinte. Je vais etudier ce point. D'ailleurs si vous avez 2/3 infos la-dessus... ca me fera gagner du temps

    Pour les fiches, merci de l'idee, c'est bien comme cela que je procede. Et heureusement car il y en a des dizaines.

    Encore merci à tous!

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Au fait, si vous voulez voir un peu mieux de quoi je parle :

    http://www.guitar-pro.com/gp5preview/screenshot.png

  7. #7
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Salut

    Tu travailles sur un progiciel qui a l'air intéressant.
    tu joues de la guitare ?

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  8. #8
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 669
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 669
    Points : 7 016
    Points
    7 016
    Par défaut
    Citation Envoyé par dav555
    Au fait, si vous voulez voir un peu mieux de quoi je parle :

    http://www.guitar-pro.com/gp5preview...erabadsign.png


    Tu le développe pour toi, ou professionnellement ?

    :
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    En fait Guitar Pro est plutot connu dans le monde de la guitare, et vous le trouvez meme à la Fnac

    La très prochaine version 5 est une petite révolution, mais cela a necessité la refonte complète du moteur d'affichage, qui ne va pas sans poser quelques soucis, d'où mon post ici...

    Je suis le developpeur principal, mais nous sommes désormais une petite équipe à bosser dessus.

Discussions similaires

  1. [Débutant] Aide sur les graphics associés à bitmap
    Par chekito07 dans le forum VB.NET
    Réponses: 3
    Dernier message: 02/01/2014, 09h36
  2. [Débutant] Modification de position d'un bouton sur Resize
    Par Masmeta dans le forum Windows Presentation Foundation
    Réponses: 8
    Dernier message: 30/04/2013, 17h23
  3. [javascript] raffraichissement sur resize
    Par Christophe93250 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/04/2007, 14h43
  4. Comment dessiner sur un Bitmap sans scintillement ?
    Par TOTO32 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 10/01/2005, 10h11
  5. Fade out sur un bitmap
    Par portu dans le forum Langage
    Réponses: 8
    Dernier message: 23/10/2003, 17h45

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