我在一个简单的WPF动画中测量帧之间的时间.穿孔器说该应用程序的执行速度约为60fps,因此我预计帧之间的时间约为16.6ms,偏差很小.
public MainWindow()
{
...
CompositionTarget.Rendering += Rendering;
}
List<long> FrameDurations = new List<long>();
private long PreviousFrameTime = 0;
private void Rendering(object o, EventArgs args)
{
FrameDurations.Add(DateTime.Now.Ticks - PreviousFrameTime);
PreviousFrameTime = DateTime.Now.Ticks;
}
Run Code Online (Sandbox Code Playgroud)
有两件事让我惊讶:

Y - 以滴答为单位的帧之间的时间(10,000滴答= 1ms)
X - 帧计数
可能的混杂因素
我正在使用的项目:SimpleWindow.zip
===编辑
Markus指出我可以使用RenderingEventArgs.RenderingTime.Ticks而不是DateTime.Now.Ticks.我重复了这次跑步并得到了截然不同的结果.唯一的区别是计时方法:
DateTime.Now.Ticks

RenderingEventArgs.RenderingTime.Ticks

来自RenderingEventArgs的数据产生的数据更接近预期的16.6ms /帧,并且它是一致的.
如果显示器每16.6ms更新一次并且WPF每14.9ms更新一次,我们可以预期会出现导致撕裂的竞争条件.也就是说,当显示器试图读取图像时,大约每第10帧WPF将尝试写入其图像.
我想使用EventSourceWindows性能分析器激活ETW事件并查看它们.
我有一个基本的EventSource:
[EventSource(Name = "BasicEventSource")]
public class ETWLogger : EventSource
{
#if DEBUG
private const bool ThrowOnError = true;
#else
private const bool ThrowOnError = false;
#endif
private ETWLogger(bool throwOnError) : base(throwOnError) { }
private static ETWLogger _log;
public static ETWLogger Log
{ get { return _log ?? (_log = new ETWLogger(ThrowOnError)); } }
private static class Keywords
{
public const EventKeywords Perf = (EventKeywords) 1;
}
[Event(1, Keywords = Keywords.Perf, Level = EventLevel.Informational)]
public void …Run Code Online (Sandbox Code Playgroud) 我在WPF动画中撕裂和闪烁时遇到麻烦.我有一个玩具应用程序来演示这些问题.该应用程序在屏幕上设置了正方形动画.方块的边缘显示撕裂,整个动画感觉不平滑.
穿孔器显示> 60fps,~10mb视频内存,0 IRT.
我在两台新的高端计算机上尝试了这一点,并且都显示了相同的不良动画(> 1gb vram,quad core等).
以下使用BitmapDecoder,BitmapPropertySet和BitmapTypedValue会导致本机内存泄漏.我希望我只是错误地使用它们...使用它们的正确方法是什么?它们没有实现IDisposable,所以我不知道如何告诉他们释放他们拥有的本机内存.
这种泄漏有可能无法避免.如果是这样,我将如何保护我的UWP应用程序免受其影响?
Windows性能记录器/分析器的Valloc跟踪显示许多分配,没有Decommit Time.这些对象的提交堆栈表明它们与获取元数据或元数据相关.
using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
using Windows.Graphics.Imaging;
using Windows.Storage;
using Windows.Storage.Search;
namespace Tests
{
[TestClass]
public class TestBitmapDecoderLeak
{
// Path to a folder containing jpeg's that have metadata.
private static readonly string ImageFolderPath = @"path to folder of jpegs";
// The subset of the metadata you want to get
private static readonly string [] MetadataPolicies =
{
"System.Copyright",
"System.SimpleRating",
"System.Photo.ShutterSpeed",
"System.Photo.Aperture",
"System.Photo.CameraModel",
"System.Photo.CameraManufacturer",
"System.Photo.DateTaken",
"System.Photo.ExposureTime",
"System.Photo.Flash",
"System.Photo.FlashEnergy",
"System.Photo.ISOSpeed",
"System.GPS.Longitude",
"System.GPS.Latitude" …Run Code Online (Sandbox Code Playgroud) 在Windows 10上,可以将UWP作为屏幕保护程序启动吗?如果是这样,您如何在操作系统中注册您的应用程序,使其在屏幕保护对话框中列出?
(Windows 8商店应用程序不能是屏保.我找不到任何有关UWP的信息)
ResizeSettings的文档说:"由Instructions类替换" http://documentation.imageresizing.net/docu/ImageResizer/ResizeSettings.htm
指令文档说:"ResizeSettings的继承者." http://documentation.imageresizing.net/docu/ImageResizer/Instructions.htm
但是,我无法弄清楚如何使用Instructions而不是ResizeSettings.我试过了
如果说明取代了ResizeSettings,那么我该如何使用它而不是ResizeSettings?
===编辑 - 更多细节:
这是一种使用ResizeSettings的方法:
public static Bitmap Resize(Bitmap bitmap, int maxHeight, int maxWidth)
{
var setting = new ResizeSettings
{
MaxHeight = maxHeight,
MaxWidth = maxWidth,
};
return ImageBuilder.Current.Build(bitmap, setting);
}
Run Code Online (Sandbox Code Playgroud)
阅读说明是ResizeSettings的替代品,我尝试的第一件事就是:(我希望ImageBuilder可能有一个重载的Build方法)
public static Bitmap Resize(Bitmap bitmap, int maxHeight, int maxWidth)
{
var instructions = new Instructions
{
Width = maxWidth,
Height = maxHeight,
Mode = FitMode.Max
};
return ImageBuilder.Current.Build(bitmap, instructions);
}
Run Code Online (Sandbox Code Playgroud) 如何在Windows应用商店应用中复制文件夹及其内容?
我正在为Windows应用商店应用编写测试.该应用程序使用文件,因此需要一组已知文件.理想情况下,任何开发人员都可以运行这些测试,而无需他们进行一些手动设置.
我假设这意味着测试文件将被检入源代码控制,然后复制到LocalState测试可以使用它们的文件夹(在ClassInitialize测试阶段复制).
StorageFile具有复制功能.可以使用这些来递归重建要复制的文件夹.然而,很难相信这将是正确的方法......当然我错过了一些东西.
(Windows 8.1,Windows应用商店应用)
我想将旋转的文本放在容器(例如Grid)中,让容器从旋转的文本中获取其尺寸.然而...
这段代码:
<Canvas Background="Gray">
<Grid
Canvas.Left="100"
Canvas.Top="100"
Background="LightGray">
<TextBlock Text="Text rotated 270º">
<TextBlock.RenderTransform>
<RotateTransform Angle="270" />
</TextBlock.RenderTransform>
</TextBlock>
</Grid>
<Canvas>
Run Code Online (Sandbox Code Playgroud)
......像这样呈现:

我希望网格在应用旋转后从TextBlock获取宽度和高度.但是,在应用旋转之前,网格似乎从TextBlock获取其尺寸.
如何获得容器(即网格)以适应其内容的旋转大小(即TextBlock)?
xaml windows-8 windows-runtime windows-store-apps windows-8.1
animation ×2
c# ×2
performance ×2
uwp ×2
windows-10 ×2
windows-8 ×2
windows-8.1 ×2
wpf ×2
etw ×1
flicker ×1
imageresizer ×1
memory-leaks ×1
screensaver ×1
tearing ×1
wpa ×1
xaml ×1