首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Libgdx Pixmap内存泄漏

Libgdx Pixmap内存泄漏
EN

Stack Overflow用户
提问于 2015-04-30 11:30:38
回答 1查看 298关注 0票数 1

我正在编码一个小项目,我需要一条线从一个给定的对象到我的鼠标。我把事情做好了,想出了一个快速而又肮脏的代码:

代码语言:javascript
复制
   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);
        }
    });

问题是,当我在图像上使用这个侦听器,激活触摸拖动大约20秒时,就会出现内存泄漏。我不知道为什么会这样,我试了很多东西,但没有缝来帮助我解决这个问题。你有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-30 11:46:36

@没有人是对的。在将绘图分配给lineImage之后,添加注释行以释放像素映射。

代码语言:javascript
复制
  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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29966565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档