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

Lazarus Pascal Discussion :

Conversion d'un code C de Lightmap : noir et blanc au lieu de nuances de gris


Sujet :

Lazarus Pascal

  1. #21
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 329
    Points : 4 146
    Points
    4 146
    Par défaut Détails
    Bonjour,

    Bonne idée que la fonction ControlCouleur. En revanche, dans la boucle il y a ClrLight.int := Integer($FF4F4F4F); qui est inutile. Puisque cette valeur est constante, elle a juste besoin d'être initialisée en amont du code des boucles.

    $FF4F4F4F se traduit par ClrLight.Z := 255 (opaque si Z est la transparence), ClrLight.R:=79, ClrLight.R:=79, ClrLight.G:=79, ClrLight.B:=79. C'est un gris sombre. Supposons que le fond soit noir et que nous ayons un grand sommet :
    • Impact 1 : pDstX^.Zp := 255; DstX^.R := 79, pDstX^.G := 79, pDstX^.B := 79;
    • Impact 2 : pDstX^.Zp := 255; DstX^.R := 158, pDstX^.G := 158, pDstX^.B := 158;
    • impact 3 : pDstX^.Zp := 255; DstX^.R := 237, pDstX^.G := 237, pDstX^.B := 237;
    • impact 4 : pDstX^.Zp := 255; DstX^.R := 255, pDstX^.G := 255, pDstX^.B := 255;

    En fait dans ce cas ClrLight représente un incrément. Les valeurs choisies sont toujours un compromis : faibles, elles permettent une gradation assez douce mais au prix d'un assombrissement du résultat puisque la plupart des points n'auront pas assez d'impacts pour atteindre un gris clair ou un blanc; élevées, le nombre d'états avant saturation sera plus faible c'est à dire demandera moins d'impacts pour atteindre le blanc et l'image sera plus claire.

    Jipété a raison de proposer les modifications des couleurs pour revenir à de l'achrome. En fait, je trouvais dommage d'utiliser une image dans un format couleur (24 ou 32 bits) et de ne l'utiliser qu'en niveaux de gris. J'ai donc altéré la couleur de fonds pour me rapprocher d'une couleur terre et la couleur d'éclairage pour simuler médiocrement un soleil couchant. A titre indicatif l'image source est achrome et n'utilise qu'un octet par pixel (j'ai cependant rendu le code adaptable automatiquement à d'autre formats). Nous pourrions donc également ne travailler qu'avec un octet par pixel pour la sortie si nous restons achrome : le code serait plus simple.

    Le code n'utilise pas de scanline mais les fonctions du rawimage du bitmap supposé portable (dixit Lazarus). Mais il n'a pas été testé hors du monde Windows. Je pense que cela doit fonctionner car le bitmap que nous manipulons n'est pas celui vu par l'OS mais celui créé et géré par Lazarus. C'est le EndUpdate qui provoque le transfert vers une représentation liée au système. A contrario, le scanline est lié à l'API Windows (il utilise en cachette un Handle Windows).

    Il pourrait être intéressant de doter le programme d'un chargement d'image pour changer un peu de décors. Par ailleurs, je pense que la hauteur de la map fait double emploi avec l'angle des rayons (il faudrait que je fasse un dessin pour être plus clair). De plus ce facteur de hauteur n'augmente nullement la résolution verticale.

    Au fait, à part le plaisir intellectuel de la démarche, il y a un objectif concret ?

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  2. #22
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 959
    Points
    959
    Par défaut
    Pour la démarche, j'ai crée une carte du monde sous-marin, qui fait 21600 X 10800 pixels a partir des données d’altimétrie et de bathymétrie de la NOAA, et je cherche a lui trouver le meilleur rendu visuel car je voudrais me l'imprimer en A0...

    Aillant vu tout ce que l'on peux faire avec openGL et je me suis demandé si on pouvais faire les même rendu sur un énorme bitmap par prog, et chemin faisant, j'en ai appris beaucoup grâce a vous...

  3. #23
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Citation Envoyé par Guesset Voir le message
    Le code n'utilise pas de scanline mais les fonctions du rawimage du bitmap supposé portable (dixit Lazarus).
    Et qui est pourtant supposé fonctionner comme scanline, avec les pointeurs pour speeder les fonctions travaillant avec les valeurs des pixels et leurs composants R, G, B (et A si pf32bit).
    Enfin, c'est ce que disent la littérature et les tutos.

    Je n'ai pas fait le test aujourd'hui mais ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       pSrcY := PByte(aSrc.RawImage.GetLineStart(0));            // Pointeurs sur mêmes lignes des bmps
       pDstY := PxRGB(aDst.RawImage.GetLineStart(0));
    devrait pouvoir être remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       pSrcY := PByte(aSrc.Scanline[0]);            // Pointeurs sur mêmes lignes des bmps
       pDstY := PxRGB(aDst.Scanline[0]);
    et fonctionner tout autant.

    Citation Envoyé par Guesset Voir le message
    Mais il n'a pas été testé hors du monde Windows.
    Pourtant, ce n'est pas faute d'y avoir passé un temps dément, ici même : une simple recherche avec le moteur du forum sur le mot "scanline" te le montrera et, oui, jouer avec tout ça dans le monde Linux rajoute une joyeuse couche de complexité…

    Citation Envoyé par Guesset Voir le message
    Je pense que cela doit fonctionner car le bitmap que nous manipulons n'est pas celui vu par l'OS mais celui créé et géré par Lazarus.
    Si BeanzMaster passe par là, il te parlera des misères du TBitmap sous Lazarus à cause des tentatives d'avoir un code pour de multiples plateformes cibles.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  4. #24
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 959
    Points
    959
    Par défaut
    Et de mon coté, je vais testé ceci sur mon Pi3 sous Raspbian (pour le fun, et a te lire, je sent que je vais pas rigoler)...

    Cela me permet de continuer a faire du Pascal pour le plaisir, car professionnellement, j'ai été obligé de passer a Windev !

  5. #25
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Je n'ai pas fait le test aujourd'hui mais ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       pSrcY := PByte(aSrc.RawImage.GetLineStart(0));            // Pointeurs sur mêmes lignes des bmps
       pDstY := PxRGB(aDst.RawImage.GetLineStart(0));
    devrait pouvoir être remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       pSrcY := PByte(aSrc.Scanline[0]);            // Pointeurs sur mêmes lignes des bmps
       pDstY := PxRGB(aDst.Scanline[0]);
    et fonctionner tout autant.
    Je viens de tester : résultat visuel strictement identique, durée d'exécution similaire (au pif).
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #26
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut à tous, je n'ai que très peux de temps en ce moment.
    Je vais faire une analyse vite fait.

    1. Utilisation de l'assembleur avec les instruction SSE.

    Ton code Guesset est très intéressant à ce niveau. Mais il ne confère pas de réelles améliorations pour 2 principales raisons :
    - La boucle n'est pas traité totalement en assembleur
    - Tu n'exploites que 32bits sur les 128 disponibles dans les registres XMM. (1 pixel à la fois alors que l'on peut en traiter 4 en même temps

    Ici le code ASM n'est pas pertinent FPC se charge très bien d'optimiser les boucles. Il faut juste luis passer les bonnes options (options projet--> Options Compilateurs --> Options personnalisées)

    Ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    -CfSSE3
    -CpATHLON64 ---> Different pour CPU Intel = COREI ou PENTIUMxx
    -OoCSE
    -OoNODFA
    -OoFASTMATH
    -OoNOPEEPHOLE
    -OoREMOVEEMPTYPROCS
    -OoNOSTACKFRAME
    -OpATHLON64
    -Sv
    -OoLOOPUNROLL
    -OoNOUSERBP
    2. la structure TxRGB, ici c'est pour Windows format BGRA, Linux fonctionne en RGBA. Ici pas de différence car on bosse en niveau de gris. Le nom n'est pas top et peut porter à confusion à mon avis

    3. Les Scanlines

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pSrcY := PByte(aSrc.Scanline[0]);            // Pointeurs sur mêmes lignes des bmps
    DstY := PxRGB(aDst.Scanline[0]);
    Cette écriture est nouvelle depuis la 1.8.6 si je souviens bien et est juste la pour la compatibilité avec Delphi. Des problème peuvent subsister sous Linux. Mieux vaut utiliser GetLineStart

    DstY := PxRGB(aDst.Scanline[0]);[/CODE] cette ligne comme je le disais au point 2 ne renverra pas le même résultat suivant l'OS donc attention si tu manipule autres chose que des niveau de gris

    Ensuite au lieu d'utiliser pSrcY := PByte(aSrc.Scanline[0]); tu peux aisément utiliser la structure TxRGB aussi

    Un petit truc que je ne comprend pas bien même si j'ai déja une petite idée du pourquoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dZ := round( 65280.0*cotan(DegToRad(aAR))/aHP);
    HR := round((65280.0*aHR)/aHP);
    65280.0 il correspond à quoi exactement ?

    if Integer(pSrcX^) << 8 >= Zr then je pige pas cette ligne aussi. Normalement c'est la moyenne des composantes RGB qui faudrait calculer ((r+g+b) / 3) non ? , zr varie bien entre 0 et 1 soit entre 0 et 255, non ?

    4. Il faut vraiment faire attention a comment tu initialises te Bitmap pour que le code soit portable entre Windows et Linux. Exemple sous Linux un Bmp 24bits chaque pixel est codé sur 32bits et ca c'est sans parler des octets suppléméntaire pour l'alignement des données comme le précisait Guesset. Joué avec les scanline c'est cool, mais pour la portabilité entre OS il faut bien vérifier les info du "RawImageDescription"

    Bref voila vite fait. Dès que j'aurais un peu plus de temps je jettrai un oeil au code source

    NOTE : @Guesset par rapport à ta réponse sur l'autre topic, concernant l'utilisation de la mémoire swap. Les TBitmap ne l'utilise pas et sont utilisation n'est pas automatique (cf dernier lien)

    En attendant vois quelques topics ou on s'est bien pris la tête avec Jipete (et autres membres) concernant les TBitmap de Lazarus les scanlines, avec Linux et Windows

    https://www.developpez.net/forums/d1...l-enfer-terre/
    https://www.developpez.net/forums/d1...mp-sous-linux/
    https://www.developpez.net/forums/d1...me-on-ne-sait/
    https://www.developpez.net/forums/d1...imale-d-image/
    https://www.developpez.net/forums/d1...ssible-ouvrir/

    A Bientôt

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  7. #27
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 329
    Points : 4 146
    Points
    4 146
    Par défaut De tout un peu
    Bonjour,
    1. Asm
    Le code d'origine travaille point par point (comme je l'ai déjà écrit, l'algorithme n'est pas optimal, il est facile d'imaginer quelque chose qui tourne plus de trois fois plus vite et sans plafond artificiel de rayonnement). Aussi le XMM ne fait que simplifier ce travail point par point (en outre le mode exponentiel met à 16 bits les composantes, il n'y aurait donc que 2 points traitables en même temps). Par ailleurs, les optimisations du compilateur, si elles sont intéressantes ne sont pas parfaites (et je regarde régulièrement le code généré).

    2. Comme indiqué je travaille sous Windows. Je laisse égoïstement le soin de la portabilité aux intéressés .

    3.a Je suis d'accord avec BeanzMaster, les scanlines de Lazarus sont plutôt à éviter (je ne les utilise plus car souvent ils demandaient la création temporaire d'un bitmap, mais cela a peut être évolué). Leur équivalent Lazarus est plus constant.

    3.b Pour l'image source, il n'est pas possible d'utiliser un pointeur sur TxRGB car elle est seulement sur un octet par pixel. Comme je n'étais pas sûr que ce programme était voué à rester avec une image statique 8 bits, le code demande à Lazarus de donner la taille par pixel pour pouvoir incrémenter du nombre d'octets nécessaires, ce qui fait que cela marchera pour divers formats (pas tous, pas les indexés et pas les compressés comme pf16bit par exemple).

    3.c Par rapport au code d'origine, j'ai sorti tous les calculs inutiles (multiplications et divisions notamment) de la boucle et suis passé en entiers. Pour ne pas perdre en résolution, un facteur 256 à été appliqué d'où le 65280 (256*255) et le shl 8 dans le test (ça ne coûte pas cher et améliore bien les performances).

    3.d La moyenne des composantes ? La luminance pourrait être pertinente car elle est achrome. Mais on pourrait aussi utiliser max(R,G,B) ou toute projection couleur de type (rR+gG+bB)/(r+g+b) avec (r+g+b) non nul bien sûr. La bonne solution dépendra de l'objectif et des sources effectives.

    Nota : Les bitmap ne font pas de swap. C'est normal car le swap n'est pas du niveau composant (bitmap ou autre) mais du niveau système. Les adresses mémoires sont vectorisées afin que nous ayons l'impression d'avoir un espace continu pour chaque programme tout en laissant le système gérer sa mémoire comme il l'entend. Entre autres, certains vecteurs ne pointent pas vers de la RAM mais, indirectement, vers du stockage. Quand l'une de ces adresse est demandée, le système charge les données depuis le stockage et re-vectorise l'adresse vers la RAM d'accueil. Pour ce faire, il se moque bien de l'usage qui en est fait par le programme. Mais tout cela prend du temps.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  8. #28
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 329
    Points : 4 146
    Points
    4 146
    Par défaut Réponse à Jipété
    Bonjour Jipété,

    Citation Envoyé par Jipété Voir le message
    Et qui est pourtant supposé fonctionner comme scanline, avec les pointeurs pour speeder les fonctions travaillant avec les valeurs des pixels et leurs composants R, G, B (et A si pf32bit).
    Enfin, c'est ce que disent la littérature et les tutos.
    Je me souviens de Scanline sous Delphi qui pouvait avoir un incrément d'adresse de ligne positif ou négatif selon des critères obscurs (pour moi) qui pouvaient dépendre, entre autres, de la version de Windows. Quand je regarde le code de Lazarus pour RawImage, l'incrément est toujours positif. C'est déjà ça !
    De plus le scanline initial dépendait directement de l'API windows ce qui ne doit pas être le cas de l'actuel sous Lazarus (j'espère).


    Citation Envoyé par Jipété Voir le message
    Pourtant, ce n'est pas faute d'y avoir passé un temps dément, ici même : une simple recherche avec le moteur du forum sur le mot "scanline" te le montrera et, oui, jouer avec tout ça dans le monde Linux rajoute une joyeuse couche de complexité…
    Ce n'était pas une critique de ma part mais juste l'information que je ne l'avais pas testé hors Windows.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  9. #29
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Guesset Voir le message
    Bonjour,
    1. Asm
    Le code d'origine travaille point par point (comme je l'ai déjà écrit, l'algorithme n'est pas optimal, il est facile d'imaginer quelque chose qui tourne plus de trois fois plus vite et sans plafond artificiel de rayonnement). Aussi le XMM ne fait que simplifier ce travail point par point (en outre le mode exponentiel met à 16 bits les composantes, il n'y aurait donc que 2 points traitables en même temps). Par ailleurs, les optimisations du compilateur, si elles sont intéressantes ne sont pas parfaites (et je regarde régulièrement le code généré).

    2. Comme indiqué je travaille sous Windows. Je laisse égoïstement le soin de la portabilité aux intéressés .
    1. Il y a quand même quelques chose qui taquine avec ton code ASM mais je ne sais pas quoi. Je regarderais dès que j'aurais du temps.
    Pour la générération du code, as tu testé avec les version 3.1 et supérieure de FPC. le code généré est bien meilleur que la version 3.0.4 ?

    2. Pour l'ASM il faut joué avec les registres. Les définitions ABI n'etant pas les même en 64bits entre les 2 OS (Win et Linux) mais rien de bien méchant


    Citation Envoyé par Guesset Voir le message
    3.b Pour l'image source, il n'est pas possible d'utiliser un pointeur sur TxRGB car elle est seulement sur un octet par pixel. Comme je n'étais pas sûr que ce programme était voué à rester avec une image statique 8 bits, le code demande à Lazarus de donner la taille par pixel pour pouvoir incrémenter du nombre d'octets nécessaires, ce qui fait que cela marchera pour divers formats (pas tous, pas les indexés et pas les compressés comme pf16bit par exemple).
    Pourquoi ? de ce que j'ai pu comprendre tu ne prend que la 1ere composante du Pixel de l'image source, soit le Bleu. Oui ce code ne sera fonctionnel qu'avec des images 24 et 32 bits.

    Citation Envoyé par Guesset Voir le message
    3.c Par rapport au code d'origine, j'ai sorti tous les calculs inutiles (multiplications et divisions notamment) de la boucle et suis passé en entiers. Pour ne pas perdre en résolution, un facteur 256 à été appliqué d'où le 65280 (256*255) et le shl 8 dans le test (ça ne coûte pas cher et améliore bien les performances).
    C'est bien ce qui me semblait mais je n'étais pas sûre

    Citation Envoyé par Guesset Voir le message
    3.d La moyenne des composantes ? La luminance pourrait être pertinente car elle est achrome. Mais on pourrait aussi utiliser max(R,G,B) ou toute projection couleur de type (rR+gG+bB)/(r+g+b) avec (r+g+b) non nul bien sûr. La bonne solution dépendra de l'objectif et des sources effectives.
    C'était bien le fond de ma pensée

    Citation Envoyé par Guesset Voir le message
    Nota : Les bitmap ne font pas de swap. C'est normal car le swap n'est pas du niveau composant (bitmap ou autre) mais du niveau système. Les adresses mémoires sont vectorisées afin que nous ayons l'impression d'avoir un espace continu pour chaque programme tout en laissant le système gérer sa mémoire comme il l'entend. Entre autres, certains vecteurs ne pointent pas vers de la RAM mais, indirectement, vers du stockage. Quand l'une de ces adresse est demandée, le système charge les données depuis le stockage et re-vectorise l'adresse vers la RAM d'accueil. Pour ce faire, il se moque bien de l'usage qui en est fait par le programme. Mais tout cela prend du temps.

    Salutations
    Exacte les bitmaps, n'utilisent pas le swap et FPC/Lazarus en général. Le gestionnaire de mémoire par défaut, n'utilise jamais le swap. L'OS la seule chose qu'il gère c'est le Cache de la mémoire virtuelle. Et c'est ce que tu expliques ici. Si l'OS gérerait la mémoire RAM+Virtuelle automatiquement nous aurions la capacité de pouvoir réserver des blocs mémoire de plus de 4Go en 64bit (C'est la taille d'un bitmap max que j'ai pu chargée avec ma solution) et de 2Go en 32bit. Ce qui n'est pas le cas ici

    Re: heap size over available RAM
    « Reply #1 on: Today at 09:02:08 am »
    Well, the best solution is to have 64G of memory. Anything other will be slower.
    The default FPC memory manager looks at true available memory, not at swap space, so that won't work properly.
    But you can write a custom memory manager that uses a (partial or wholly) heap on disk. That will be slower.
    Such variables are better replaced with a (buffered) filestream if cost is an issue.
    cf : une discussion sur le thème de la quantité de ram que l'on peux alloué

    Je devrais avoir un peu de temps libre dès la semaine prochaine je regarderais tout cela d'un peu plus près.

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  10. #30
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut à tous j'ai eu un peu de temps pour regarder ce petit projet bien intéressant

    Merci Guesset, pour ton petit bout de code en assembleur, j'ai pu cerner ton approche et j'ai appris de nouvelles commandes SSE que je n'avais encore jamais utilisées

    Voila le résultat de mes tests (sans options particulières d'optimisation pour le compilo)

    Version 1 : en virgule flottante (d'après le code original)

    Nom : Lightmaptest_single.png
Affichages : 151
Taille : 281,7 Ko

    Version 2 : En fixed-point d'après Guesset. Sans ASM, avec le code der§en

    Nom : Lightmaptest_fixedpoint.png
Affichages : 144
Taille : 281,4 Ko

    Version 3 : En fixed-point d'après Guesset avec ASM

    Nom : Lightmaptest_fixedpoint_asm.png
Affichages : 143
Taille : 281,5 Ko

    Comparaison entre Virgule flottante et "fixed-point" on peut remarquer quelques petites différences de précision mais rien de très flagrant et on gagne pas loin de 100ms en performance avec les "fixed-point"

    Version 4 : En fixed-point d'après Guesset et la méthode exponentielle avec ASM

    Nom : Lightmaptest_fixedpoint_exp_asm.png
Affichages : 167
Taille : 292,5 Ko

    Version 5 : Le projet final avec adoucissement optionnel et enregistrement vers un fichier BMP et choix de la couleur de la lumière

    Nom : Lightmaptest_fixedpoint_asm_adv.png
Affichages : 175
Taille : 374,2 Ko

    Petite précision comme on peut le voir ci-dessous, on dirait que l'image finale n'est pas complète, mais si. Ce résultat est du aux paramètres : Angle d'incidence, Hauteur Max et rayon Max. Il faut donc jouer avec pour obtenir le bon résultat De même que les valeurs de l'ombre et la lumière joueront un rôle dans l’esthétique finale de l'image

    Nom : Lightmaptest_diff.png
Affichages : 148
Taille : 268,1 Ko

    En ce qui concerne le code, j'ai utilisé ma solution et je n'ai quasi rien modifié.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     
     
    procedure TMainForm.DoLightmap(aSrc, aDst: TBZBitmap; aVO: Byte; aAR, aHR, aHP: Single; ClrLight  : TBZColor);
    var
       pSrcX, pSrcY        : PBZColor; //PByte;
       pDstX, pDstY        : PBZColor;
       OutColor, ClrOmbre : TBZColor;
       //ClrLight  : TBZColor;
       x, y, W, H, dZ, Zo, Zr, HR : Integer;
     
       z_step, z_origine, z_rayon: single;
     
       function ControlCouleur(const AC, AX: Byte): Byte; inline;
       begin
         if (255 - AC) > AX then
           Result := (AC + AX)
         else
           Result := 255;
       End;
     
    begin
      // dXSrc := aSrc.RawImage.Description.BitsPerPixel div 8;
       FStopWatch.Start();
       W := aDst.MaxWidth;
       H := aDst.MaxHeight;
     
       ClrOmbre.Create(aVo,aVo,aVo);
       //ClrLight.Create(79,79,79);
     
       // Calcul du pas en z pour chaque rayon
       //z_step := abs(1 / tan(DegToRadian(AAR)));
       dz := round( 65280.0*Math.cotan(DegToRadian(aAR))/aHP);
       HR := round((65280.0*aHR)/aHP);
     
       aDst.Clear(ClrOmbre);
       // Lancement des rayons dans le sens horizontal et de gauche a droite.
       Bar.Max := H ;
     
       for y := 0 to H do
       begin
          Bar.Position := y;
          pDstY := aDst.GetScanLine(y);
          pSrcY := aSrc.GetScanLine(y);
          // Lancements des rayons pour chaque hauteur en remontant suivant l'axe z
          //z_origine := 0.0;
          Zo := 0;
          while Zo < HR do
          //while Z_Origine < aHR do
          begin                     // Lancement de rayon.
             Zr    := Zo;
             pSrcX := pSrcY;
             pDstX := pDstY;
     
             //z_rayon := z_origine;
             for x := 0 to W do
             begin
                if ((pSrcX^.Red shl 8) >= Zr) then
                //if (((pSrcX^.Red * _FloatColorRatio ) * aHP ) >= z_rayon) then
                begin
                   if chkExpMode.Checked then
                   begin
                     asm                               // Exponentielle  (mettre ClrLight.int à -1)
                        mov       r8,  pDstX           // en 1 - e^(-nb_impacts)
                        pxor      xmm0, xmm0
                        movd      xmm2, ClrLight
                        movd      xmm1, [r8]
                        punpcklbw xmm2, xmm0           // xmm2 = ClrLight en 16 bits
                        punpcklbw xmm1, xmm0           // xmm1 = pDstXo^ en 16 bits
                        psubw     xmm2, xmm1           // xmm2 = ClrLight-pDstXo^        (par composante)
                        psraw     xmm2, 2              // xmm3 =(ClrLight-pDstXo^)/2^n   (par composante)
                        paddw     xmm1, xmm2           // xmm1 = ClrLight+(pDstXo^-ClrLight)/16 (par comp)
                        packuswb  xmm1, xmm0
                        movd      [r8], xmm1
    					       end;
                   end
                   else
                   begin
                     asm                               // Linéaire selon nb_impacts
                        mov       r8,   pDstX        
                        movd      xmm2, ClrLight
                        movd      xmm1, [r8]
                        paddusb   xmm2, xmm1
                        movd      [r8], xmm2
                     end;
                     //OutColor.Red := ControlCouleur(pDstX^.Red, ClrLight.Red);
                     //OutColor.Green := ControlCouleur(pDstX^.Green, ClrLight.Green);
                     //OutColor.Blue := ControlCouleur(pDstX^.Blue, ClrLight.Blue);
                     //OutColor.Alpha := 255;
                     //pDstx^:= OutColor;
                   end;
                  break;
                End;
     
                inc(pSrcX);
                inc(pDstX);
     
                Zr := Zr - dZ;
                //z_rayon := z_rayon - z_step;
             end;
             //z_origine := z_origine + z_step;
             Zo := Zo + dZ;
          end;
       end;
     
       FStopWatch.Stop;
       if chkBlur.Checked then FBmpDst.BlurFilter.BoxBlur(Round(spinBlurFactor.Value)); // .GaussianBoxBlur(spinBlurFactor.Value);
       pnlViewDest.Invalidate;
       Caption := 'Temps : '+FStopWatch.getValueAsMilliSeconds;
       Bar.Position := 0;
    end;
    Vous trouverez ci-joint l’exécutable pour Win 64 : LightMapGenerator.7z
    En entrée vous pourrez charger des bmp, png, jpg, tga.... En sortie c'est uniquement du BMP

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  11. #31
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 959
    Points
    959
    Par défaut
    Merci pour le rendu final que je trouve vraiment excellent, sauf qu’hélas avec des bouts de code ASM Intel dedans, c’est mort pour moi

  12. #32
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Non regardes en commentaires il y a celui que tu as écris (enfin presque). Je regarderais pour faire une version 100% pascal et j'essayerai de transposé le code asm en 32bit et compatible pour Linux Je devrai avoir un peu de temps ce we. Je pense pouvoir uploader une première version de ma solution

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  13. #33
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Salut,

    travail impressionnant, particulièrement ce résultat :

    Citation Envoyé par BeanzMaster Voir le message
    Petite précision comme on peut le voir ci-dessous, on dirait que l'image finale n'est pas complète, mais si. Ce résultat est du aux paramètres : Angle d'incidence, Hauteur Max et rayon Max. Il faut donc jouer avec pour obtenir le bon résultat De même que les valeurs de l'ombre et la lumière joueront un rôle dans l’esthétique finale de l'image
    Nom : Lightmaptest_diff_bzmstr.png
Affichages : 150
Taille : 83,1 Ko
    car j'étais tombé sur cet écueil
    Nom : progombregrise.png
Affichages : 161
Taille : 175,3 Ko
    et j'étais persuadé que c'était encore une histoire pf24/pf32 ou autre embrouille avec non-compatibilité Linux, j'ai tellement l'habitude de ce sac de nœuds que je n'ai absolument pas eu l'idée de jouer avec les réglages de l'ihm, que j'avais sous le nez !

    Nom : guesset+bzm.png
Affichages : 183
Taille : 224,4 Ko
    Bien joué, et merci.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  14. #34
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Salut,

    travail impressionnant, particulièrement ce résultat :



    car j'étais tombé sur cet écueil

    et j'étais persuadé que c'était encore une histoire pf24/pf32 ou autre embrouille avec non-compatibilité Linux, j'ai tellement l'habitude de ce sac de nœuds que je n'ai absolument pas eu l'idée de jouer avec les réglages de l'ihm, que j'avais sous le nez !
    Salut, merci, je te rassure au premier abord j'avais pensé la même chose


    @der§en : pour ce qui est de la partie en asm pour passer le code en 32 bits il faut juste remplacé R8 par RDX. Je n'ai pas de FPC en 32 bits installé, mais dans tous les cas le code compile en 64bits et le devrait en 32. Si tu peux tester chez toi et nous dire (il faut egalement choisir le mode INTEL dans les options du projet --> Options du compilateur --> Analyse. Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // Linéaire selon nb_impacts
    {$IFDEF CPU32}
    asm
      push rdx
      mov       rdx,   pDstX
      movd      xmm2, ClrLight
      movd      xmm1, [rdx]
      paddusb   xmm2, xmm1
      movd      [rdx], xmm2
      pop rdx
    end;
    {$ELSE}
    asm
      mov       r8d,   pDstX  //R8D registre 32bits dans les instructions 64bits (améliore un peu les performances)
      movd      xmm2, ClrLight
      movd      xmm1, [r8d]
      paddusb   xmm2, xmm1
      movd      [r8d], xmm2
    end;
    {$ENDIF}
    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  15. #35
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 959
    Points
    959
    Par défaut
    Pas cette option sur mon LAZARUS sous Pi3

  16. #36
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par der§en Voir le message
    Pas cette option sur mon LAZARUS sous Pi3
    Oui c'est logique les CPU n'etant pas intel. Du coup seul l’écriture AT&T est dispo je présume. Ce qui de mémoire donnerai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    {$ifdef CPUx86_64}
    asm
      mov       pDstX, %r8d 
      movd     ClrLight,%xmm2
      movd      [%r8d], %xmm1
      paddusb   %xmm1, %xmm2
      movd      %xmm2, [%r8d]
    end;
    {$ELSE}
    asm
      push %rdx
      mov        pDstX, %rdx
      movd     ClrLight,%xmm2
      movd      [%r8d], %xmm1
      paddusb   %xmm1, %xmm2
      movd      %xmm2, [%rdx]  
      pop %rdx
    end;
    {$ENDIF}
    Sinon est ce que en ajoutant la directive {$asmMode intel} au début de l'unité ou dans la méthode (avant var). Ca passe ?

    A+

    EDIT : Laisse tomber le CPU est un ARM si je ne me trompe pas. Du coup la codification de l'ASM est ARM-NEON. faut que je fasse quelques recherches pour convertir le code.
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  17. #37
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 329
    Points : 4 146
    Points
    4 146
    Par défaut Ombre et lumière
    Bonjour,

    Ce paramètre HR met un pare soleil artificiel inutile puisqu'il est assez facile de calculer sa hauteur pour que toute la carte soit couverte.
    Nom : Light 1.png
Affichages : 154
Taille : 72,0 Ko
    On voit également, qu'il serait beaucoup plus rapide de limiter la hauteur de rayonnement à 255 et de progresser en x avec un incrément de 1. Cela consiste à remplacer un plan vertical de rayonnement par un plafond horizontal après avoir fait la monté de 0 à 255. De plus, en utilisant un Bresenham on obtient pratiquement la même précision qu'en flottant sans avoir à x par 256.

    De même le coefficient de hauteur ne sert à rien puisqu'il fait double emploi avec les angles d'éclairement.
    Nom : Light 2.png
Affichages : 138
Taille : 37,1 Ko

    Cependant je trouve dommage que les ombres soient uniformes et absorbent tout relief. Un algorithme de rayonnement inverse pourrait apporter un plus en assombrissant les zones dans l'ombre proportionnellement à la hauteur masquée/ hauteur d'interception (voir image). Pour l'ombre c'est un modèle de diffraction plutôt que réflexion (mais ce dernier demanderait une deuxième passe car pour que les zones éclairées renvoient de la lumière vers les zones dans l'ombre, il faut déjà les connaître).
    Nom : Algorithme inverse.png
Affichages : 145
Taille : 49,1 Ko

    Un détail que je n'ai pas compris, la barre de progression a un comportement étrange. J'ai rendu la taille de la fiche variable pour mieux voir les détails. Or quand l'image est agrandie, le traitement est sensiblement ralenti (alors que seule l'actualisation finale du TImage devrait être un peu plus longue sans que cela soit perceptible humainement). Pire, quand on revient à la taille initiale, le ralentissement persiste. La suppression de la barre de progression (remplacée par un simple feu vert/ feu rouge) fait disparaître ce problème.

    Salutations
    Images attachées Images attachées  
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

Discussions similaires

  1. [AC-2016] Impression Noir et blanc au lieu de couleurs pour certains Formulaires
    Par Philippe Tulliez dans le forum IHM
    Réponses: 0
    Dernier message: 29/08/2019, 14h06
  2. Code pour imprimer en noir et blanc
    Par ami19 dans le forum VBA Access
    Réponses: 1
    Dernier message: 17/10/2018, 08h16
  3. Conversion d'un code javascript en php
    Par jazz3210 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 07/02/2009, 20h48
  4. Conversion d"un code javascript en php
    Par jazz3210 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 07/02/2009, 20h05
  5. Problème de conversion d'un code de AS2 en AS3
    Par platondog dans le forum ActionScript 3
    Réponses: 4
    Dernier message: 20/11/2008, 01h30

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