[RESOLU] Fonction RGB ou valeur couleur en hexadécimal ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
TimProd
Messages : 10
Inscription : sam. 18/oct./2014 5:01

[RESOLU] Fonction RGB ou valeur couleur en hexadécimal ?

Message par TimProd »

Bonjour,

Dans un souci d'optimisation, les deux syntaxes suivantes sont-elles équivalentes en rapidité ?

Circle(100, 100, 10, RGB(255,0,0))

Circle(100, 100, 10, $0000FF)

Ma première idée est de penser que non, car RGB est une fonction ce qui induit un traitement supplémentaire.

Sauf qu'une fois compilés, les deux syntaxes sont peut-être équivalentes.

En vous remerciant par avance pour vos avis éclairés,

Cordialement
Dernière modification par TimProd le dim. 01/févr./2015 15:26, modifié 1 fois.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Fonction RGB ou valeur RGB hexadécimale ?

Message par GallyHC »

Bonjour,

Oui RGB() a forcement une perte de temps (négligeable) que de mettre la valeur en dur (hexa ou décimal). Si tu connais les valeurs et qu'elle ne bouge pas, les valeur hexa sont, je penses mieux. Alors pourquoi une fonction RGB(), tout simplement si tu as besoin de décomposé les valeurs avec des calculs de couleur.

La fonction permet simplement de pouvoir décomposé les composantes, quand tu doit faire par exemple un calcul de tes couleur pour un dégrader.

Un exemple : un truc que je me suis remis dessus, il y a peine hier en fait. Je fait un slider en "potentiomètre linaire" qui donne :

Image

Pour le calcule des dégradés du "bouton", c'est beaucoup plus simple d'utiliser rgb(), car contre pour la règle du slider, les couleurs sont en dur (hexa), tout comme la couleur bleu en dessous des sliders.

Si tu me demande pourquoi faire le calcul des couleurs, cela est simple car cela me permet de pouvoir facilement changer la taille du bouton (un peu comme du vectoriel) et donc en exemple de faire les slider plus grand comme par exemple (en largueur de 64 pixels).

Image

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Fonction RGB ou valeur RGB hexadécimale ?

Message par comtois »

Pour récupérer le code assembleur généré , tu peux lancer une compilation ainsi :

Code : Tout sélectionner

PbCompiler source.pb /commented 
Et tu obtiens

Code : Tout sélectionner

; a=RGB(255,0,0)
  PUSH   dword 0
  PUSH   dword 0
  MOV    eax,dword 255
  CALL   PB_RGB
  MOV    dword [v_a],eax
pour ce code source :

Code : Tout sélectionner

;RGB
a=RGB(255,0,0)
et

Code : Tout sélectionner

; a=$0000FF
  MOV    dword [v_a],255
pour ce code source

Code : Tout sélectionner

;Valeur directe
a=$0000FF
Il n'y a pas photo. Par contre RGB() est cross-plateforme.
Je ne suis pas sûr que tu obtiennes la même couleur sur windows , linux et MacOS avec ton $0000FF.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Fonction RGB ou valeur RGB hexadécimale ?

Message par GallyHC »

Bonjour,

comtois> PB décompose de la même façon dans tout les OS (mes sources donne toujours les mêmes couleurs en hexa). RGB est surtout utilise pour décomposé et ne pas devoir faire le calcul en décomposant en hexa justement les valeurs de RGB.

Code : Tout sélectionner

B  G  R
00 00 00
Sinon, tu fait en décomposant ton R (de 0 a FF) et pareil pour G B et tu rassemble de tout avec un "$", d'où la fonction et sont fonctionnement est utile.

Ce n'est pas un problème d'OS, c'est juste que la fonction est optimisé en assembler et ton exemple le prouve.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Fonction RGB ou valeur RGB hexadécimale ?

Message par comtois »

Merci pour l'info, comme je n'utilise que windows, j'avais un doute.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
TimProd
Messages : 10
Inscription : sam. 18/oct./2014 5:01

Re: [RESOLU] Fonction RGB ou valeur couleur en hexadécimal ?

Message par TimProd »

Merci à tous les deux.

C'est clair net et précis.

Il ne me reste plus qu'à modifier quelques lignes de codes en prenant garde d'en conserver d'autres pour les facilités offertes par RGB.

Bonne fin de week-end à tous.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: [RESOLU] Fonction RGB ou valeur couleur en hexadécimal ?

Message par GallyHC »

Bonjour,

comtois> je suis content d'avoir pu te donné une info car je penses que tu as un niveau nettement supérieur a moi en PB (et même en programmation en général).

Alors je suis content ^^.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [RESOLU] Fonction RGB ou valeur couleur en hexadécimal ?

Message par falsam »

TimProd a écrit :Dans un souci d'optimisation, les deux syntaxes suivantes sont-elles équivalentes en rapidité ?
Comtois tu as raison, RGB fournit un code Assembleur plus important que si on fournissait la valeur Hexa de cette couleur.

Toutefois je ne suis pas si convaincu que qu'une optimisation de code en faveur de l'héxa est une réelle influence sur la rapidité d’exécution de ce code.

TimProd réalisant sont jeu en 2D, j'ai codé un petit programme de test qui se déroule en deux phases
- Phase A : Durant 30 secondes le code va compter et afficher des cercles en fournissant la valeur RGB.
- Phase B : Durant 30 secondes le code va compter et afficher des cercles en fournissant la valeur Hexadécimale.

:idea: Avant de lancer ce code, fermer toutes les applications afin que le processus de ce code ne soit pas ralenti par une autre application.

- Vous verrez en principe que le résultat n'est pas flagrant.

Code : Tout sélectionner

EnableExplicit

Enumeration Window
  #MainForm
EndEnumeration

Enumeration Sprite
  #Point
  #Test
EndEnumeration

Global Event
Global TestTime = 30000, StartTime, CurrentTime, TypeTest.s, TheEnd.b, Result.s
Global CountPointA, CountPointB
Global Font

Procedure GamePreload()
  CreateSprite(#Point, 40, 40, #PB_Sprite_AlphaBlending)
  CreateSprite(#Test, 400, 100, #PB_Sprite_AlphaBlending)
EndProcedure

Procedure GameUpdate(TypeTest.s)  
  ;Préparation des sprites
  StartDrawing(SpriteOutput(#Point))
  Box(0, 0, 40, 40, RGB(0, 0, 0))
  
  If TypeTest = "Test A" 
    CountPointA + 1
    Circle(20, 20, Random(20, 2), RGB(255, 0, 0))
    
  ElseIf TypeTest = "Test B"
    CountPointB + 1
    Circle(20, 20, Random(20, 2), RGB(255, 215, 0))
    
  EndIf
  
  StopDrawing()
  
  StartDrawing(SpriteOutput(#Test))
  Box(0, 0, 400, 100, RGB(0, 0, 0))
  DrawingFont(FontID(Font))
  DrawText(2, 2, TypeTest , RGB(255, 0, 0))
  StopDrawing()
  
  ;Affichage des sprites
  TransparentSpriteColor(#Point, RGB(0, 0, 0))
  DisplayTransparentSprite(#Point, Random(740, 10), Random(500, 10), Random(255, 20))
  
  DisplayTransparentSprite(#Test, 20, 550)
    
EndProcedure

Procedure GameStart()
  Protected Width = 800
  Protected Height = 600
  
  Font = LoadFont(#PB_Any, "Verdana", 30)
  
  If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 And InitSound() = 0
    MessageRequester("Error", "Sprite system can't be initialized", 0)
    End
  EndIf
  
  If OpenWindow(#mainform, 0, 0, Width, Height, "RGB or Hexa", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
    If OpenWindowedScreen(WindowID(#mainform), 0, 0, Width, Height)
      GamePreload()
    EndIf
  EndIf
  
  Repeat  
    Repeat
      Event = WindowEvent()
     
      Select event    
        Case #PB_Event_CloseWindow
          End
      EndSelect  
    Until event=0
    
    FlipBuffers()                
    ExamineKeyboard()
    ExamineMouse()
    
    If CountPointA = 0
      TypeTest = "Test A"  
      StartTime = ElapsedMilliseconds()
       
    ElseIf CountPointB = 0 And ElapsedMilliseconds()-StartTime > TestTime
      ClearScreen(RGB(0,0,0))
      TypeTest = "Test B"
      StartTime = ElapsedMilliseconds()
                  
    ElseIf CountPointB > 0 And ElapsedMilliseconds()-StartTime > TestTime
      TheEnd = #True
    EndIf
        
    GameUpdate(TypeTest)
  Until KeyboardPushed(#PB_Key_Escape) Or TheEnd = #True
EndProcedure

GameStart()

Result + "Nombre de points crées avec la fonction RGB : " + Str(CountPointA)+#CRLF$
Result + "Nombre de points crées avec la valeur hexa de la couleur: " + Str(CountPointB)+#CRLF$

MessageRequester("Resultat", Result)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [RESOLU] Fonction RGB ou valeur couleur en hexadécimal ?

Message par Ar-S »

@Falsam : J'ai un point de plus avec l'hex.

J'utilise plus souvent la valeur hexa, tout simplement parce que c'est moins long à écrire. RGB c'est en effet plus utile lors de la manip de couleur vue que les composantes se retrouvent avec les commandes Red()/Green()/Blue() la manipe est donc plus simple.
C'est plus RGBA() qui compte car il permet de gérer la couche alpha alors que la forme hexa $BBGGRR ne le permet pas, du moins je crois pas qu'on puisse faire $BBGGRRAA.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [RESOLU] Fonction RGB ou valeur couleur en hexadécimal ?

Message par falsam »

Ar-S a écrit :je crois pas qu'on puisse faire $BBGGRRAA.
L'héxa d'une couleur étant formaté à l'envers,la couche alpha se met au début.

Exemple pour le rouge : RGB(255, 0, 0) donnera en héxa $0000FF (Remarque que la composante Red est à la fin)

Juste pour rappel: La composante Alpha d'une couleur va permettre de définir la transparence d'une couleur variant de 0 (Transparent) à 255 (Opaque)

Une transparence à 120 donnera en Héxa 78. Ainsi RGB(255, 0, 0, 120) donnera $780000FF avec une valeur en héxa.

Un code pour finaliser ces explications.

Code : Tout sélectionner

Enumeration
  #Mainform
  #Canvas
EndEnumeration

Procedure Open_MainForm()
  OpenWindow(#Mainform, 0, 0, 500, 400, "New Form", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  CanvasGadget(#Canvas, 0, 0, 500, 400)
  
  StartDrawing(CanvasOutput(#canvas))
  DrawingMode(#PB_2DDrawing_AlphaBlend)
  Box(10, 10, 200, 200, $FF00D7FF)
  Box(150, 150, 200, 200, $780000FF) 
  StopDrawing()
EndProcedure

Open_MainForm()

Repeat : Until WaitWindowEvent(10) = #PB_Event_CloseWindow
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [RESOLU] Fonction RGB ou valeur couleur en hexadécimal ?

Message par Ar-S »

Je suis débile de pas avoir pensé que la valeur Alpha se foutait au début (comme le reste).
Faut dire que je trouve déjà chiant que l'hex ne propose que l'ordre BGR. Mon cerveau est conditionné à l'ordre RGB :lol:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [RESOLU] Fonction RGB ou valeur couleur en hexadécimal ?

Message par falsam »

J'ai fait la même confusion qui doit faire l'objet d'un post sur ce forum il me semble.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: [RESOLU] Fonction RGB ou valeur couleur en hexadécimal ?

Message par GallyHC »

même erreur faite mainte fois par moi et donc j'évite de la refaire maintenant ;). j'utilise facilement photoshop pour les couleurs, que je dois forcement inversé (bon maintenant je le sais). ^^
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: [RESOLU] Fonction RGB ou valeur couleur en hexadécimal ?

Message par Fig »

Si on n'utilise pas de variable dans la fonction RGB(), le compilateur pourrait, aussi bien, simplement remplacer la fonction par son équivalent en dur.

Mais franchement, niveau optimisation, on s'en fout un peu: RGB() est suffisamment rapide pour que ce soit négligeable la plupart du temps.
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: [RESOLU] Fonction RGB ou valeur couleur en hexadécimal ?

Message par Lord Nelson »

Oui j'ai testé et c'est très légèrement L'héxa qui l'emporte mais c'est vraiment pas de beaucoup.
Répondre