- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Xamarin SkiaSharp 实现流畅的动画。核心问题是调用 canvasView.InvalidateSurface(); 之间的时间。并点击 mathod OnCanvasViewPaintSurface 进行重绘可以在 3 到 30 毫秒之间变化,当您在屏幕上移动对象时,这会产生一些不稳定的外观。我试图通过在绘图代码中添加一个死循环来缓解这种情况,这对一些人有帮助,但不是一个很好的解决方案。我不明白为什么时间变化如此之大,而且我看不出有任何解决办法。你不能在抽奖代码中 sleep 。游戏如何实现流畅的动画?我的代码如下
async Task DoAnimationLoop()
{
while (DoAnimation)
{
AccumulatedTime = StopWatch1.ElapsedMilliseconds;
await Task.Delay(TimeSpan.FromMilliseconds(5));
if (AccumulatedTime > 50)
{
StopWatch1.Restart();
MoveItems();
SKCanvasView canvasView = Content as SKCanvasView;
TotalBounds = new Size(canvasView.Width,
canvasView.Height);
canvasView.InvalidateSurface();
}
}
}
private void OnCanvasViewPaintSurface(object sender,
SKPaintSurfaceEventArgs e)
{
AccumulatedTime = StopWatch1.ElapsedMilliseconds;
while (AccumulatedTime < 30)
{
AccumulatedTime = StopWatch1.ElapsedMilliseconds;
}
e.Surface.Canvas.Clear();
e.Surface.Canvas.DrawBitmap(Background, 0, 0);
foreach(Item item in AllItems)
{
e.Surface.Canvas.DrawBitmap(item.CurrentBitmap,
item.CurrentPositionX, item.CurrentPositionY);
}
}
最佳答案
对于 future 的读者:根据经验,我通过创建 SkiaSharp SKCanvasViews 获得最流畅的动画,这些 SkiaSharp SKCanvasViews 具有可以使用 Xamarin.Forms.Animate 增加的可绑定(bind)属性。 Animate 根据您为其配置的变量处理所有计时和休眠代码。当你想要一个循环时,你可以将 repeat
委托(delegate)设置为在调用 Animate.Commit( ... repeat: () => true ...)
时返回 true/p>
这是一个方法示例,通过增加 ProgressBar
的 PercentageFilled
属性,将进度条“填充”到 100%(不循环)。请注意您可以配置的时间设置:刷新 rate = 11ms
(等于“90 fps”:1000ms/90 = 11.11),timeToAnimate
是动画应该的时间长度take 在 ms 内完成,您可以从多个缓动函数中进行选择。
private void AnimateProgressBar()
{
double startPercentage = 0; //start at 0 percent
double endPercentage = 1; //fill to 100 percent (Forms.Animate will evenly increment
//between 0 and 1 , and in this case the ProgressBar's OnPaintSurface method knows how to draw based
//on the given decimal i.e. if PercentageFilled is .5 it will draw the bar to
//50 percent of its possible max length)
uint timeToAnimate = 1000;
Xamarin.Forms.Animation animation = new Animation(v => _ProgressBar.PercentageFilled = (float)v, startPercentage, endPercentage, easing: Easing.CubicOut);
animation.Commit(_ProgressBar, "FillPercentage", length: timeToAnimate, finished: (l, c) => animation = null, rate: 11);
}
当 PercentageFilled
属性更改时,它会通过在 OnPropertyChanged
中调用 InvalidateSurface()
来触发 InvalidateSurface
> 方法。为此,请在您的 SKCanvasView
派生类中重写 OnPropertyChanged
:
class ProgressBar: SKCanvasView
{
//...
public BindableProperty PercentageFilledProperty =
BindableProperty.Create(nameof(PercentageFilled), typeof(float), typeof(ProgressBar), 0f);
public float PercentageFilled
{
get { return (float)GetValue(PercentageFilledProperty ); }
set { SetValue(PercentageFilledProperty , value); }
}
protected override void OnPropertyChanged(string propertyName = null)
{
base.OnPropertyChanged(propertyName);
InvalidateSurface();
}
protected override void OnPaintSurface(SKPaintSurfaceEventArgs args)
{
//Draws progress bar based on the PercentageFilled filled property
}
//....
}
在问题的代码中,似乎有很多项目正在按顺序移动 (MoveItems();
),这种逐一移动绘制项目的技术可能是抖动的原因?但是 MoveItems 似乎是您可能想要使用 Forms.Animate 的地方,您可以使用 MoveItems()
作为 Callback< 创建一个
。查看“Custom Animations in Xamarin.Forms”的 Microsoft 文档,了解有关如何使用回调制作动画的更多信息。Forms.Animation
/
另请查看 Medium 上 Konrad Müller 的“The basics to create custom Xamarin.Forms controls using SkiaSharp”,其中包含这段有用的段落,如果您正在制作游戏,可以考虑一下:
The basic SkiaSharp.Views.Forms provides two views you can use as abase for your controls: SKCanvasView and SKGLView. The CanvasView usesthe CPU accelerated backend while the GLView uses OpenGL and thereforethe GPU. You might intuitively think that using the GPU for graphicsoperations is always the better choice but in fact, OpenGL has a highoverhead when creating the GL context. The CanvasView simply allocatesthe memory it needs and as long as enough CPU power is available, itcan render without problems. In theory, the CanvasView should bebetter suited for less demanding renderings and GlView better forcomplex renderings but the power of modern smartphones makes thesedifferences mostly unnoticable. I would recommend to simply stick tothe CanvasView and switch to the GlView if the rendering gets tocomplex and you notice performance problems.
关于animation - 如何在 SkiaSharp 中获得流畅的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54282665/
我正在为我的雇主编写脚本,以从他们自己的站点获取某些数据。出于一长串原因,我需要从网站上获取数据,如图所示。我发现,其中一些数据是通过 js 调用检索的... 回想起来,我应该选择 Mechanize
我正在使用 python 和 cryptography.io 来签署和验证消息。我可以通过以下方式获得签名的 DER 编码字节表示: cryptography_priv_key.sign(messag
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
是否可以区分 ECDF?以下面得到的为例。 set.seed(1) a <- sort(rnorm(100)) b <- ecdf(a) plot(b) 我想对 b 求导以获得它的概率密度函数 (PD
我找到了如何从 navigator.mimeTypes 获取 mimetypes: function GetMimeTypes() { var message = ""; var mi
我在表单中使用单选按钮来隐藏/显示联系人表单中的成员 ID 字段。问题是,当 javascript 更改 html 中包含的隐藏 id 字段(该字段设置为“无”值)时,该字段将不再通过 post 可用
我正在做单元测试。我必须测试所有可能的if..else情况。但是在此if语句中: int32_t i32Res = snprintf(buffer, len, "The%d_String_%d", 0
我有一个 Facebook 应用程序,我想从中获取“喜欢”的总数。我想知道这是否可能。 其中 ID 是应用程序的 ID,ACCESS_TOKEN 是我尝试过的应用程序的当前访问 token : gra
如果我有多个计算实例尝试同时获取同一个 blob 的租约,则似乎经常会成功。我的印象是,一旦租约发出(并因此被客户获得),就不可能同时发出另一个租约? 我希望情况确实如此,我一直在 Azure 中使用
这是我的索引 POST /blogs/1 { "name" : "learn java", "popularity" : 100 } POST /blogs/2 { "name" : "l
我正在将 Symfony2 与 FOSUserBundle 一起使用。我需要为用户获得最高角色。 role_hierarchy: ROLE_CONTRIBUTOR: ROLE_USER
我正在向服务器发送基于 REST 的请求。我希望尽快得到答复,并希望了解可以进行的各种优化。 一种方法当然是在线程中并行发送这些请求。还有哪些其他选项可用于优化此功能? 在服务器上,可以添加哪些配置?
这可能是某种重复的问题,但我似乎找不到合适的解决方案。我正在使用 git4idea.history.GitHistoryUtils.history() 获取提交列表。如果 checkout 其中一个较
我正在做一个程序,可以输入每周的工资和那一周的总工作时间。它应该以小时工资率显示答案。但是我无法显示正确的“centavos/2 decimal places”公式并且它不想使用 float % fl
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我已经尝试了 mContext.getMainLooper() 和 Looper.getMainLooper()。两者都返回相同的结果,但我想知道哪种方法正确? 我还从 Android 开发人员链接中
我有一个“affiliates”表,其中包含“user”和“referredBy”列。 给定一个用户,我希望获得该用户推荐的所有“n 级”玩家。对于 n=1,我们只关心您直接推荐的玩家数量: SELE
我在 PostgreSQL 9.5 数据库中有两个表: project - id - name task - id - project_id - name - updated_
请帮助我怎样才能得到我预期的结果,在此先感谢并抱歉我的英语不好。 PHP: $dog = implode(',', $data['dogbreed']); $query .= "AND `do
我有 let impulse = CGVectorMake(CGFloat(Constants.impulse), 0) 如何在不创建另一个 CGVector 的情况下得到它的负值? 我正在考虑在 C
我是一名优秀的程序员,十分优秀!