惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
云风的 BLOG
云风的 BLOG
小众软件
小众软件
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 司徒正美
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
美团技术团队
宝玉的分享
宝玉的分享
量子位
V
Visual Studio Blog
罗磊的独立博客
Vercel News
Vercel News
B
Blog
J
Java Code Geeks
S
SegmentFault 最新的问题
Recent Announcements
Recent Announcements
有赞技术团队
有赞技术团队
P
Proofpoint News Feed
GbyAI
GbyAI
G
Google Developers Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

博客园 - HotSky

WPF游标直尺 Chrome启用CDP(chrome-devtools-protocol)进行远程操控 WPF 让ScrollViewer支持按住鼠标中键拖拽滚动内容 WPF 让ScrollViewer支持鼠标中键滚动缩放内容 Nodejs使用 nodejs中写sql需要用in时的写法 C#城市最短路径 C#Animation Sqlite PDF附录A: 内容流操作码 生命模拟 C# Sql帮助类,可扩展 WPF WriteableBitmap通过GDI+绘制帮助类 Alpha混合 Bmp读写二值图 WPF支持任意快捷键+鼠标组合的绑定类 WPF阻止窗体被系统缩放,使用显示器DPI WPF DataGrid自动增长序号列 C#访问或修改私有类、函数、变量、属性 WPF一个简单的属性编辑控件
WPF FPS类
HotSky · 2024-11-13 · via 博客园 - HotSky
public class FPSBase
{
    public static void Run()
    {
        CompositionTarget.Rendering += CompositionTarget_Rendering;
    }

    public static TimeSpan RunTime { get; private set; }
    public static int FPS { get; private set; }
    static int fps = 0;
    public static TimeSpan PreSTime { get; private set; }
    public static TimeSpan PreLogicTime { get; private set; }

    public static double Logicalnterval { get; set; } = 16d;

    private static void CompositionTarget_Rendering(object sender, EventArgs e)
    {
        RunTime = (e as RenderingEventArgs).RenderingTime;
        var span = (RunTime - PreSTime).TotalSeconds;
        if (span >= 1d)
        {
            PreSTime = RunTime;
            FPS = fps;
            fps = 0;
        }
        else
            fps++;
        if ((RunTime - PreLogicTime).TotalMilliseconds > Logicalnterval)
        {
            PreLogicTime = RunTime;
            OnLogicFrame();
        }
        OnRenderFrame();
    }

    static EventHandlerList Events = new EventHandlerList();
    static readonly object LogicFrameEventObj = new object();
    static readonly object RenderFrameEventObj = new object();
    public static event EventHandler LogicFrameEvent { add => Events.AddHandler(LogicFrameEventObj, value); remove => Events.RemoveHandler(LogicFrameEventObj, value); }
    public static event EventHandler RenderFrameEvent { add => Events.AddHandler(RenderFrameEventObj, value); remove => Events.RemoveHandler(RenderFrameEventObj, value); }
    private static void OnLogicFrame()
    {
        (Events[LogicFrameEventObj] as EventHandler)?.Invoke(null, EventArgs.Empty);
    }

    static void OnRenderFrame()
    {
        (Events[RenderFrameEventObj] as EventHandler)?.Invoke(null, EventArgs.Empty);
    }
}