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

Delphi Discussion :

Réduire la mémoire qu'utilise mon application Android


Sujet :

Delphi

  1. #1
    Membre du Club

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 58
    Points : 43
    Points
    43
    Billets dans le blog
    1
    Par défaut Réduire la mémoire qu'utilise mon application Android
    Bonsoir tout le monde ! J'ai un problème depuis quelque temps avec le développement des applications Android avec Delphi. J'Utilise EDI RAD STUDIO Berlin actuellement. Mon problème est que lorsque je crée dynamiquement des TRectangle l'application consomme environ 1,2 Mo de la mémoire RAM et si je laisse cela pendant des heures cela consomme davantage. Je ne comprends pas comment faire pour résoudre ce problème. Pourriez-vous m'aider ? Je tiens à rappeler que les applications tournent sur Android 7.0.

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 490
    Points
    15 490
    Billets dans le blog
    9
    Par défaut
    Bonsoir ! Eh bien, c'est certainement qu'il y a des objets qui sont créés et qui ne sont pas détruits. Par exemple, un Free qui est à la fin d'une procédure et qui dans certains cas n'est pas appelé... Ou encore un constructeur mal écrit, qui fait appel à d'autres constructeurs sans prévoir le cas où l'objet est recréé sans nouvelle allocation de mémoire. C'est forcément quelque chose comme ça.

    Bon courage ! Montrez-nous votre code si vous voulez une aide plus efficace.

  3. #3
    Membre du Club

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 58
    Points : 43
    Points
    43
    Billets dans le blog
    1
    Par défaut Voici le code de objet que j'ai instancié !
    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
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
     
     
      CardM = class(TObject)
     
      private
          Cadre : TRectangle ;
          Titre,Detail,Image  :String;
          Hauteur : integer;
          Constructor Create(SParent:TVertScrollBox;STitre,SDetail,SImage:string);
          destructor destroy ; override;
     end;
     
     
      CardV = class(TObject)
     
       private
     
       ScrollBox :    TVertScrollBox;
       Cadres:         array of CardM;
       MyTaille :     Integer ;
     
       public
     
       procedure CreerDefCardM(sTitre,sImage,sDetail:string) ; 
       constructor Create(sParent: TLayout);
       destructor  destroy ;  virtual ;
     
       end;
     
     
    implementation
     
    uses FMX.Dialogs;
     
    { CardV }
     
     
     
    procedure CardV.CreerDefCardM(sTitre,sImage,sDetail:string) ;
    begin
     
       if ((sTitre.Length)>0) and ((sImage.Length)>4) and (sDetail.Length<=155)  then
       begin
     
          inc(Self.MyTaille);
          SetLength(Cadres,Self.Mytaille+1);
          Cadres[Mytaille]:=SimpleCard.Create(ScrollBox,sTitre,sDetail,sImage);
      end;
     
    end;
     
    destructor CardV.destroy;
    begin
     
    end;
     
    { SimpleCard }
     
    constructor CardM.create(SParent:TVertScrollBox;STitre,SDetail,SImage:string);
    begin
     
        with Self do
        begin
          Titre :=STitre;
          Detail :=SDetail;
          Image :=SImage;
        end;
     
      Cadre := Trectangle.Create(nil);
      with Cadre do
            begin
            Align:=TAlignLayout.Top;
            Parent:=SParent;
            with Margins do
            begin
            Left:=10;
            Right:=10;
            Bottom:=10;
            Top:=10;
            end;
           Height:= 320;
           Stroke.Color :=TAlphaColorRec.Null;
           Fill.Color:=TAlphaColorRec.White;
          end;
     
     
         with TLabel.Create(nil) do
         begin
           Text := Self.titre;
           Font.Family := 'Arial';
           Align := TAlignLayout.Top;
           with Margins do
            begin
              Left:=8;
              Right:=10;
              Bottom:=10;
              Top:=5;
           end;
           TextAlign:=TTextAlign.Leading;
           Parent :=  Self.Cadre;
         end;
     
          With TShadowEffect.Create(Cadre) do
          begin
             parent := Cadre;
             ShadowColor := $FF9B9898;
          end;
     
          with TText.Create(Self.Cadre) do
          begin
             Align:=TAlignLayout.Client;
             Parent:=Self.Cadre;
             with Margins do
             begin
             Left:=10;
             Right:=10;
             Bottom:=5;
             Top:=10;
            end;
            with TextSettings do
            begin
             HorzAlign := TTextAlign.Leading;
             VertAlign:=TTextALign.Leading;
             Trimming:=TTextTrimming.character;
            end;
             Color := $FF858585;
             Text :=Self.Detail;
          end;
     
     
          with TImage.Create(nil) do
          begin
           Parent :=Self.Cadre;
           Align:=TAlignLayout.Top;
           Height:=200;
           WrapMode:=TImageWrapMode.Stretch;
           Bitmap.LoadFromFile(TPath.GetDocumentsPath + PathDelim + 'xdg.jpg');   // Lien utilisé pour faire des tests TPath.GetDocumentsPath + PathDelim + 'xdg.jpg'
     
          end;
     
     
    end;
     
    destructor CardM.destroy;
    begin
      inherited;
    end;

  4. #4
    Membre du Club

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 58
    Points : 43
    Points
    43
    Billets dans le blog
    1
    Par défaut Voici le code de l'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
    begin
     with CardV.Create(Layout1) do
     begin
     for I := 0 to 100 do
     CreerDefCardM('Titre '+intTostr(I),'jjnjhhhj','jjjj');
     end;
    end;
    Je voulais réalisé des cartes un semblable aux cartes de jeux donc je me suis dis que les objets de devraient car l'utilisateur doit pouvoir intéragir avec les cartes en les touchants être libéré est-ce vrai ?
    NB : Il y a un composant TLayout qui a été ajouter sur la fiche !

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 490
    Points
    15 490
    Billets dans le blog
    9
    Par défaut
    Déjà, là, il y a un problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
    begin
     with CardV.Create(Layout1) do
     begin
     for I := 0 to 100 do
     CreerDefCardM('Titre '+intTostr(I),'jjnjhhhj','jjjj');
     end;
    end;
    L'objet CardV créé n'est jamais détruit.

    Ensuite, à quoi sert le code suivant ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    destructor CardV.destroy;
    begin
     
    end;
    Enfin, sauf erreur de ma part, rien n'est prévu pour libérer les objets créés dans le constructeur de la classe CardM ! Bref vous créez des objets sans vous inquiéter de les libérer.

    Bon courage !

  6. #6
    Membre du Club

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 58
    Points : 43
    Points
    43
    Billets dans le blog
    1
    Par défaut
    Merci de votre réponse ! En realité je me disais qu'étant donné que je veux utiliser interagir avec l'objet je n'avais pas besoin de le détruire ! Un peu comme lors de la création d'une ListView.

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    Attention Roland, sur Mobile Delphi utilise ARC, donc tout objet est automatiquement détruit quand il est hors de portée...sauf s'il existe un lien (parent->enfant par exemple) qui le garde en vie

  8. #8
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 490
    Points
    15 490
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    Attention Roland, sur Mobile Delphi utilise ARC, donc tout objet est automatiquement détruit quand il est hors de portée...
    Ah d'accord. Je ne savais pas. J'aurais dû préciser que je n'ai aucune expérience de développement d'une application Android avec Delphi.

  9. #9
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 442
    Points : 5 862
    Points
    5 862
    Par défaut
    salut

    le truc justement c'est d'avoir le moins de truc en mémoire
    d'avoir un canvas unique ou tu dessine tes carte et de ne charger que les ressource que tu as besoin
    il y a des algorithme que ce sont pencher sur les problème d'affichage tes que le zbuffer et autres joyeuseté

    imagine avec ta technique tu charge 100 image de 10 mega et au final tu ne vois que les carte au dessus du tas
    cela n'as que très peu de sens

  10. #10
    Membre du Club

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 58
    Points : 43
    Points
    43
    Billets dans le blog
    1
    Par défaut
    Merci pour ta réponse ! Je vais essayer une nouvelle approche !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Android Studio : mon app s'ouvre et se referme aussitôt
    Par gary45 dans le forum Android Studio
    Réponses: 5
    Dernier message: 17/03/2017, 12h27
  2. [Android] consommation memoire dans mon app
    Par sinzen dans le forum Android
    Réponses: 16
    Dernier message: 17/12/2016, 15h23
  3. Quelle base de données pour mon app Android
    Par Emy1992 dans le forum Android
    Réponses: 1
    Dernier message: 15/07/2013, 01h45
  4. Android instance unique de mon app
    Par n2engineer5 dans le forum Android
    Réponses: 9
    Dernier message: 25/04/2012, 09h09
  5. [SERVLET][EJB][Noob]Utiliser mon SERVLET avec mon EJB
    Par Devil666 dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 15/04/2005, 13h45

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