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

VB.NET Discussion :

Demande de conseils pour utilisation de controles.


Sujet :

VB.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 169
    Points : 60
    Points
    60
    Par défaut Demande de conseils pour utilisation de controles.
    Bonjour.

    Je m'amuse à créer un "Map Editor" pour enregistrer un fichier txt affin de me permettre de réaliser un jeu 2D en C++ à l'aide de la librairie SDL2.

    J'ai débuté le développement du logiciel et j'ai opté pour cette solution :

    Charger l'image, définir le nombre de tuiles (l'utilisateur inscrit ce nombre dans un Numeric Up Down) pour la hauteur et la largeur de l'image chargée.
    Découper l'image en fonction de ces valeurs et afficher les différentes tuiles dans un tableau de PictureBox de façon dynamique.

    J'ai fais les premiers essais à l'instant et... c'est trèèèès lent !!!

    J'aurais donc aimé savoir si vous n'aviez pas de conseils pour opter sur d'autres solutions.

    Merci !

  2. #2
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Bonjour,

    C'est une très mauvaise idée d'essayer d'utiliser WinForm pour faire un jeu car ce dernier est fait pour des applications de bureau et n'utilise ni la carte graphique, ni toute la puissance du CPU.
    La vrai technologie dotNet pour les jeu est XNA, je vous conseille de vous y intéresse si vous voulez continuer dans cette voie.
    Le WPF est aussi plus puissant que WinForm pour la partie graphique car lui utilise le GPU mais encore une fois, préférez lui XNA qui est fait pour.

  3. #3
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 169
    Points : 60
    Points
    60
    Par défaut
    Ah non mais je ne fais pas le jeu en WinForm ! Juste une simple manipulation de petites images de 16*16 pixels c'est ridicule je pense ! après je traduis l'image finale en texte avec des numéros !

    Enfin je pense que c'est faisable ! Après si vous m'affirmez que manipuler quelques images de 16*16 est pas trop possible je m'en remettrais à vos solutions .

    Merci

  4. #4
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    C'est quoi le principe en fait ?

    Tu prends une image 16*16, que tu découpes disons, en x lignes et y colonnes... donc x*y images.

    Et après tu traduis les pixels en lettres ?

    C'est quoi qui prends beaucoup de temps ?
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  5. #5
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Désolé j'avais mal compris.
    Je suppose que vous découpez en énormément de morceau votre image. Une bête grille de 10 sur 10 nous fait de suite 100 PictureBox qui sont très lourd à gérer pour WinForm, imaginez avec plus que 10 sur 10.
    Personnellement j'ai commencé à apprendre WPF quand je devais mettre une vingtaine de UserControl dans une listeBox et que winForm avait du mal à les gérer. Passage à WPF avec la même logique et plus aucun soucis.

  6. #6
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 169
    Points : 60
    Points
    60
    Par défaut
    Non pas du tout ! En fait j'ai une image tileset (on en trouve partout sur le net) et je la découpe pour obtenir les différentes Tiles (genre une image avec 12 Tiles de large et 10 de hauteur, je trouverais la taille d'une tile en prenant la taille totale de l'image et en divisant par 12 pour trouver x et par 10 pour trouver y, la je me retrouve avec une tile.) après dans mon fichier je ne fais qu'enregistrer le numéro de la tile (pour la première tile le n°1 la seconde n°2 etc après par mon programme en c++ je retrouve les découpes et quelle image afficher (je me sers du tutoriel tile mapping sur le site). Mais du coup je manipule maxi 100 petites images en moyenne de 16*16 pixels ! Mais vraiment Max donc je pense qu'il doit exister un contrôle ou une méthode pour le faire !

  7. #7
    Membre expérimenté

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Points : 1 672
    Points
    1 672
    Par défaut
    Euh, mais c'est quoi au juste qui est lent ? Le chargement de l'image, la réactivité de ton logiciel, ... ? Faut être un peu plus précis, là... !

  8. #8
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    C'est vrai qu'il faudrait essayer d'identifier quelle partie de l'application prend tout ce temps.
    Est-ce le découpage, l'affichage, l'enregistrement? Car 100 images de 16*16 ça ne devrait pas trop se voir.

  9. #9
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 169
    Points : 60
    Points
    60
    Par défaut
    J'exagère peut-être un peut en disant "trèèèès lent" mais disons que si déjà pour afficher 90 images de 16*16 ça me prends a peine moins d'une seconde je me demande simplement si des picturebox c'est le bon moyen pour faire ce que je désire !

    Ce qui est lent c'est au moment ou je lui demande de me découper et afficher les images ! presque une seconde.

    Certe c'est pas énorme mais ma map elle, va en contenir plus de 1000 ou plus !

    Donc si avec 100 ça me prends 1 seconde, gérer une map complète peut vite être lent !

    Si vous comprenez ce que je veux dire :s

  10. #10
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 169
    Points : 60
    Points
    60
    Par défaut
    Le WPF en fait c'est en gros la même chose non ?

    Enfin dans le fond je comprends bien que non mais au niveau du langage de programmation ? Le nom des contrôles change mais après on développe comme en vb.net ?

  11. #11
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Tu peux utiliser la class Stopwatch avec des Debug.Writeline pour voir où ton code ralenti, se serait déjà bien de le savoir.
    WPF est fortement différent mais on peut l'employer comme du WinForm sans soucis en glissant/déposant les Control sur l'éditeur au lieux d'écrire en XAML et en utilisant le nommage des composants au lieu d'utiliser le binding. C'est comme ça que j'ai commencé.

  12. #12
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 169
    Points : 60
    Points
    60
    Par défaut
    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
     For i As Integer = 0 To NB_Tiles_Hauteur_Image
     
                For j As Integer = 0 To NB_Tiles_Largeur_Image
     
                    Tiles.Add(New PictureBox)
                    Tiles(Tiles.Count - 1).SizeMode = PictureBoxSizeMode.AutoSize
     
                    W = j * (Tileset_Map.Width / NB_Tiles_Largeur_Image)
                    H = i * (Tileset_Map.Height / NB_Tiles_Hauteur_Image)
                    X = Tileset_Map.Width / NB_Tiles_Largeur_Image
                    Y = Tileset_Map.Height / NB_Tiles_Hauteur_Image
     
                    sourceRectangle = New Rectangle(W, H, X, Y) 'on définit un rectangle 
     
                    secondBitmap = Tileset_Map.Clone(sourceRectangle, PixelFormat.DontCare)
     
                    Tiles(Tiles.Count - 1).Image = secondBitmap
                    Controls.Add(Tiles(Tiles.Count - 1))
     
                Next
     
            Next
    C'est cette partie qui me ralentis tout !

  13. #13
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Bonsoir,

    J'ai vite testé de séparer le code :
    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
      Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Tileset_Map = Image.FromFile("D:\Image\Jardin\10003928_633714436676206_313013597_n.jpg")
            FlowLayoutPanel1.SuspendLayout()
            Dim lImage As New List(Of Image)
            Dim sw As New Stopwatch
            sw.Start()
            For i As Integer = 0 To NB_Tiles_Hauteur_Image
     
                For j As Integer = 0 To NB_Tiles_Largeur_Image
     
     
                    Dim W As Object
                    Dim H As Object
                    Dim X As Object
                    Dim Y As Object
                    Debug.WriteLine(i & " : " & j)
                    W = j * (Tileset_Map.Width / NB_Tiles_Largeur_Image)
                    H = i * (Tileset_Map.Height / NB_Tiles_Hauteur_Image)
                    X = Tileset_Map.Width / NB_Tiles_Largeur_Image
                    Y = Tileset_Map.Height / NB_Tiles_Hauteur_Image
                    If W >= Tileset_Map.Width Then Continue For 
                    If H >= Tileset_Map.Height Then Continue For
                    If W + X > Tileset_Map.Width Then X = Tileset_Map.Width - W
                    If H + Y > Tileset_Map.Height Then Y = Tileset_Map.Height - Y
     
                    Debug.WriteLine("Temps avant : " & sw.ElapsedMilliseconds)
                    Dim sourceRectangle As Rectangle
                    sourceRectangle = New Rectangle(W, H, X, Y) 'on définit un rectangle 
     
                    Dim secondBitmap = Tileset_Map.Clone(sourceRectangle, Imaging.PixelFormat.DontCare)
                    Debug.WriteLine("Temps après : " & sw.ElapsedMilliseconds)
     
                    lImage.Add(secondBitmap)
     
     
                Next
     
            Next
     
            For i As Integer = 0 To lImage.Count - 1
                Debug.WriteLine("insertion image " & i)
                Tiles.Add(New PictureBox)
                Tiles(Tiles.Count - 1).SizeMode = PictureBoxSizeMode.AutoSize
                Tiles(Tiles.Count - 1).Image = lImage(i)
                FlowLayoutPanel1.Controls.Add(Tiles(Tiles.Count - 1))
            Next
     
     
            FlowLayoutPanel1.ResumeLayout()
        End Sub
    Et le problème se situe au niveau du découpage par la méthode clone.
    Elle prend en moyenne 15ms sur mon PC qui multiplié par 100 nous donnes 1,5 secondes... CQFD...

  14. #14
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Même test avec WPF :
    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
    Class MainWindow 
        Public Property NB_Tiles_Hauteur_Image As Integer = 30
        Public Property NB_Tiles_Largeur_Image As Integer = 30
        Public Property Tileset_Map As BitmapImage
     
        Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
            Tileset_Map = New BitmapImage(New Uri("D:\Image\Jardin\10003928_633714436676206_313013597_n.jpg"))
     
            Dim lImage As New List(Of CroppedBitmap)
            Dim sw As New Stopwatch
            sw.Start()
            For i As Integer = 0 To NB_Tiles_Hauteur_Image
     
                For j As Integer = 0 To NB_Tiles_Largeur_Image
     
     
                    Dim W As Object
                    Dim H As Object
                    Dim X As Object
                    Dim Y As Object
                    Debug.WriteLine(i & " : " & j)
                    W = j * (Tileset_Map.Width / NB_Tiles_Largeur_Image)
                    H = i * (Tileset_Map.Height / NB_Tiles_Hauteur_Image)
                    X = Tileset_Map.Width / NB_Tiles_Largeur_Image
                    Y = Tileset_Map.Height / NB_Tiles_Hauteur_Image
                    If W >= Tileset_Map.Width Then Continue For
                    If H >= Tileset_Map.Height Then Continue For
                    If W + X > Tileset_Map.Width Then X = Tileset_Map.Width - W
                    If H + Y > Tileset_Map.Height Then Y = Tileset_Map.Height - Y
     
                    Debug.WriteLine("Temps avant : " & sw.ElapsedMilliseconds)
                    Dim sourceRectangle As Int32Rect
                    sourceRectangle = New Int32Rect(W, H, X, Y) 'on définit un rectangle 
     
                    Dim secondBitmap As New CroppedBitmap(Tileset_Map, sourceRectangle)
                    Debug.WriteLine("Temps après : " & sw.ElapsedMilliseconds)
     
                    lImage.Add(secondBitmap)
     
     
                Next
     
            Next
     
            For i As Integer = 0 To lImage.Count - 1
                Debug.WriteLine("insertion image " & i)
                WrapPanel1.Children.Add(New Image() With {.Source = lImage(i), .Width = 10, .Height = 10})
            Next
        End Sub
    End Class
    Bingo .

    WPF : 1,9 seconde pour 900 découpages et affichages, moyenne par découpage 1 à 2 ms
    WinForm : 17,9 seconde pour 900 découpages et affichages, moyenne par découpage 15 à 18 ms

    Et après il faut voir la réactivité de l'interface lors d'un redimensionnement, WinForm galère et c'est normal, WPF c'est 100% fluide, et c'est normal aussi...

Discussions similaires

  1. demande de conseil pour utilisation de grep
    Par JoneZy dans le forum Linux
    Réponses: 2
    Dernier message: 01/11/2009, 12h11
  2. Réponses: 1
    Dernier message: 06/10/2009, 10h39
  3. demande de conseil pour l'utilisation du BIRT
    Par amarige dans le forum BIRT
    Réponses: 2
    Dernier message: 05/12/2007, 22h28
  4. Réponses: 3
    Dernier message: 24/12/2004, 12h21
  5. Demande de conseil pour migration de lignes vers colonnes
    Par ririd dans le forum Administration
    Réponses: 6
    Dernier message: 04/11/2004, 17h02

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