memorylibgdxtexturespixmap

Libgdx Pixmap Memory Leak


I am codeing a little project where i need a Line from a given Object to my Mouse. I made things work and came up with this quick and dirty code:

   addListener(new ClickListener() {
        Image lineImage;
        Pixmap pixmap;

        @Override
        public void touchDragged(InputEvent event, float x, float y, int pointer) {

            // Get Actor Origin
            // Get local Origin
            int x2 = (int) event.getListenerActor().getX(Align.center);
            int y2 = (int) event.getListenerActor().getY(Align.center);
            // Make it global
            x2 = (int) event.getListenerActor().getParent().getX() + x2;
            y2 = (int) event.getListenerActor().getParent().getY() + y2;

            // Get Stage Coordinates
            Vector2 v = localToStageCoordinates(new Vector2(x, y));
            Vector2 v2 = new Vector2(x2, y2);

            Stage stage = event.getStage();

            int width = (int) stage.getWidth();
            int height = (int) stage.getHeight();

            if (pixmap == null) {
                pixmap = new Pixmap(width, height, Pixmap.Format.RGBA8888);
            } else {
                pixmap.setColor(1, 1, 1, 0);
                pixmap.fill();
            }
            pixmap.setColor(Color.BLUE);
            // line
            for (int m = -2; m <= 2; m++) {// x
                for (int n = -2; n <= 2; n++) {// y
                    pixmap.drawLine((int) (v2.x+m), (int) (height-v2.y+n) , (int) (v.x+m), (int) (height-v.y+n));
                }
            }

            if (lineImage != null) {
                /*lineImage.clear();
                lineImage.remove();
                */
                lineImage.setDrawable(new SpriteDrawable(new Sprite(new Texture(pixmap))));
            } else {
                lineImage = new Image(new Texture(pixmap));
            }
            lineImage.setPosition(0,0);
            stage.addActor(lineImage);

            // super.touchDragged(event, x, y, pointer);
        }

        @Override
        public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
            if (lineImage != null) {
                lineImage.clear();
                lineImage.remove();
            }
            lineImage = null;
            super.touchUp(event, x, y, pointer, button);
        }
    });

The Problem with this is, when i use this Listener on a Image and i activate touchdragged for about 20 seconds, there will be a memory leak. I have no idea why this happens, i tried a lot of things but nothing seams to help me fix this. Do you have any ideas?


Solution

  • @noone is right. Add the line where is commented to dispose your pixmap after you assigned the drawable to the lineImage.

      if (lineImage != null) {
                /*lineImage.clear();
                lineImage.remove();
                */
                lineImage.setDrawable(new SpriteDrawable(new Sprite(new Texture(pixmap))));
            } else {
                lineImage = new Image(new Texture(pixmap));
            }
    
            pixmap.dispose(); // <-----------Add this line here!!!
    
            lineImage.setPosition(0,0);
            stage.addActor(lineImage);