Android:GC_FOR_MALLOC由漫长的触摸事件引起?

时间:2011-06-28 19:44:41

标签: android garbage-collection touch

我一直在阅读touchEvents,主要是因为当有一个冗长的触摸/滑动事件或许多触摸事件时,我的GC正在爆炸。如果我没有触摸手机,它就会像我从DDMS执行的前几个GC_EXPLICIT中看到的那样只是空闲~5个对象。然后我开始触摸屏幕并四处滑动,物体在13513个物体周围拍摄,实际上导致GC_FOR_MALLOC超过100毫秒。这是我的简单测试代码,下面是dalvicvm标记的日志。如果您有解决方法或原因的文档,或者甚至可能只是对此进行另一次深入讨论,我会 非常感谢! 干杯,祝您好运。

[代码]

    public class testClass extends Activity implements IOnSceneTouchListener{   
        int numberOfTouches = 0;        

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.main);
        }

        @Override   
        public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {                       
            numberOfTouches++;              
            return false;   
        } 

    }

[logcat的]

06-28 15:24:55.317: DEBUG/dalvikvm(2501): GC_EXPLICIT freed 5 objects / 128 bytes in 53ms
06-28 15:24:55.903: DEBUG/dalvikvm(2501): GC_EXPLICIT freed 5 objects / 136 bytes in 59ms
06-28 15:24:56.708: DEBUG/dalvikvm(2501): GC_EXPLICIT freed 5 objects / 128 bytes in 59ms
06-28 15:25:06.614: DEBUG/dalvikvm(2501): GC_EXPLICIT freed 6 objects / 168 bytes in 58ms
06-28 15:25:09.833: DEBUG/dalvikvm(2501): GC_EXPLICIT freed 7 objects / 192 bytes in 65ms
06-28 15:25:14.270: DEBUG/dalvikvm(2501): GC_EXPLICIT freed 8 objects / 232 bytes in 59ms
06-28 15:25:18.294: DEBUG/dalvikvm(2501): GC_EXPLICIT freed 6 objects / 160 bytes in 59ms
06-28 15:25:33.942: DEBUG/dalvikvm(1103): GC_FOR_MALLOC freed 13513 objects / 1403264 bytes in 121ms
06-28 15:26:53.684: DEBUG/dalvikvm(2139): GC_EXPLICIT freed 140 objects / 6960 bytes in 99ms
06-28 15:26:58.731: DEBUG/dalvikvm(1215): GC_EXPLICIT freed 668 objects / 71136 bytes in 117ms
06-28 15:27:31.637: DEBUG/dalvikvm(1103): GC_FOR_MALLOC freed 13962 objects / 1504296 bytes in 122ms
06-28 15:27:44.723: DEBUG/dalvikvm(2501): GC_EXPLICIT freed 63 objects / 2152 bytes in 59ms
06-28 15:27:46.676: DEBUG/dalvikvm(2501): GC_EXPLICIT freed 5 objects / 128 bytes in 65ms
06-28 15:27:47.238: DEBUG/dalvikvm(2501): GC_EXPLICIT freed 5 objects / 128 bytes in 58ms

我还没有真正解决这个问题,但偶然发现了这篇关于这个确切问题的精彩文章:Android Touch Problems

[编辑] 正如斯特拉卡所说,这很可能是因为洪水泛滥。然而,我真正的问题是对每个事件进行的分配?有没有办法重用这些事件/对象来限制因触摸而导致的分配?

我目前正在使用andEngine ,并且将touchEvents集中在一起,因此最多应该从头开始分配约5个;否则他们只是重复使用不是吗?

感谢任何想法......

2 个答案:

答案 0 :(得分:3)

您使用的是旧版Android吗?我刚刚在开始Android游戏中阅读了Android 1.5上的“触摸事件泛滥”问题。作者的解决方法是让UI线程在他的onTouch()处理程序中暂时休眠,以限制收到的事件数。我不知道这个解决方案有多可行,或者对你有什么用处;书中的相关页面可以在这里找到:

Beginning Android Games, page 131

答案 1 :(得分:0)

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            numberOfTouches++;
            //events can be handled as well.
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    invalidate();
                    break;
                case MotionEvent.ACTION_MOVE:
                    invalidate();
                    break;
                case MotionEvent.ACTION_UP:
                    invalidate();
                    break;
            }
            return true;
        }

这对GC和mallocs有所了解。这是View的覆盖方法。 试试吧回复..

android.view.View.onTouchEvent(MotionEvent event)

参考:

http://developer.android.com/reference/android/view/View.html#onTouchEvent%28android.view.MotionEvent%29