У меня в приложение память потихоньку растет наступает определённый момент и gc срабатывает и очищает всю память, если перед моментом срабатывание gc происходят сложные много занимающие в памяти процессы то после gc ENTER_FRAME ведет себя некорректно работает в 2 раз реже, FPS(50) не падает, Wmode=gpu , проверял на 3 компьютерах, уже 3 день бьюсь над это проблемой.
Если не указать Wmode=gpu или Wmode=derect то ENTER_FRAME всегда работает мелено

Код AS3:
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.geom.Matrix;
import flash.geom.Rectangle;
import flash.utils.Timer;
public class GameScreen extends Sprite
{
public static var monsters:Sprite = new Sprite;
public static var buildings:Sprite = new Sprite;
public static var corpsesData:BitmapData = new BitmapData(Config.mapSizeX,Config.mapSizeY ,true,0);;
public static var corpses:Bitmap= new Bitmap(corpsesData);
public static var mBitmapData:BitmapData= new BitmapData(Config.mapSizeX,Config.mapSizeY);
public static var mBitmap:Bitmap= new Bitmap(mBitmapData);
public static var background:Sprite = new Sprite();
public static var backgroundUp:Sprite = new Sprite();
public static var mines:Sprite= new Sprite();
public static var turrets:Sprite = new Sprite();
public static var ofhs:Sprite = new Sprite();
public static var pointForBot:Img_pointForBot = new Img_pointForBot;
public static var corpsesBot:Sprite= new Sprite;
private var tick:int;
private var xForB:uint;
private var yForB:uint;
private var cForB:uint;
public static var recForClean:Rectangle = new Rectangle(0,0,Config.mapSizeX,Config.mapSizeY);
public static var nextLevel:Sprite= new Sprite;
private var testmc:Sprite= new Sprite;
private var matrix:Matrix = new Matrix;
public function GameScreen()
{
}
public function start():void
{
this.addEventListener(Event.ENTER_FRAME,onFrame);
this.addChild(background);
this.addChild(backgroundUp);
this.addChild(corpses);
this.addChild(corpsesBot);
this.addChild(mines);
this.addChild(turrets);
this.addChild(Repository.hero);
this.addChild(ofhs);
this.addChild(mBitmap);
this.addChild(buildings);
buildings.mouseChildren=false;
buildings.mouseEnabled=false;
buildings.cacheAsBitmap=true;
this.addEventListener(MouseEvent.MOUSE_DOWN,KeyboardControl.onMouseDown);
this.addEventListener(MouseEvent.MOUSE_UP,KeyboardControl.onMouseUP);
this.addChild(testmc);
this.addChild(pointForBot);
this.addChild(nextLevel);
pointForBot.visible=false;
//mBitmapData.fillRect(recForClean,0);
}
private function onFrame(e:Event):void
{
var i1:int;
var i2:int;
for each(var obj:Monster in Monster.monsters)
{
obj.onFrame();
}
for each(var obj2:Mine in Mine.mines)
{
obj2.onFrame();
}
for each(var obj3:Bullet in Bullet.bullets)
{
obj3.onFrame();
}
for each(var obj4:Turret in Turret.turrets)
{
obj4.onFrame();
}
for each(var obj6:HeroBuillding in HeroBuillding.heroBuilldings)
{
obj6.onFrame();
}
for each(var obj7:Bot in Bot.bots)
{
obj7.onFrame();
}
for each(var obj8:NextLevel in NextLevel.nextLevels)
{
obj8.onFrame();
}
for each(var obj5:Ofh in Ofh.ofhs)
{
obj5.onFrame();
}
obj=null;
obj2=null;
obj3=null;
obj4=null;
obj5=null;
obj6=null;
obj7=null;
obj8=null;
FactorSpeed.onFrame();
if(1==2)//дебаг сетки
{
testmc.alpha=0.5;
testmc.graphics.clear();
testmc.graphics.beginFill(0);
testmc.mouseEnabled=false;
testmc.mouseChildren=false;
for(i1=0;i1<30;i1++)
for(i2=0;i2<30;i2++)
{
if(Repository.gridMonsters[i1][i2].length>0)
{
//trace(i1+" "+i2);
testmc.graphics.drawRect(i1*Config.gridSize,i2*Config.gridSize,Config.gridSize,Config.gridSize);
}
}
}
if(Hero.X<=Config.mapSizeX-800/2&&Hero.X>=800/2)
{
x-=int(Hero.X+x-800/2);
}
if(Hero.Y<=Config.mapSizeY-600/2&&Hero.Y>=600/2)
{
y-=int(Hero.Y+y-600/2);
}
tick++;
if(tick%3==0){
mBitmapData.lock();
recForClean.x=int(x*-1)-Hero.SPEED*3;
recForClean.y=int(y*-1)-Hero.SPEED*3;
recForClean.height=stage.stageHeight+Hero.SPEED*2*3;
recForClean.width=stage.stageWidth+Hero.SPEED*2*3;
mBitmapData.fillRect(recForClean,0);
var o2:Bot;
for each (o2 in Bot.bots)
{
if(o2.draw&&(Math.abs(int(-1*x+800/2)-o2.x-o2.size)<900/2)&&(Math.abs(int(-1*y+600/2)-o2.y-o2.size)<700/2))
{
matrix.identity();
matrix.rotate(o2.rotation);
matrix.translate(o2.x, o2.y);
mBitmapData.draw(o2.graphicBot,matrix);
}
}
o2=null;
for each (var o:Monster in Monster.monsters)
{
if((Math.abs(int(-1*x+800/2)-o.x-o.size)<900/2)&&(Math.abs(int(-1*y+600/2)-o.y-o.size)<700/2))
{
matrix.identity();
matrix.rotate(o.rotation);
matrix.translate(o.x, o.y);
mBitmapData.draw(o.graphicMonster,matrix);
}
}
o=null;
mBitmapData.unlock();
}
//e.updateAfterEvent();
}
public static function pointMapSize(x1:int,y1:int):Boolean
{
return x1<=Config.mapSizeX&&y1<=Config.mapSizeY&&x1>0&&y1>0;
}
}
}