Canvas utiliser un base de donnée mémoire

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Canvas utiliser un base de donnée mémoire

Message par microdevweb »

Bonjour à tous,

Je vous propose deux exemples de gestion d'item sur canvas, le canvas fait 3000X3000 pxl et reprend 22500 items.

Premier exemple avec recherche par boucle

:arrow: ICI

Placez vous sur le dernier item (tous en-bas à droite) le temps chez moi varie de 5 à 9 millisecondes.

Deuxième exemple avec recherche par base de donnée mémoire

:arrow: ICI

Nb: le dessin est moins rapide,

Placez vous sur le dernier item (tous en-bas à droite) le temps chez moi varie de 3 à 7 millisecondes. Mais la recherche à l'air plus fluide.

Ce qui est sur c'est PureBasic est vraiment rapide (dans les deux cas)
N'hésitez pas à donné votre avis

J'ai fais d'autres testes en modifiant W à 5 (90000 items)

La recherche par boucle sur le dernier item varie en 20 et 30
La recherche par Db donne un résultat similaire, mais le dessin est vraiment long

Avec W à 2 (562500 items)

La recherche par boucle sur le dernier item varie en 70 et 100 (proc max 24 et mémoire 55.036 K)
La recherche par Db donne un résultat similaire (proc max 14 et mémoire 73.080 K) , mais le dessin est vraiment long et provoque des risques de plantage

Donc pour résumé, bien que la recherche par Db soit légèrement plus rapide le gain n'est pas asse significatif par rapport aux contraintes.
Dernière modification par microdevweb le jeu. 28/avr./2016 8:48, modifié 6 fois.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Canvas utiliser un base de donnée mémoire

Message par microdevweb »

Premier exemple avec recherche par boucle

Code : Tout sélectionner

EnableExplicit
#MainForm=0
#MainArea=0
#MainCanvas=1
Structure item
    id.i
    X.i
    Y.i 
EndStructure
Global NewList myItem.item()
Global WF,HF,W=10,gMouseX,gMouseY
Procedure Exit()
    End
EndProcedure
Procedure WhereIsMouse()
    Protected CurrentTime,TimeElapsed
    CurrentTime=ElapsedMilliseconds()
    ForEach myItem()
        With myItem()
            If (gMouseX>=\X And gMouseX<=(\X+W)) And (gMouseY>=\Y And gMouseY<=(\Y+W)) 
                TimeElapsed=ElapsedMilliseconds()-CurrentTime
                SetGadgetAttribute(#MainCanvas,#PB_Canvas_Cursor,#PB_Cursor_Hand)
                Debug "Vous êtes sur l'item "+Str(\id)+" le temps nécessaire est de "+Str(TimeElapsed)+" milisecondes"
                ProcedureReturn #True
            EndIf
        EndWith
    Next
    ProcedureReturn #False
EndProcedure
Procedure EventCanvas()
    Select EventType()
        Case #PB_EventType_MouseMove
            gMouseX=GetGadgetAttribute(#MainCanvas,#PB_Canvas_MouseX)
            gMouseY=GetGadgetAttribute(#MainCanvas,#PB_Canvas_MouseY)
            If WhereIsMouse():ProcedureReturn :EndIf
            SetGadgetAttribute(#MainCanvas,#PB_Canvas_Cursor,#PB_Cursor_Default)
    EndSelect
EndProcedure
Procedure DrawSample()
    Protected X,Y,N
    ; Dessine des carrés sur le canvas
    StartDrawing(CanvasOutput(#MainCanvas))
    For X=W To 3000-W Step 0
        Y=W
        For Y=W To 3000-W Step 0
            N+1
            Box(X,Y,W,W,$00FC7C)
            ; Ajout de l'item à la liste
            AddElement(myItem())
            With myItem()
                \id=N
                \X=X
                \Y=Y
            EndWith
            Y+(W*2)
        Next
        X+(W*2)
    Next
    Debug N
    StopDrawing()
EndProcedure
Procedure OpenMainForm()
    Protected flag=#PB_Window_SystemMenu|#PB_Window_Maximize
    OpenWindow(#MainForm,0,0,800,600,"teste",flag)
    WF=WindowWidth(#MainForm)
    HF=WindowHeight(#MainForm)
    ScrollAreaGadget(#MainArea,0,0,WF,HF,3000,3000)
    CanvasGadget(#MainCanvas,0,0,3000,3000)
    CloseGadgetList()
    DrawSample()
    SetGadgetAttribute(#MainArea,#PB_ScrollArea_X,3000)
    SetGadgetAttribute(#MainArea,#PB_ScrollArea_Y,3000)
    BindEvent(#PB_Event_CloseWindow,@Exit(),#MainForm)
    BindGadgetEvent(#MainCanvas,@EventCanvas())
EndProcedure

OpenMainForm()
Repeat:WaitWindowEvent():ForEver
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Canvas utiliser un base de donnée mémoire

Message par microdevweb »

Deuxième exemple avec recherche par base de donnée mémoire

Code : Tout sélectionner

EnableExplicit
UseSQLiteDatabase()
#MainForm=0
#MainArea=0
#MainCanvas=1
Structure item
    id.i
    X.i
    Y.i 
EndStructure
Global NewList myItem.item()
Global WF,HF,W=10,gMouseX,gMouseY,Db
Procedure Exit()
    End
EndProcedure
Procedure WhereIsMouse()
    Protected CurrentTime,TimeElapsed,query.s
    CurrentTime=ElapsedMilliseconds()
    ; Recherche de l'item depuis la Db
    query="SELECT id FROM item WHERE (X1<="+Str(gMouseX)
    query+" AND X2>="+Str(gMouseX)+") AND ("
    query+"Y1<="+Str(gMouseY)+" AND Y2>="+Str(gMouseY)+")"
    If DatabaseQuery(Db,query)=0
        MessageRequester("Erreur",DatabaseError())
        End
    EndIf
    If FirstDatabaseRow(Db)<>0
        SelectElement(myItem(),GetDatabaseLong(Db,0))
        FinishDatabaseQuery(Db)
        TimeElapsed=ElapsedMilliseconds()-CurrentTime
        SetGadgetAttribute(#MainCanvas,#PB_Canvas_Cursor,#PB_Cursor_Hand)
        Debug "Vous êtes sur l'item "+Str(myItem()\id)+" le temps nécessaire est de "+Str(TimeElapsed)+" milisecondes"
        ProcedureReturn #True
    EndIf            
    ProcedureReturn #False
EndProcedure
Procedure EventCanvas()
    Select EventType()
        Case #PB_EventType_MouseMove
            gMouseX=GetGadgetAttribute(#MainCanvas,#PB_Canvas_MouseX)
            gMouseY=GetGadgetAttribute(#MainCanvas,#PB_Canvas_MouseY)
            If WhereIsMouse():ProcedureReturn :EndIf
            SetGadgetAttribute(#MainCanvas,#PB_Canvas_Cursor,#PB_Cursor_Default)
    EndSelect
EndProcedure
Procedure MakeMemorisDb()
    Protected query.s
    Db=OpenDatabase(#PB_Any,":memory:","","")
    query="CREATE TABLE item ("
    query+"id INTEGER,"
    query+"X1 INTEGER,"
    query+"X2 INTEGER,"
    query+"Y1 INTEGER,"
    query+"Y2 INTEGER)"
    If DatabaseUpdate(Db,query)=0
        MessageRequester("Erreur",DatabaseError())
        End
    EndIf
EndProcedure
Procedure AddItemToMemoris(X,Y)
    Protected query.s
    query="INSERT INTO item ("
    query+"id,X1,Y1,X2,Y2) VALUES ("
    query+Str(ListIndex(myItem()))+","+Str(X)+","+Str(Y)+","+Str(X+W)+","+Str(Y+W)+")"
    If DatabaseUpdate(Db,query)=0
        MessageRequester("Erreur",DatabaseError())
        End
    EndIf
EndProcedure
Procedure DrawSample()
    Protected X,Y,N
    ; Dessine des carrés sur le canvas
    StartDrawing(CanvasOutput(#MainCanvas))
    For X=W To 3000-W Step 0
        Y=W
        For Y=W To 3000-W Step 0
            N+1
            Box(X,Y,W,W,$00FC7C)
            ; Ajout de l'item à la liste
            AddElement(myItem())
            With myItem()
                \id=N
                \X=X
                \Y=Y
                AddItemToMemoris(\X,\Y)
            EndWith
            Y+(W*2)
        Next
        X+(W*2)
    Next
    StopDrawing()
EndProcedure
Procedure OpenMainForm()
    Protected flag=#PB_Window_SystemMenu|#PB_Window_Maximize
    MakeMemorisDb()
    OpenWindow(#MainForm,0,0,800,600,"teste",flag)
    WF=WindowWidth(#MainForm)
    HF=WindowHeight(#MainForm)
    ScrollAreaGadget(#MainArea,0,0,WF,HF,3000,3000)
    CanvasGadget(#MainCanvas,0,0,3000,3000)
    CloseGadgetList()
    DrawSample()
    SetGadgetAttribute(#MainArea,#PB_ScrollArea_X,3000)
    SetGadgetAttribute(#MainArea,#PB_ScrollArea_Y,3000)
    BindEvent(#PB_Event_CloseWindow,@Exit(),#MainForm)
    BindGadgetEvent(#MainCanvas,@EventCanvas())
EndProcedure

OpenMainForm()
Repeat:WaitWindowEvent():ForEver
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: Canvas utiliser un base de donnée mémoire

Message par Shadow »

Salut,

Ah ça c'est pour moi j'en suis sur ^^
Merci, ça risque fort de me servir.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Répondre