سؤال

أنا لست جديدا جدا على المفاهيم الموجودة على J2ME، لكنني نوع من كسول بطرق لا ينبغي لأحد أن أفعل: لقد تم تحميل تطبيقي في الآونة الأخيرة الصور في الذاكرة كما كانت الحلوى ...

Sprite example = new Sprite(Image.createImage("/images/example.png"), w, h);

وأنا لست متأكدا حقا من أنها أفضل طريقة، لكنها عملت بشكل جيد في موتورولا Z6، وحتى الليلة الماضية، عندما اختبرت التطبيق في هاتف محمول سامسونج القديم ولن يتم تحميل الصور وتتطلب العديد من Attemps من بدء الصفحة اظهر. تم ترك الشاشة على أبيض، لذلك أدركت أنه يجب أن يكون شيئا عن تحميل الصورة الذي لا أفعله جيدا ... هل هناك أي شخص يمكن أن يقول لي كيف تجعل روتين تحميل بشكل صحيح في تطبيقي؟

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

المحلول

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

نصائح أخرى:

  1. تحميل الصور الأكبر لأصغر. يساعد هذا في تجزئة الكومة ويسمح بأكبر مساحة كومة لأكبر صور.
  2. تفريغ (تعيين إلى NULL) بترتيب عكسي لكيفية تحميلك وجمع القمامة بعد القيام بذلك. تأكد من Thread.yield () بعد استدعاء GC.
  3. تأكد من تحميل الصور التي تحتاجها فقط. تفريغ الصور من حالة أن التطبيق لم يعد في.
  4. نظرا لأنك تقوم بإنشاء Sprites قد يكون لديك عفرة متعددة للحصول على صورة واحدة. فكر في إنشاء تجمع صورة للتأكد من تحميل الصورة فقط مرة واحدة. ثم توجه فقط كل كائن Sprite إلى الصورة داخل التجمع الذي يتطلبه. يبدو مثالك في سؤالك أنك ستحصل على نفس الصورة على الأرجح في الذاكرة أكثر من مرة. هذا هو مهدر ويمكن أن يكون جزءا من قضية OutofMemory.

نصائح أخرى

باستخدام صورة فيلم (مجموعة من الصور بواسطة بعد محدد في صورة واحدة) واستخدم المنطق لسحبها واحدا في وقت واحد.

لأنهم مجمعة في صورة واحدة، تقوم بتوفير مساحة الرأس لكل صورة، وبالتالي يمكن أن تقلل من الذاكرة المستخدمة.

تم استخدام هذه التقنيات لأول مرة في أجهزة تقييد الذاكرة MIDP 1.0.

باستخدام نهج الفسطا لعدم تحميل الصور مرارا وتكرارا، قمت بإجراء الفئة التالية:

public class ImageLoader {
    private static Hashtable pool = new Hashtable();

    public static Image getSprite(String source){
        if(pool.get(source) != null) return (Image) pool.get(source);
        try {
            Image temp = Image.createImage(source);
            pool.put(source, temp);
            return temp;
        } catch (IOException e){
            System.err.println("Error al cargar la imagen en "+source+": "+e.getMessage());
        }
        return null;
    }
}

لذلك، كلما أحتاج إلى صورة، اسأل أولا عن حمام السباحة لذلك، أو تحميلها فقط في حمام السباحة.

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