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

推荐订阅源

量子位
Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
NISL@THU
NISL@THU
T
Threat Research - Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
Lohrmann on Cybersecurity
V
Visual Studio Blog
Cyberwarzone
Cyberwarzone
D
Docker
The Hacker News
The Hacker News
C
CERT Recently Published Vulnerability Notes
Vercel News
Vercel News
Project Zero
Project Zero
S
Schneier on Security
aimingoo的专栏
aimingoo的专栏
I
Intezer
腾讯CDC
M
MIT News - Artificial intelligence
Hugging Face - Blog
Hugging Face - Blog
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
AWS News Blog
AWS News Blog
GbyAI
GbyAI
MongoDB | Blog
MongoDB | Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
Vulnerabilities – Threatpost
G
Google Developers Blog
N
Netflix TechBlog - Medium
The Cloudflare Blog
Microsoft Security Blog
Microsoft Security Blog
Y
Y Combinator Blog
A
Arctic Wolf
S
Securelist
酷 壳 – CoolShell
酷 壳 – CoolShell
Cisco Talos Blog
Cisco Talos Blog
Recent Announcements
Recent Announcements
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LINUX DO - 热门话题
T
Threatpost
Latest news
Latest news
Blog — PlanetScale
Blog — PlanetScale
Security Latest
Security Latest
Engineering at Meta
Engineering at Meta
大猫的无限游戏
大猫的无限游戏
H
Help Net Security
The GitHub Blog
The GitHub Blog
T
Tor Project blog
P
Proofpoint News Feed

博客园 - HotSky

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);
    }
}