OpenFl/Starling mask strange behavior with -final build

Hi!

I found strange things with masks.

var mcScrollView - is empty Sprite from GUI constructor (see on picture)

var visibleRect = new Rectangle(0, 0, 530, 350);
var mcContainer = new Sprite();

mcScrollView.addChild(mcContainer); 

var quad:Quad = new Quad(visibleRect.width, visibleRect.height);
quad.x = visibleRect.x;
quad.y = visibleRect.y;
mcScrollView.mask = quad;

mcContainer.addChild(new FaqSlot());
mcContainer.addChild(new FaqSlot());
mcContainer.addChild(new FaqSlot());
...
code to implement scrolling content (I change _mcContainer.y)
...

All works as expected for openfl build html5 -debug:
image

But for openfl build html5 -final --no-traces I see strange position and size of masking:
image

Like visibleRect = new Rectangle(0, -30, 400, 280);

Do you have any ideas?)
Thx!

That’s… interesting :slight_smile:

You are running on Starling 2.7 ? (if you use the “current-as3-starling” branch on my repo please specify so that I know where to look)

1 Like

There’s probably some kind of reflection being used. Either in your project’s code or in Starling’s code. Reflection often doesn’t work well with -final, since -final enables more aggressive dead code elimination (dce).

I remember that I had to put in a decent amount of work to get Feathers UI working with -final because Actuate.tween() isn’t compatible with -final, and I had to switch to Actuate.update() instead, to force my code to be more strongly typed. There’s probably a similar issue with Starling’s Tween class, since it uses reflection, but that may not necessarily be the cause of the issue at hand. I only mention this because the mask appears to be used for scrolling, and scrolling is often animated.

3 Likes

yes

It happens independ of scrolling.

I have the same problem. I need tween class field (set property).
With -debug all right. There are many updates per second and finally property turn into right value.
With -final there are only one or two updates and property turn into custom value. It is strange. I add onComplete() to manually set property at the end of tween.

Actuate.update() use tween() inside. So what difference for this case?

What can you recommend? I think I need -final for production version.

Actuate.update() accepts a function, rather than an anonymous structure, so the compiler is aware of exactly which properties are being animated, and they won’t be removed by dce.

Actuate.update((scrollY:Float) -> {
	scroller.scrollY = scrollY;
}, duration, [scroller.scrollY], [targetScrollY], true);

It might make sense to add something similar to Tween or Juggler in Starling.

There is also -release. If I had to guess, most people use -release because of the extra work required for -final to work.

1 Like

I don’t understand why but Actuate.update() helps in my case) Thanks!

I think -final is minify version of -release. So it is less weight and more secure for production.

You could try with -release and -minify. I think that this will avoid the full DCE of -final, while still minifying the release output.

openfl build html5 -release -minify
1 Like

if you can, please explain how it helps ? You mean using it or looking at the code ? I’m quite busy currently but I’d like to help make Starling as “perfect” as possible.

Also, have you tried reproducing your mask issue outside of your game ?

@Matse thx!

About Actuate.tween
Actuate is not part of Starling. So there are no complaints to Starling)

I have

public var count(get, set):Int;
function set_count(value:Int):Int
{}
function get_count():Int
{}

I replace
Actuate.tween(this, _duration, {count: newValue});
to
Actuate.update(set_count, _duration, [count], [newValue]);

About mask
Only now I noticed, that problem present on remote server. And no problem with local Visual Studio “Live Server”. And -final -release -debug flags do not affect on this!
Browser is the same. It is magic!)

2 Likes

Thx! But .js file size has doubled) I think size difference is because of I don’t use all of lime|OpenFL|Starling classes in my project. Not only DCE. So I prefer -final for now. But I will keep in mind -release -minify

I mean, it’s totally fine to use -final. Ideally, you should want to use -final, but I understand when some developers prefer not to put in the extra effort that is sometimes required. The main thing to remember with -final is that you must ensure that you aren’t using reflection on Haxe classes (either explicitly with the Reflect class, or sometimes implicitly with the Dynamic type).

Sorry it has nothing to do with --final build or local|remote launch.
Mask problems contain to browser page zoom.
I create new post about it - Starling DisplayObject mask bug with browser page zoom != 100%