2013-04-23 2 views
0

есть ли кто-нибудь был встречен? может кто-то дать мне хит, как справиться с этим? большое спасибо.android 4.0 и выше, Canvas.clipRect(), утечки памяти

В моей игре я использовал большое количество функций Canvas.clipRect(), я обнаружил, что в android 4.0 и выше после игры в течение 10 минут его процесс был убит ActivityManager. И я отказался от использования Canvas.clipRect(), он работал правильно в течение длительного времени.

ответ

0

Вместо использования Canvas.clipRect() попробуйте использовать Canvas.clipRegion(). Меня устраивает.

Образец обходной путь:

public void setClipNoOOM(int left, int top, int right, int bottom, Region.Op op, android.graphics.Canvas canvas) { 
    if (op == Region.Op.INTERSECT) 
     canvas.clipRect(left, top, right, bottom, op); 
    else { 
     RectF rectF = new RectF(left, top, right, bottom); 
     Matrix m = canvas.getMatrix(); 
     m.mapRect(rectF); 
     Region region = new Region((int)rectF.left, (int)rectF.top, (int)rectF.right, (int)rectF.bottom); 
     canvas.clipRegion(region, op); 
    } 
} 
+0

Вы должны избегать распределения во время вашего рисунка - если есть не пересекаются, вы создаете 2 объекта (которые должны быть GCed) каждый раз, когда вы вызываете этот метод. Я предполагаю, что вы вызываете это несколько раз за кадр, поэтому вы можете легко создавать тысячи объектов в секунду. Вместо этого выделите поле для каждого, а затем используйте методы 'set()' внутри этого метода. – FunkTheMonk