كيف تبقي استخدام ذاكرة الوصول العشوائي أقل من 90 ميجابايت؟ (صور تحجيم خاصة)

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

سؤال

أقوم بتطوير تطبيق لـ WP7 (VS2010 Express for Windows Phone RTM و WP Emulator) ، لكن الآن أواجه مشكلة كبيرة تتعلق باستخدام الذاكرة. يحتوي التطبيق نفسه على 12 مشاهدة ، ويتم إعادة استخدام بعضها ببيانات مختلفة. إنه قائد إخباري ، وبالتالي فإن طرق العرض هي في الغالب صناديق (صورة الصورة المصغرة ، StackPanels و TextBlocks).

يحتوي العرض الأول على قائمة قائمة مع 30 عنصرًا. يستغرق هذا حوالي 20 ميغابايت من ذاكرة الوصول العشوائي ، لكن أثناء التنقل بين وجهات النظر ، يبدأ استخدام الحالي وذاكرة RAM في الارتفاع. حسنًا ، فإن استخدام الذروة يبلغ حوالي 55 ميجابايت ، وأعتقد أنه لا بأس به ، ولكن يحتوي التطبيق على قسم معرض يتنقل فيه بعد اختيار صورة مصغرة إلى عرض آخر يعرض صورة تم تنزيلها (JPEG ، 1131PX × 1647px ، ~ 486 كيلو بايت) الشاشة. حتى هنا كل شيء جيد ، لكن لأغراض التحجيم ، أستخدم سلوك لوران بوجنيون متعدد اللعود و المشكلة هي عندما أقوم بتكبير الصورة ، يقترب استخدام الذاكرة من 90 ميجابايت (مثل 87 ميجابايت في المرة الأخيرة التي اختبرت فيها حجم المقياس القصوى عند 2.5).

وأيضًا بعد أن أتنقل في وجهات النظر ، قد يصل استخدام RAM الحالي إلى 35 ميغابايت ، وهو ما أعتقد أنه يرجع إلى الجهاز التخزين المؤقت لبعض الأشياء.

لذلك ، كما يقول العنوان ، كيف يمكنني تجنب استخدام هذا الاستخدام الضخم؟

يحرر----
أود أيضًا أن أسأل ما إذا كان يمكن للمرء في تطبيقي التنقل من أي طريقة عرض إلى أي عرض تقريبًا ، وبين ما بينها دائمًا ، هناك رسوم متحركة لانتقال الصفحة (مثل نموذج تطبيق قائمة الهاتف في أدوات بيتا) ، قد تساهم في استخدام الذاكرة المفرطة.

هل كانت مفيدة؟

المحلول 2

حسنًا ، ربما يجب أن أنظر إلى Deepzoom (ولكن عندما قرأت عنها لأول مرة ، اعتقدت أنه كان لاستخدامه بنفس الصورة بأحجام مختلفة ، مثل خرائط Google في عرض الأقمار الصناعية) ، لكنني قمت بحلها بالأمس باستخدام webbrowser داخل بلدي عرض ، لذلك إذا كان لدي:

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

لقد غيرت ذلك إلى:

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

يستخدم ذاكرة أقل ويعتني بالتكبير دون أي مشاكل.

سأنتظر قليلاً لشخص لديه حل أفضل قبل التحقق من هذا.

نصائح أخرى

بشكل عام ، تريد أن تبقي الصور صغيرة الممكن (في الأبعاد وعمق اللون ، وليس بالضرورة حجم الملف). لعرض صورة ، يجب على الجهاز إلغاء ضغطها إلى صورة نقطية فعلية ، لذلك في هذه الحالة ، تنظر إلى صورة 1131 × 1647 بكسل ، دعنا نقول في 16BPP ، يعني أن لديك بصمة ذاكرة 3.7 ميجابايت للصورة ، وليس حجم الملف 486K.

اعتمادًا على التكبير/التدوير ، قد يكون هناك مخزن مؤقت للنسخة الثانية ، بحيث يمكنك مضاعفة ذلك بشكل فعال. لا يستغرق هذا المعدل وقتًا طويلاً للوصول إلى 90 ميجابايت. من المؤكد أنني سأحاول تنزيل ملفات الصور الأصغر أو حاول تغيير حجمها محليًا ثم استخدام الصورة المقيدة.

زوجان من الأشياء ملاحظة. أولاً ، تأكد من قيامك بمسح أي قوائم أو صور تستخدمها في الصفحات التي تدور حول طريقة onNavigatedFrom. الطريقة التي يتعامل بها WP7 مع الصور "مثيرة للاهتمام". أحد الأشياء التي وجدتها للمساعدة هي إلغاء خلفية أي عناصر تحكم بانوراما عندما لا يتم عرض الصفحة.

بالنسبة لمشكلتك المحددة ، هل فكرت في استخدام MultiscaleImage (التكبير العميق) لخفض الذاكرة؟

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top