Comment garder l'utilisation de la RAM ci-dessous 90MB? (images de mise à l'échelle) Spécialement

StackOverflow https://stackoverflow.com/questions/3873819

Question

Je développe une application pour WP7 (VS2010 Express pour Windows Phone RTM et WP Emulator), mais maintenant im face à un gros problème lié à l'utilisation de la mémoire. L'application elle-même a comme 12 vues, et certains d'entre eux sont réutilisés avec des données différentes. Il est un lecteur de news, de sorte que les points de vue sont la plupart du temps listboxes (vignette de l'image, stackpanels et TextBlocks).

La première vue est une zone de liste avec 30 articles. Cela prend environ 20 Mo de RAM, mais comme naviguer entre les vues de l'utilisation de la RAM actuelle et de pointe commencent à augmenter. Eh bien l'utilisation de pointe, il est autour de 55 Mo qui je pense est OK, mais l'application a une section de la galerie dans laquelle, après avoir sélectionné une vignette, il accède à une autre vue qui affiche une image téléchargée (JPEG, 1131px × 1647px, ~ 486kb) mais correspondait au départ à l'écran. Jusqu'à ici tout bon, mais pour mise à l'échelle des fins que je utilise Laurent Bugnion Multitouch Comportement et de le problème est que lorsque i zoom dans l'image, l'utilisation de la mémoire est près de 90Mo (comme 87MB dernière fois que je l'ai testé avec la taille de l'échelle maximale à 2,5).

En outre, après naviguer les points de vue de l'utilisation de la RAM actuelle peut permantly atteindre et séjour à 35Mo, que je beleive est dû au dispositif de mise en cache des choses.

Alors, comme le dit le titre, comment puis-je éviter énorme utilisation de la RAM?

Modifier ---- Aussi je voudrais demander si le fait que dans mon application, on peut naviguer d'une vue de presque tous les autres et que entre il y a toujours une animation de transition de page (comme celui pour la liste téléphonique modèle d'application dans les outils bêta), peuvent contribuer à l'utilisation excessive de la mémoire.

Était-ce utile?

La solution 2

Eh bien je devrais peut-être examiner DeepZoom (mais quand je l'ai lu à ce sujet, je pensais qu'il était pour l'utiliser avec la même image à différentes tailles, comme les cartes google en vue satellite), mais hier je l'ai résolu en utilisant un webbrowser l'intérieur de mon point de vue, si avant que j'avais:

<Image x:Name="imgPlaceHolder" delay:LowProfileImageLoader.UriSource="{Binding Path=ActualImageSource}" MaxHeight="800"
               MaxWidth="480" >
            <interac:Interaction.Behaviors >
                <tbeh:MultiTouchBehavior x:Name="ImageMTB" IsScaleEnabled="True"
                                                 MinimumScale="0.4"
                                                 MaximumScale="2.5"
                                                 IsRotateEnabled="False"
                                                 IsDebugModeActive="False"
                                                 IsTranslateXEnabled="True"
                                                 IsTranslateYEnabled="True"

                                     >

                </tbeh:MultiTouchBehavior>
            </interac:Interaction.Behaviors>
        </Image>

J'ai changé cela à:

<phone:WebBrowser Source="{Binding Path=ActualImageSource}" x:Name="wbbigimage"  />

Il utilise moins de mémoire et prend en charge le zoom sans problème.

Je vais attendre un peu pour quelqu'un avec une meilleure solution avant de vérifier celui-ci.

Autres conseils

D'une manière générale, vous voulez garder des images aussi petit que possible (dans les dimensions et la profondeur des couleurs, pas nécessairement la taille du fichier). Pour afficher une image, l'appareil doit décomprimer à une Bitmap réelle, donc dans ce cas, vous êtes à la recherche à une image 1131x1647pixel, disons à 16bpp, signifie que vous avez une empreinte mémoire 3.7MB pour l'image, et non la la taille du fichier 486k.

En fonction de votre zoom / rotation, il peut y avoir un second tampon de copie, de sorte que vous pouvez effectivement le double. Il ne faut pas longtemps à ce rythme pour arriver à 90Mo. Je serais certainement essayer soit télécharger des fichiers plus petits d'images ou essayez de les redimensionner localement, puis en utilisant l'image redimensionnée.

Un couple de choses à noter. Tout d'abord, assurez-vous que vous éliminiez des listes ou des images que vous utilisez sur les pages durring la méthode onNavigatedFrom. Les offres de WP7 façon avec des images est « intéressante ». L'une des choses que j'ai trouvé à l'aide est à null sur l'arrière-plan de tout contrôle de panorama lorsque la page n'est pas affiché.

En ce qui concerne votre question spécifique, avez-vous pensé à utiliser un MultiScaleImage (Deep Zoom) pour réduire la mémoire?

http: // msdn .microsoft.com / fr-fr / bibliothèque / system.windows.controls.multiscaleimage (VS.95) .aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top