PureBasic

Forums PureBasic
Nous sommes le Lun 19/Nov/2018 12:54

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 8 messages ] 
Auteur Message
 Sujet du message: Afficher du texte en utilisant le GPU
MessagePosté: Lun 05/Nov/2018 23:36 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3210
L'habit ne fait pas le moine, et ce code pondu en 2015, pour explorer les petits nombres premiers (très loin des hautes performances de fweil, en matière de recherche des nombres premiers) utilise le GPU.

DisplayText(x.I, y.I, Texte.S, Taille.I, Couleur.I, Angle.I)

Affiche un texte en épargnant le CPU de s'occuper de la fonte, pixel par pixel.
La fonte utilisée est "verdana" et peut être modifiée.

Il n'utilise qu'une fonte : c'est pour que quiconque veuille en utiliser plusieurs comprenne la technique, et fasse son ensemble de fonte à sa manière : ensemble de tableaux, listes ou maps. Les méthodes sont trop diversifiées pour en choisir une et, surtout, quand on veut du texte en GPU, très rapidement, donc une seule fonte, autant ne pas se coltiner une pavasse inutilisée (gestion de plusieurs fontes pour une seule fonte).

Les tableaux utilisés pour ça ont un nom qui commence par "Char" de l'anglais "character". Un petit clin d'oeil à l'ordinateur EXL100 et son instruction CALL CHAR(N, A$) en 1989 qui permettait de réécrire les 64 pixels d'un caractère entre 0 et 127 (N) en injectant un nombre hexadécimal de 64 bits sous forme de chaîne hexadécimale.

Mon conseil :
1) Cherchez l'appel DisplayText()
2) Rajouter vos DisplayText() perso pour tester.
3) Démontez le superflu qui ne vous intéresse pas.
4) Observez le principe, et gardez-le comme référence, il n'y a pas 36 méthodes en natif, seulement celle-là.

L'alphachannel est géré.

Si quelqu'un trouve un code antérieur à 2015 qui utilise ce principe, qu'il n'hésite pas à ajouter un lien, ça rendra hommage à d'autres. On est pionnier contre soi-même avant tout, avant d'être pionnier en concurrence contre les autres. L'allusion aux nombres premiers est assez éloquente : la logique étant stricte, il existe x domaines scientifiques où rechercher indépendamment aboutit à des résultats strictement similaires à d'autres, et donc à avoir perdu du temps. Et réfléchir en groupe en rangeant son ego, c'est tout simplement gagner du temps, beaucoup de temps.

Petite nota pour un très récent critiqueur :
Code:
ClearScreen(#BackColor)
Je crois que ça fait plus de 6 ans que Fred a établi une optimisation effective. Pour le même résultat, il n'y a pas plus rapide.
Code:
;********************************************************************************************************************************************
Procedure InitScreen()
        ExamineDesktops()
        Global Dw = DesktopWidth(0)
        Global Dh = DesktopHeight(0)
        Global Dd = DesktopDepth(0)
        InitSprite()
        InitKeyboard()
        OpenScreen(Dw, Dh, Dd, "")
EndProcedure

Global Dim CharFont.I(80)
Global Dim CharSprite.I(80, 255)
Global Dim CharW.I(80, 255)
Global Dim CharH.I(80, 255)

#BackColor = $406080
#CaseBackColor = $FFFFFF
#CaseTextColor = $000000

Procedure InitSpriteCharacter(SizeList.S)
        Define SizeSize = CountString(SizeList, ";")
        Dim Size.I(SizeSize)
        For K = 0 To SizeSize
                Size(K) = Val(StringField(SizeList, 1 + K, ";") )
        Next
        For K = 0 To SizeSize
                J = Size(K)
                CharFont(J) = LoadFont(#PB_Any, "Verdana", J)
        Next

StartDrawing(ScreenOutput() )
        For K = 0 To SizeSize
                J = Size(K)
        DrawingFont(FontID(CharFont(J) ) )
        For I = 1 To 255
                CharW(J, I) = TextWidth(Chr(I) )
                CharH(J, I) = TextHeight(Chr(I) )
        Next
        Next
StopDrawing()

        For K = 0 To SizeSize
                J = Size(K)
        For I = 48 To 57
                CharSprite(J, I) = CreateSprite(#PB_Any, CharW(J, I), CharH(J, I), #PB_Sprite_AlphaBlending)
                StartDrawing(SpriteOutput(CharSprite(J, I) ) )
                        DrawingFont(FontID(CharFont(J) ) )
                        DrawingMode(#PB_2DDrawing_AllChannels)
                        DrawText(0, 0, Chr(I), RGBA(0, 0, 0, 255), RGBA(255, 255, 255, 0) )
                StopDrawing()
        Next
        For I = 65 To 90
                CharSprite(J, I) = CreateSprite(#PB_Any, CharW(J, I), CharH(J, I), #PB_Sprite_AlphaBlending)
                StartDrawing(SpriteOutput(CharSprite(J, I) ) )
                        DrawingFont(FontID(CharFont(J) ) )
                        DrawingMode(#PB_2DDrawing_AllChannels)
                        DrawText(0, 0, Chr(I), RGBA(0, 0, 0, 255), RGBA(255, 255, 255, 0) )
                StopDrawing()
        Next
Next
EndProcedure

Procedure DisplayText(x, y, A$, Size, Color, Angle = 0)
        Define AngleRad.F = Angle * #PI / 180.0
        If Angle
                For I = 1 To Len(A$)
                        A = Asc(Mid(A$, I, 1) )
                        If Angle
                                RotateSprite(CharSprite(Size, A), Angle, #PB_Absolute)
                        EndIf
                        DisplayTransparentSprite(CharSprite(Size, A), X, Y, 255, Color)
                        X + (CharW(Size, A) * Cos(AngleRad) )
                        Y + (CharW(Size, A) * Sin(AngleRad) )
                Next
        Else
                For I = 1 To Len(A$)
                        A = Asc(Mid(A$, I, 1) )
                        RotateSprite(CharSprite(Size, A), 0, #PB_Absolute)
                        DisplayTransparentSprite(CharSprite(Size, A), X, Y, 255, Color)
                        X + CharW(Size, A)
                Next
        EndIf
EndProcedure

Macro GraphDrawExemple()
InitSpriteCharacter()
Repeat
        Lap0 = Lap
        Lap = ElapsedMilliseconds()
        Delay(16)
        ExamineKeyboard()
        ClearScreen(#BackColor)
        DisplayText(0, 0, Str(Lap - Lap0), 20, RGB(255, 0, 0) )
        FlipBuffers()       
Until KeyboardPushed(#PB_Key_Escape)
EndMacro

Macro AjoutePremier(X)
        Prim(PrimeQuantity) = X
        Prime2(PrimeQuantity) = X * X
        PrimeQuantity + 1
EndMacro

Macro IsPrime5(Nombre)
        bPremier = 1
        For Jprime = 2 To MostPrime2
                If Nombre % Prim(Jprime) = 0
                        bPremier = 0
                        Break
                EndIf
        Next
EndMacro

Macro TestPrime5(Pas)
        If Prime2(MostPrime2 + 1) <= Iprime
                MostPrime2 + 1
        EndIf
        IsPrime5(Iprime)
        If bPremier
                AjoutePremier(Iprime)
        EndIf
        Iprime + Pas
EndMacro

InitScreen()
InitSpriteCharacter("10;20")


nDebut = 5
nFin = 100000
Global Dim Prim.I(nFin)
Global Dim Prime2.I(nFin)
AjoutePremier(2)
AjoutePremier(3)
Iprime = nDebut
Repeat
        TestPrime5(2)
        TestPrime5(4)
Until Iprime > nFin

MaxPrime = PrimeQuantity - 1

BackColor = RGB(0, 0, 255)

CellW = 64
CellH = 24
FirstColumnW = 40
FirstRowH = 80

CribleSp = CreateSprite(#PB_Any, CellW, CellH, #PB_Sprite_AlphaBlending)
If StartDrawing(SpriteOutput(CribleSp) )
        DrawingMode(#PB_2DDrawing_AllChannels)
        W = OutputWidth()
        H = OutputHeight()
        Box(0, 0, W, H, RGBA(0, 0, 0, 255) )
        StopDrawing()
EndIf

Crible1er = CreateSprite(#PB_Any, CellW, CellH, #PB_Sprite_AlphaBlending)
If StartDrawing(SpriteOutput(Crible1er) )
        DrawingMode(#PB_2DDrawing_AllChannels)
        W = OutputWidth()
        H = OutputHeight()
        Box(0, 0, W, H, RGBA(255, 0, 0, 255) )
        StopDrawing()
EndIf

DecalYMax = (CellH * (MaxPrime + 1) ) - (Dh - FirstRowH)
Repeat
        Lap0 = Lap
        Lap = ElapsedMilliseconds()
        Delay(16)
        ExamineKeyboard()
        If KeyboardPushed(#PB_Key_Right)
                DecalAX + 2
        EndIf       
        If KeyboardPushed(#PB_Key_Left)
                DecalAX - 2
        EndIf       
        If KeyboardPushed(#PB_Key_Down)
                DecalAY + 2
        EndIf       
        If KeyboardPushed(#PB_Key_Up)
                DecalAY - 2
        EndIf       
        If DecalAX
                DecalX + DecalAX
                If DecalAX > 0
                        DecalAX - 1
                Else
                        DecalAX + 1
                EndIf
                If DecalX < 0
                        DecalX = 0
                        DecalAX = 0
                EndIf
        EndIf
        If DecalAY
                DecalY + DecalAY
                If DecalAY > 0
                        DecalAY - 1
                Else
                        DecalAY + 1
                EndIf
                If DecalY < 0
                        DecalY = 0
                        DecalAY = 0
                EndIf
                If DecalY > DecalYMax
                        DecalY = DecalYMax
                        DecalAY = 0
                EndIf
        EndIf
        ClearScreen(BackColor)
        DisplayText(0, 0, Str(Lap), 20, RGB(255, 0, 0) )
        Displaytext(200, 0, Str(Prim(MaxPrime) ), 20, RGB(0, 255, 255) )
        JDebutY = DecalY / CellH
        JFinY = JDebutY + ((Dh - FirstRowH) / CellH)
        For I = JDebutY To JFinY
                DisplayText(0, FirstRowH + CellH * I - DecalY, Str(Prim(I) ), 10, RGB(255, 255, 255) )
        Next
        JDebutX = DecalX / CellW + 1
        JFinX = JDebutX + ((Dw - FirstColumnW) / CellW)
        For J = JDebutX To JFinX
                DisplayText(FirstColumnW + CellW * J - DecalX, 40, Str(J), 10, RGB(255, 255, 255), -20)
        Next
        For I = JDebutY To JFinY
                For J = JDebutX To JFinX
                        X = FirstColumnW + CellW * J - DecalX
                        Y = FirstRowH + CellH * I - DecalY
                        If (J % Prim(I) ) = 0
                                If J = Prim(I)
                                        DisplaySprite(Crible1er, X, Y)
                                Else
                                        DisplaySprite(CribleSp, X, Y)
                                EndIf
                        EndIf
                Next
        Next
        FlipBuffers()       
Until KeyboardPushed(#PB_Key_Escape)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Afficher du texte en utilisant le GPU
MessagePosté: Mer 07/Nov/2018 11:07 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6559
Localisation: Isere
Marche niquel 2% CPU
Merci du partage 8)

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Afficher du texte en utilisant le GPU
MessagePosté: Mer 07/Nov/2018 14:20 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 09/Nov/2005 9:53
Messages: 3854
Kwai chang caine a écrit:
Merci du partage 8)

j'interviens juste en coup de vent pour dire qu'on ne dis pas 'merci du partage' mais 'merci pour le partage' (enfin, je crois 8) )

_________________
http://xmas.free.fr/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Portable LENOVO ideapad 110-17ACL 64 bits
Version de PB : 5.60 - 32 bits


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Afficher du texte en utilisant le GPU
MessagePosté: Mer 07/Nov/2018 14:33 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 24/Aoû/2005 10:42
Messages: 438
Règle 1 : Lorsque « merci » est suivi d’un nom, vous avez le choix entre « de » et « pour ». Certaines personnes affirment cependant que l’usage de « de » se réfère plutôt au futur alors que celui de « pour » fait plus référence au passé. Girodet estime que « de » est utilisé dans un langage plus soutenu que « merci pour ». Une chose est sûre, l’Académie Française n’a pas tranché donc le choix reste libre !

Exemples : Merci de votre aide demain. Merci pour votre lettre qui est arrivée hier. Merci de votre attention / Merci pour votre attention.

Règle 2 : Lorsque « merci » précède un verbe à l’infinitif, alors il est TOUJOURS suivi de « de » :

Exemples : Merci d’avoir écrit cette lettre. Merci de manger rapidement votre nourriture.

_________________
Bureau : Win10 64bits
Maison : Macbook Pro 13" Retina / SSD 512 Go / Ram 16 Go - iPad Pro 32 Go (pour madame) - iPhone X 256 Go


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Afficher du texte en utilisant le GPU
MessagePosté: Mer 07/Nov/2018 17:00 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 09/Nov/2005 9:53
Messages: 3854
Merci de ton partage :lol: 8) 8)

_________________
http://xmas.free.fr/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Portable LENOVO ideapad 110-17ACL 64 bits
Version de PB : 5.60 - 32 bits


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Afficher du texte en utilisant le GPU
MessagePosté: Jeu 08/Nov/2018 16:58 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6559
Localisation: Isere
Citation:
j'interviens juste en coup de vent pour dire qu'on ne dis pas 'merci du partage' mais 'merci pour le partage' (enfin, je crois 8) )
Aaaah !! 8O
Le radiateur des cours de français était un bon support dans toute ma scolarité :mrgreen:

@Mindphazer
Merci de cette explication "Mindphazer" 8)

Mais comme c'est un peu compliqué pour moi :oops:
Et dans le but de ne plus offusquer les "yeureilles" sensibles de mon vieux copain SPH :wink:
Je dirais donc :

Merci du partage
Merci pour le partage
Merci de partager
Merci de ton partage
Merci d'avoir partagé

Ca sera juste un peu plus long !! :mrgreen: :lol:

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Afficher du texte en utilisant le GPU
MessagePosté: Jeu 08/Nov/2018 17:23 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 09/Nov/2005 9:53
Messages: 3854
Kwai chang caine a écrit:
Merci de cette explication "Mindphazer" 8)

"Merci POUR cette explication" :P

_________________
http://xmas.free.fr/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Portable LENOVO ideapad 110-17ACL 64 bits
Version de PB : 5.60 - 32 bits


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Afficher du texte en utilisant le GPU
MessagePosté: Ven 09/Nov/2018 18:12 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6559
Localisation: Isere
:lol: :lol:

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 8 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye