Libgdx Pixmap内存泄漏

时间:2015-04-30 11:30:39

标签: memory libgdx textures pixmap

我正在编写一个小项目,我需要从给定对象到我的鼠标的一行。我做了一些工作,想出了这个快速而又脏的代码:

   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);
        }
    });

问题是,当我在Image上使用此Listener并激活touchdragged大约20秒时,会出现内存泄漏。 我不知道为什么会发生这种情况,我尝试了很多东西,但没有接缝可以帮我解决这个问题。你有什么想法吗?

1 个答案:

答案 0 :(得分:1)

@noone是对的。在将drawable分配给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);