Android-спрайт ВМ из-за ошибок памяти - PullRequest
0 голосов
/ 22 октября 2011

Я пытался почти все, чтобы мои живые обои перестали превышать память виртуальной машины, и, похоже, ничего не работает.У меня есть некоторые анимации, которые большие, но, надеюсь, не слишком большие, потому что, если я их уберу, они будут выглядеть ужасно.У меня есть один спрайт, длиной 30 кадров, 7800x329 пикселей, который я положил в папку mdpi, это 356 КБ.У меня есть две меньшие анимации, которые я бы хотел добавить, но они тоже умирают, даже когда они загружаются, я пытаюсь установить их как живые обои, и они снова умирают.Вот код (для этого я использовал учебник по аквариуму) для спрайта

public class SpriteOne extends SpriteMovement {
    private static final int TOTAL_FRAMES_IN_SPRITE = 30;
    private static final int SPRITE_ONE_FPS = 15;

    public SpriteOne(Context context, TheTemplate thetemplate,  Point startPoint, int speed){               
        super(context, thetemplate);
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPurgeable = true;
        Bitmap leftBitmap = BitmapFactory.decodeResource(getContext().getResources(), ca.samsstuff.steampunkdroid.R.drawable.droidfinal, options);
        this.initialize(leftBitmap, SPRITE_ONE_FPS, TOTAL_FRAMES_IN_SPRITE, startPoint, speed);

    }

    public void render(Canvas canvas){
        super.render(canvas);   
    }

}

Я слышал об утилизации, но не совсем уверен, как добавить это здесь.Это относится к другому классу, который я назвал TheTemplate, и я добавлю это также.

//template file

    public class TheTemplate {

        private SpriteThread spriteThread;  
        private SurfaceHolder _surfaceHolder;   
        private ArrayList<Renderable> _sprites;
        public Bitmap _backgroundImage = BitmapFactory.decodeResource(getResources(), R.drawable.background1);
        //droid measurements
        public Bitmap thedroid = BitmapFactory.decodeResource(getResources(), R.drawable.droidfinal);
        public int thedroidHeight = thedroid.getHeight();
        public int thedroidWidth = thedroid.getWidth() / 30;
        private Context _context;

        // add rescale stuff
        private float screenWidth = initFrameParamsWidth();
        private Bitmap theBackgroundImage;
        private float totalHeight = _backgroundImage.getHeight();
        private int screenSized = initFrameParams();
        private float theScaler = (float) (screenSized / totalHeight);

        private Bitmap oneBackImage = Bitmap.createScaledBitmap(_backgroundImage,  (int) (theScaler * _backgroundImage.getWidth()),  (int) (theScaler * _backgroundImage.getHeight()), true);

        public void render(){
            Canvas canvas = null;
            try{

                canvas = this._surfaceHolder.lockCanvas(null);
                synchronized (this._surfaceHolder) {
                    this.onDraw(canvas);
                }

            }finally{
                if(canvas != null){
                    this._surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }   
        }

        protected void onDraw(Canvas canvas) {
            this.renderBackGround(canvas);
            for (Renderable renderable : this._sprites) {
                renderable.render(canvas);
            }
        };

        public void start(){
            this.spriteThread.switchOn();
        }

        public void stop(){
            boolean retry = true;
            this.spriteThread.switchOff();
            while (retry) {
                try {
                 this.spriteThread.join();
                    retry = false;
                } catch (InterruptedException e) {
                    // we will try it again and again...
                }
            }
        }

        public int backgroundLeft() {
            int startMovement = (int) ((screenWidth - theBackgroundImage.getWidth()) / 2); 
            return startMovement;
        }


        public int backgroundRight() {
            return this.theBackgroundImage.getWidth();
        }

        public void initialize(Context context, SurfaceHolder surfaceHolder) {
            this.spriteThread = new SpriteThread(this); 
            this._surfaceHolder = surfaceHolder;        
            this._sprites = new ArrayList<Renderable>();
            this._context = context;
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPurgeable = true;
            this.theBackgroundImage = oneBackImage;
            this.addSprites();
        }

        private void addSprites() {
            Point startPoint = new Point((int) ((screenWidth / 2) - (thedroidWidth / 2)), ((screenSized / 2) - (thedroidHeight / 2)));
            this._sprites.add(new SpriteOne(this._context, this, startPoint , 30));
        }

        private void renderBackGround(Canvas canvas)
        {
            float canvasewidthsize = (float) ((screenWidth / 2) - (theBackgroundImage.getWidth() / 2));
            canvas.drawBitmap(this.theBackgroundImage, canvasewidthsize, 0, null);
        }
    }

Любая помощь в этом будет принята с благодарностью, так как этот сводит меня с ума.Заранее спасибо Сэм

1 Ответ

0 голосов
/ 18 января 2012

извините, я должен был ответить на это давно.просто сократить кадры и размер изображения использовать чистить или переработать или оба

...