2010-10-06 27 views
4

Je développe une application pour WP7 (VS2010 Express pour Windows Phone RTM et WP Emulator), mais maintenant je suis confronté à 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. C'est un lecteur de news, donc les vues sont principalement des listboxes (vignette d'image, stackpanels et textblocks).Comment conserver l'utilisation de la RAM inférieure à 90 Mo? (Mise à l'échelle spéciale des images)

La première vue a une zone de liste avec 30 éléments. Cela prend environ 20 Mo de RAM, mais lorsque je navigue entre les vues, l'utilisation actuelle et maximale de la RAM commence à augmenter. Eh bien, l'utilisation de pointe est autour de 55MB, je pense que c'est OK, mais l'application a une section galerie dans laquelle après avoir sélectionné une vignette, elle navigue vers une autre vue qui affiche une image téléchargée (JPEG, 1131px × 1647px, ~ 486KB) l'écran. Le problème est et le problème est que lorsque je zoome dans l'image, l'utilisation de la mémoire atteint près de 90 Mo (comme 87 Mo la dernière fois que j'ai testé avec la taille maximale à 2,5).

De plus, après avoir navigué dans les vues, l'utilisation actuelle du RAM peut atteindre et rester à 35 Mo, ce que je pense est dû au fait que le périphérique cache certaines choses. Donc, comme le titre le dit, comment puis-je éviter une telle utilisation de RAM?

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

Répondre

1

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 Google Maps en vue satellite), mais hier Je l'ai résolu en utilisant un navigateur Web à l'intérieur de mon point de vue, si avant que je ne:

<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> 

je changé à:

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

il utilise moins de mémoire et t Akes soin du zoom sans problèmes.

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

+1

Eh bien, je viens de trouver un problème avec cela .... Le contrôle webBrowser, capture les événements de manipulation, de sorte qu'on peut Ne faites pas d'actions personnalisées comme le lancement d'une méthode. (comme celui que l'on utilisait pour aller aux images suivantes et précédentes). –

+0

Salut, @Felipe Guajardo: Je suis intéressé par votre solution en utilisant un contrôle de navigateur Web, comment charger votre image et la lier à ActualImageSource? Merci. –

+0

Bonjour. Regardez juste ma propre réponse ci-dessus. Tout d'abord, en utilisant (pas pur) MVVM modèle, donc dans mon modèle, j'ai une propriété avec URL (chaîne), que dans l'exemple est appelé ActualImageSource. Le premier bloc de code utilisait un contrôle d'image plus un comportement tiers pour le support multitouch. J'ai changé cela au deuxième bloc de code qui utilise comme source (avec liaison) cette même propriété ActualImageSource pour un contrôle webbrowser. –

1

De manière générale, vous souhaitez conserver des images aussi petites que possible (dans les dimensions et la profondeur de couleur, pas nécessairement la taille du fichier). Pour afficher une image, l'appareil doit la décompresser en Bitmap réel. Dans ce cas, vous regardez une image 1131x1647pixel, soit 16bpp, ce qui signifie que vous avez une empreinte de mémoire de 3,7 Mo pour l'image, pas le 486k taille du fichier. En fonction de votre zoom/rotation, il peut y avoir un second tampon de copie, ce qui vous permet de doubler le nombre de copies. Il ne faut pas longtemps pour arriver à 90MB. Je vais certainement essayer soit de télécharger des fichiers d'image plus petits ou d'essayer de les redimensionner localement et ensuite en utilisant l'image redimensionnée.

0

Un couple de choses à noter. Tout d'abord, assurez-vous que vous supprimez les listes ou les images que vous utilisez sur les pages de la méthode onNavigatedFrom. La manière dont WP7 traite les images est "intéressante". Une des choses que j'ai trouvé pour aider est d'annuler l'arrière-plan de tous les contrôles de panorama lorsque la page n'est pas affichée.

En ce qui concerne votre problème spécifique, avez-vous envisagé d'utiliser MultiScaleImage (zoom profond) pour réduire la mémoire?

http://msdn.microsoft.com/en-us/library/system.windows.controls.multiscaleimage(VS.95).aspx

+0

voulez-vous dire quelque chose comme mylistbox.itemsource = null; ? –

+0

ou peut-il être préférable de mettre tout le datacontext à zéro? –

+0

Je le fais plus sur le côté ViewModel et cache les données à la mémoire isolée lorsque la page n'est plus visible –