小编Tri*_*tan的帖子

为什么WPF中的帧率不规则且不限于监视刷新?

我在一个简单的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)

有两件事让我惊讶:

  • 帧之间的时间相当不规则
  • 帧之间的时间约为8毫秒.我曾预料到显示器的刷新率会设置帧之间的时间下限(即每帧之间60Hz = 16.6ms,任何更快的都没有意义).

DefaultFrameRate

Y - 以滴答为单位的帧之间的时间(10,000滴答= 1ms)
X - 帧计数

可能的混杂因素

  • 定时器不准确
  • 如果CompositionTarget.Rendering实际上与单个帧的绘制无关

我正在使用的项目:SimpleWindow.zip

===编辑

Markus指出我可以使用RenderingEventArgs.RenderingTime.Ticks而不是DateTime.Now.Ticks.我重复了这次跑步并得到了截然不同的结果.唯一的区别是计时方法:

DateTime.Now.Ticks

DefaultFrameRate

RenderingEventArgs.RenderingTime.Ticks

在此输入图像描述

来自RenderingEventArgs的数据产生的数据更接近预期的16.6ms /帧,并且它是一致的.

  • 我不确定为什么DateTime.Now和RenderingEventArgs会产生如此不同的数据.
  • 假设RenderingEventArgs正在产生正确的时间,那么这些时间不是预期的16.6ms仍然有点令人不安.

如果显示器每16.6ms更新一次并且WPF每14.9ms更新一次,我们可以预期会出现导致撕裂的竞争条件.也就是说,当显示器试图读取图像时,大约每第10帧WPF将尝试写入其图像.

wpf animation

20
推荐指数
2
解决办法
8702
查看次数

如何使用Windows性能分析器查看EventSource创建的ETW事件?

我想使用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)

c# performance etw wpa

14
推荐指数
1
解决办法
4452
查看次数

WPF动画有撕裂和闪烁

我在WPF动画中撕裂和闪烁时遇到麻烦.我有一个玩具应用程序来演示这些问题.该应用程序在屏幕上设置了正方形动画.方块的边缘显示撕裂,整个动画感觉不平滑.

穿孔器显示> 60fps,~10mb视频内存,0 IRT.

我在两台新的高端计算机上尝试了这一点,并且都显示了相同的不良动画(> 1gb vram,quad core等).

SimpleWindow.zip

wpf animation flicker tearing

13
推荐指数
1
解决办法
3330
查看次数

如何在不导致本机内存泄漏的情况下访问图像的元数据?

以下使用BitmapDecoder,BitmapPropertySet和BitmapTypedValue会导致本机内存泄漏.我希望我只是错误地使用它们...使用它们的正确方法是什么?它们没有实现IDisposable,所以我不知道如何告诉他们释放他们拥有的本机内存.

这种泄漏有可能无法避免.如果是这样,我将如何保护我的UWP应用程序免受其影响?

Windows性能记录器/分析器的Valloc跟踪显示许多分配,没有Decommit Time.这些对象的提交堆栈表明它们与获取元数据或元数据相关.

WPR-WPA Valloc运行以下测试代码的跟踪

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)

c# performance memory-leaks windows-10 uwp

7
推荐指数
1
解决办法
1245
查看次数

Windows UWP作为屏幕保护程序?

在Windows 10上,可以将UWP作为屏幕保护程序启动吗?如果是这样,您如何在操作系统中注册您的应用程序,使其在屏幕保护对话框中列出?

(Windows 8商店应用程序不能是屏保.我找不到任何有关UWP的信息)

screensaver windows-store-apps windows-10 uwp

5
推荐指数
1
解决办法
901
查看次数

ImageResizer:你如何使用说明?

ResizeSettings的文档说:"由Instructions类替换" http://documentation.imageresizing.net/docu/ImageResizer/ResizeSettings.htm

指令文档说:"ResizeSettings的继承者." http://documentation.imageresizing.net/docu/ImageResizer/Instructions.htm

但是,我无法弄清楚如何使用Instructions而不是ResizeSettings.我试过了

  • 谷歌
  • 文档(documentation.imageresizing.net)
  • 浏览对象浏览器以获取指令的使用
  • 在.net Reflector中搜索ImageResizer.dll以获取指令的使用
  • 反编译所有ImageResizer.dll并搜索生成的代码.

如果说明取代了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)

imageresizer

4
推荐指数
1
解决办法
2029
查看次数

如何在Windows应用商店应用中复制文件夹

如何在Windows应用商店应用中复制文件夹及其内容?

我正在为Windows应用商店应用编写测试.该应用程序使用文件,因此需要一组已知文件.理想情况下,任何开发人员都可以运行这些测试,而无需他们进行一些手动设置.

我假设这意味着测试文件将被检入源代码控制,然后复制到LocalState测试可以使用它们的文件夹(在ClassInitialize测试阶段复制).

StorageFile具有复制功能.可以使用这些来递归重建要复制的文件夹.然而,很难相信这将是正确的方法......当然我错过了一些东西.

windows-8 windows-store-apps windows-8.1

3
推荐指数
1
解决办法
1544
查看次数

如何获得容器(即网格)以适应其内容的旋转大小?

(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

1
推荐指数
1
解决办法
510
查看次数