I have improved the test a little bit. Here is the all the code for the test:
package dfpck
{
import flash.utils.setInterval;
import starling.core.Starling;
import starling.display.Image;
import starling.display.Sprite;
import starling.filters.BlurFilter;
import starling.filters.ColorMatrixFilter;
public class FilterMemoryLeak extends Sprite
{
public static const NUMBER_OF_IMAGES:int = 200;
protected var _atlas:StarlingAssets;
protected var _filterImages:Vector.<Image>;
protected var _container:Sprite;
public function FilterMemoryLeak()
{
super();
_filterImages = new Vector.<Image>;
this.filter = new BlurFilter(4, 4, 1);
}
public function get atlas():StarlingAssets
{
return _atlas;
}
public function set atlas(value:StarlingAssets):void
{
_atlas = value;
}
public function startExample():void
{
_container = new Sprite();
addChild(_container);
createFilterImages();
setInterval(updateImagePositions, 32);
}
public function updateImagePositions():void
{
var filterImage:Image;
for(var i:int = 0, len:int = _filterImages.length; i < len; i++)
{
filterImage = _filterImages[i];
filterImage.x = randomNumberRange(Starling.current.stage.stageWidth, 0, false);
filterImage.y = randomNumberRange(Starling.current.stage.stageHeight, 0, false);
}
}
public function randomNumberRange(maxNum:Number, minNum:Number, floor:Boolean = true):Number
{
var randomNumber:Number = 0;
if(floor)
{
randomNumber = Math.random() * (maxNum - minNum + 1);
randomNumber = Math.floor(randomNumber);
}
else
{
randomNumber = Math.random() * (maxNum - minNum);
}
return randomNumber + minNum;
}
public function createFilterImages():void
{
var filterImage:Image;
var filter:ColorMatrixFilter;
for(var i:int = 0; i < NUMBER_OF_IMAGES; i++)
{
filterImage = new Image(atlas.atlas.getTexture('ball_pool_1_full'));
filterImage.scale = 0.14;
filterImage.alignPivot();
filterImage.readjustSize();
filterImage.name = i.toString();
filterImage.x = randomNumberRange(Starling.current.stage.stageWidth, 0, false);
filterImage.y = randomNumberRange(Starling.current.stage.stageHeight, 0, false);
// if I does not include this filter memory usage stays normal
filter = new ColorMatrixFilter();
filter.tint(0x000DFA, 1);
filterImage.filter = filter;
_container.addChild(filterImage);
_filterImages[i] = filterImage;
}
}
}
}
So now I am just creating images once and on every 32 milliseconds I am only updating their position and still memory keeps rising in the GPU until the app crashes. This only happens on Windows machines.
Does anyone understands why is this happening, how can we submit bug about this problem?