沧州武术:[UWP]‘使用’AlphaMaskEffect提升故障艺<术>动画的性能(顺便介绍怎么‘使用’性能『探』测器分析UWP程序)

2020-03-31 4 views 0

扫一扫用手机浏览

《诚信在线》

《诚信在线》(Www.ludiealliedinstitute.com)现已开放《诚信在线》手机版下载。{游戏公平}、(公开)、公正,《用》实力赢取信誉。

,

前几天发布 了[抄抄《CSS 故障艺术》《 的[「动画」这篇文》章,“在这篇文章《里》”介绍 了[如何《使《用》》Win2D 绘制文“字”然后配合[BlendEffect制作故障艺术 的[「动画」。本来打算就这样收手不玩这个「动画」 了[,《但后来又发现性能不》符【合】理想。明明只是做做Resize「动画」<和>《用》BlendEffect「混合」,{为什么性能会这么差}呢?

1. 分析“原因”

{其实}不《用》分析都知道哪 《里》出[问题 了[,毕竟这个懒是自己偷 的[,不过这《里》顺便介绍介绍Visual Studio 的[性能分析。Visual Studio〖不停更新〗它 的[性能探测『器』,最近几年我还挺喜欢 的[ 的[“应《用》程序时《间》线”功能,对桌面应《用》来说这个功能很好《用》,可以直观地看到帧率、CPU《使《用》》、布局消耗、呈现消耗等信息。

要开始性能分析,首先在顶部菜单选择“调试”->“性能探测『器』”:

在打开 的[性能探测『器』配置页面,选中“CPU‘《使《用》》率’”<和>“应《用》程序时《间》线”两个工具后点击“开始”按钮:

‘之后’Visual Studio<就会启动性>能会话并运【行程】序,{切换到打开 的[应}《用》程序《里》,‘一顿操作后关’闭程序,稍等一下就可以看到分『析报告』。

为 了[凸显性能问题,我复制粘贴 了[好几个个故障艺术 的[「动画」,『可以看』到后半段 的[FPS下降 了[,且“【应《用》程序代码】”占 了[很大 的[比例。切换到"CPU‘《使《用》》率’"<选项卡>,能看到具体 的[CPU<消耗都在>DrawSurfaceCore《这个函数附近》

双击DrawSurfaceCore这行进去具体代码,这《里》颜色越红代表CPU{占《用》率越高},并且会在源码左侧显示具体 的[CPU占《用》率,很明显这《里》 的[代码很糟糕,‘那么’罪魁祸首就是这堆代码 了[。

2. 《使《用》》AlphaMaskEffect优化性能

『上面 的[这段代码是使』《用》Win2D绘制文“字”<和>《使《用》》GaussianBlurEffect制作阴影。《本来这代码性能应该没》问题(‘当然’,在这个「动画」《里》有优化空《间》,例如因为我在这《里》总是《使《用》》BlurAmount = 0 的[阴影所以根本不需要GaussianBlurEffect也不需要DrawImage),但是我《使《用》》 了[Storyboard【控制文】“字” 的[高度,〖然后每次高度改〗变都重「新调《用》这」个函数绘制文“字”。“从结”果上来说我 的[代码《在不停画图》,所以小小 的[「动画」造成 了[巨大 的[性能消耗。

现在我要做什么才可以‘改善这种状况’?‘当然’上面这段代码有很多优化 的[空《间》,‘但最根本’要做 的[是应该《少调《用》这》段代码,少重新绘图。一个很复杂 的[情况是,我需要《使《用》》两个这段代码绘制出来 的[CompositionSurfaceBrush〖<作为>〗BlendEffect 的[输入,而CompositionSurfaceBrush本质上是一张位图,‘而〖<作为>〗’Brush又没法修改它 的[尺寸。CompositionSurfaceBrush关联 了[一个CompositionDrawingSurface,「后者虽然有」Resize函数,但《使《用》》这个函数会令图片在「动画」过程中移位,明明单独《使《用》》Resize效果不错,但《用》在「动画」《里》就总是错,〖我也没心思去〗纠结它 的[“原因”。

【其实要】改变Brush 的[高度,一种很实在 的[方法是《使《用》》遮罩。CompositionApi提供 了[CompositionMaskBrush,《使《用》》它可以实现OpacityMask 的[效果,复习一下它 的[源码:

paint-with-a-compositionbrush-with-opacity-mask-APPlied

Compositor _compositor;
SpriteVisual _maskVisual;
CompositionMaskBrush _maskBrush;

_compositor = Window.Current.Compositor;

_maskBrush = _compositor.CreateMaskBrush();

CompositionLINEarGradientBrush _sourceGradient = _compositor.CreateLinearGradientBrush();
_sourceGradient.ColorStops.Add(_compositor.CreateColorGradientStop(0,Colors.Red));
_sourceGradient.ColorStops.Add(_compositor.CreateColorGradientStop(1,Colors.Yellow));
_maskBrush.Source = _sourceGradient;

LoadedImageSurface loadedSurface = LoadedImageSurface.StartLoadFromUri(new Uri("ms-appx:///Assets/circle.png"), new Size(156.0, 156.0));
_maskBrush.Mask = _compositor.CreateSurfaceBrush(loadedSurface);

_maskVisual = _compositor.CreateSpriteVisual();
_maskVisual.Brush = _maskBrush;
_maskVisual.Size = new Vector2(156, 156);

《使《用》》CompositionMaskBrush之前首先要有一张〖<作为>〗Mask 的[图片,《用》Paint.Net两三下就做好 了[,比奥特曼打到怪兽还快。

接下来只要《用》显示文“字” 的[CompositionSurfaceBrush〖<作为>〗CompositionMaskBrush 的[Source,《用》上面这张图片制作 的[CompositionSurfaceBrush〖<作为>〗Mask,<再对>Mask做Scale 的[「动画」,高度改变 的[「动画」就…………

就报错 了[。

好吧,我想起来 了[文档《里》就说明 了[CompositionMaskBrush{不能玩}BlendEffect。

不过幸运 的[是Win2D本来就提供 了[AlphaMaskEffect这个类,它 的[作《用》几乎<和>CompositionMaskBrush一样,我之前都没想到会有《使《用》》它 的[一天。《使《用》》它 的[代码大同小异,两三下就写完 了[:

private (CompositionBrush, CompositionSurfaceBrush) CreateMaskedBrush(CompositionBrush source)
{
    var compositor = Window.Current.Compositor;
    var effect = new AlphaMaskEffect()
    {
        Source = new CompositionEffectSourceParameter("Source"),
        AlphaMask = new CompositionEffectSourceParameter("Mask"),
    };

    var opacityMaskSurface = LoadedImageSurface.StartLoadFromUri(new Uri("ms-appx:///Assets/Images/mask.Png"));
    var opacityBrush = Compositor.CreateSurfaceBrush(opacityMaskSurface);
    opacityBrush.Stretch = CompositionStretch.UniformToFill;

    var effectfactory = compositor.CreateEffectFactory(effect);
    var compositionBrush = effectFactory.CreateBrush();
    compositionBrush.SetSourceParameter("Source", source);
    compositionBrush.SetSourceParameter("Mask", opacityBrush);
    return (compositionBrush, opacityBrush);
}

3. 结果[

左边是旧 的[代码({每次改变高度重}新绘图),右边是新 的[代码(对〖<作为>〗Mask 的[CompositionSurfaceBrush进行Scale「动画」),可以看到……嗯,好像新「动画」是刘畅 了[些。

看起来再玩大些都还撑得住,GPU占《用》率还算满意,CPU占《用》率也不高。其实还有不少优化空《间》,‘但我还是完全想不到这’个「动画」实际应《用》场景(恕我想象力贫乏),所以就到吃为止吧。

4. 参考

CompositionMaskBrush Class (Windows.UI.Composition) - Windows UWP applications Microsoft Docs

AlphaMaskEffect Class

(合)成画笔 - UWP applications Microsoft Docs

Sunbet内容转载自互联网,如有侵权,联系Sunbet删除。

本文链接地址:http://www.chongqichengbaotoy.com/post/990.html

相关文章

发表评论