It seems layout and redraw happens in every vsync's frame

It seems so. I don’t know this is a bug or imperfections of the implementation, but this drain the battery’s life. For UI is much more efficient when redrawing happens only during the layout’s recalculation and animation.

This is definitely not something that always happens, so if it happens for you, then we need some more to go on. Could you please post a minimal example showing that this is the case?

I just inherit Image class and override OnArrangeMarginBox with base call, it’s don’t return new size just some reading stuff and OnDraw. That’s all, nothing more

PS Small clarification. It’s happening only for OnDraw

Just override OnDraw in subclass and see what happing:

int drawCalls = 0;
protected override void OnDraw(DrawContext context) {
    drawCalls++;
    debug_log drawCalls;

    base.OnDraw(context);
}

You really need to post a full reproduction case for us to have a look at it.

ImageSubclass.uno:

using Uno;
using Uno.IO;
using Uno.UX;
using Uno.Text;
using Uno.Graphics;
using Uno.Collections;
using Uno.Reflection;

using Fuse;
using Fuse.Controls;
using Fuse.Elements;
using Fuse.Designer;
using Fuse.Scripting;
using Fuse.Drawing;
using Fuse.Drawing.Primitives;

using Fuse.Controls.Internals;

namespace Fuse.Controls {
    class ImageSubclass : Fuse.Controls.Image {
        int callsCount = 0;
        protected override void OnDraw(DrawContext context) {
            callsCount++;
            debug_log callsCount;

            base.OnDraw(context);
        }
    }
}

MainView.ux:

<App>
   <DockPanel Color="#777" Width="50%">
        <ImageSubclass File="Assets/SomeImage.png" StretchMode="PixelPrecise">
        </ImageSubclass>
    </DockPanel>
</App>

or even simpler

<App>
      <ImageSubclass File="Assets/SomeImage.png"/>
</App>

.