这个封装类可以独立于具体的网络传输逻辑,为任何需要减少鼠标移动数据量的应用提供灵敏度和数据量优化。

核心优化功能

1. 灵敏度调整

// 减少微小移动的数据发送
(2, 1) × 0.5(1, 0) // 忽略微小移动

2. 移动累积

// 累积多次小移动,批量发送
(1, 0) + (1, 1) + (0, 1)(2, 2) // 减少3次发送为1次

3. 阈值过滤

// 忽略低于阈值的移动
(1, 0) → 忽略 // 如果阈值=2

4. 统计监控

// 实时监控优化效果
// 接收1000事件,发送300事件,过滤率70%

工作流程

// ==================== 主处理流程 ====================
函数 处理鼠标移动(原始dx, 原始dy):总事件数++// 1. 灵敏度调整阶段(调整dx, 调整dy) = 应用灵敏度乘数(原始dx, 原始dy)// 2. 阈值检查阶段如果 (调整dx和dy都小于阈值 且 不要求立即发送):如果 (启用累积模式):累积移动量(调整dx, 调整dy)  // 先存起来不发送返回 空                  // 此次不发送数据否则:返回 空                  // 直接丢弃微小移动否则:// 3. 准备发送阶段(最终dx, 最终dy) = 获取最终移动量(调整dx, 调整dy)如果 (最终dx和dy都为0):返回 空                  // 没有实际移动否则:发送事件数++返回 (最终dx, 最终dy)     // 发送优化后的数据// ==================== 灵敏度调整 ====================
函数 应用灵敏度乘数(dx, dy):如果 (灵敏度乘数 ≈ 1.0):返回 (dx, dy)               // 不做调整新dx = 四舍五入(dx × 乘数)新dy = 四舍五入(dy × 乘数)// 确保不丢失移动方向如果 (dx ≠ 0 且 新dx = 0): 新dx = 符号(dx)如果 (dy ≠ 0 且 新dy = 0): 新dy = 符号(dy)返回 (新dx, 新dy)// ==================== 移动累积 ====================
函数 累积移动量(dx, dy):累积x += dx累积y += dy// 防止累积过大(避免延迟感)累积x = 限制范围(累积x, -最大累积值, 最大累积值)累积y = 限制范围(累积y, -最大累积值, 最大累积值)// ==================== 获取最终移动量 ====================
函数 获取最终移动量(当前dx, 当前dy):最终dx = 当前dx + 累积x最终dy = 当前dy + 累积y重置累积()                      // 清空累积器返回 (最终dx, 最终dy)// ==================== 强制发送 ====================
函数 强制发送所有累积():如果 (累积x ≠ 0 或 累积y ≠ 0):移动量 = (累积x, 累积y)重置累积()返回 移动量                 // 发送所有累积的移动否则:返回 空

以下是单独封装的鼠标灵敏度优化类:

using System;
using System.Diagnostics;/// <summary>
/// 鼠标灵敏度优化器 - 减少鼠标移动事件的数据发送量
/// </summary>
public class MouseSensitivityOptimizer
{private readonly double _sensitivityMultiplier;private int _accumulatedDx;private int _accumulatedDy;private readonly int _minMovementThreshold;private readonly int _maxAccumulation;private readonly bool _enableAccumulation;/// <summary>/// 灵敏度优化统计信息/// </summary>public class OptimizationStats{public int TotalEventsReceived { get; set; }public int TotalEventsSent { get; set; }public int EventsFiltered => TotalEventsReceived - TotalEventsSent;public double FilterRate => TotalEventsReceived > 0 ? (double)EventsFiltered / TotalEventsReceived : 0;}public OptimizationStats Stats { get; } = new OptimizationStats();/// <summary>/// 初始化鼠标灵敏度优化器/// </summary>/// <param name="sensitivityMultiplier">灵敏度乘数(0.5=减半,2.0=加倍)</param>/// <param name="minMovementThreshold">最小移动阈值(像素)</param>/// <param name="maxAccumulation">最大累积量(像素)</param>/// <param name="enableAccumulation">是否启用移动累积</param>public MouseSensitivityOptimizer(double sensitivityMultiplier = 1.0, int minMovementThreshold = 1, int maxAccumulation = 10,bool enableAccumulation = true){_sensitivityMultiplier = Math.Clamp(sensitivityMultiplier, 0.1, 10.0);_minMovementThreshold = Math.Max(1, minMovementThreshold);_maxAccumulation = Math.Max(1, maxAccumulation);_enableAccumulation = enableAccumulation;Debug.WriteLine($"MouseSensitivityOptimizer initialized: " +$"Multiplier={_sensitivityMultiplier:F2}, " +$"Threshold={_minMovementThreshold}, " +$"MaxAccumulation={_maxAccumulation}");}/// <summary>/// 从环境变量创建优化器(兼容DeskFlow设计)/// </summary>public static MouseSensitivityOptimizer FromEnvironmentVariable(string envVarName = "DESKFLOW_MOUSE_ADJUSTMENT"){double multiplier = 1.0;try{string envValue = Environment.GetEnvironmentVariable(envVarName);if (!string.IsNullOrEmpty(envValue)){if (double.TryParse(envValue, out double parsedValue)){multiplier = Math.Clamp(parsedValue, 0.1, 10.0);Debug.WriteLine($"Loaded sensitivity multiplier from {envVarName}: {multiplier:F2}");}else{Debug.WriteLine($"Invalid {envVarName} value: {envValue}");}}}catch (Exception ex){Debug.WriteLine($"Error reading environment variable {envVarName}: {ex.Message}");}return new MouseSensitivityOptimizer(multiplier);}/// <summary>/// 处理鼠标移动输入,返回优化后的移动量/// </summary>/// <param name="dx">原始X移动量</param>/// <param name="dy">原始Y移动量</param>/// <param name="sendImmediately">是否立即发送(忽略累积)</param>/// <returns>优化后的移动量,null表示应该忽略此次移动</returns>public (int dx, int dy)? ProcessMovement(int dx, int dy, bool sendImmediately = false){Stats.TotalEventsReceived++;// 1. 应用灵敏度调整(int adjustedDx, int adjustedDy) = ApplySensitivityAdjustment(dx, dy);// 2. 检查是否低于阈值if (IsBelowThreshold(adjustedDx, adjustedDy) && !sendImmediately){// 累积小幅度移动if (_enableAccumulation){AccumulateMovement(adjustedDx, adjustedDy);return null; // 暂时不发送}else{// 不启用累积时,直接忽略微小移动return null;}}// 3. 获取最终要发送的移动量(包括累积值)(int finalDx, int finalDy) = GetFinalMovement(adjustedDx, adjustedDy);if (finalDx == 0 && finalDy == 0){return null; // 没有实际移动}Stats.TotalEventsSent++;Debug.WriteLine($"Movement optimized: ({dx},{dy}) -> ({finalDx},{finalDy}) " +$"[Filtered: {Stats.FilterRate:P0}]");return (finalDx, finalDy);}/// <summary>/// 强制发送所有累积的移动量/// </summary>public (int dx, int dy)? FlushAccumulatedMovement(){if (_accumulatedDx == 0 && _accumulatedDy == 0){return null;}var movement = (_accumulatedDx, _accumulatedDy);ResetAccumulation();Stats.TotalEventsSent++;Debug.WriteLine($"Flushed accumulated movement: ({movement.dx},{movement.dy})");return movement;}/// <summary>/// 重置优化器状态(如屏幕切换时)/// </summary>public void Reset(){ResetAccumulation();Debug.WriteLine("Mouse sensitivity optimizer reset");}/// <summary>/// 应用灵敏度乘数/// </summary>private (int dx, int dy) ApplySensitivityAdjustment(int dx, int dy){if (Math.Abs(_sensitivityMultiplier - 1.0) < 0.01){return (dx, dy); // 无调整}int adjustedDx = (int)Math.Round(dx * _sensitivityMultiplier);int adjustedDy = (int)Math.Round(dy * _sensitivityMultiplier);// 确保至少保持原始方向if (dx != 0 && adjustedDx == 0) adjustedDx = Math.Sign(dx);if (dy != 0 && adjustedDy == 0) adjustedDy = Math.Sign(dy);return (adjustedDx, adjustedDy);}/// <summary>/// 检查移动量是否低于发送阈值/// </summary>private bool IsBelowThreshold(int dx, int dy){return Math.Abs(dx) < _minMovementThreshold && Math.Abs(dy) < _minMovementThreshold;}/// <summary>/// 累积移动量/// </summary>private void AccumulateMovement(int dx, int dy){_accumulatedDx += dx;_accumulatedDy += dy;// 防止累积过大_accumulatedDx = Math.Clamp(_accumulatedDx, -_maxAccumulation, _maxAccumulation);_accumulatedDy = Math.Clamp(_accumulatedDy, -_maxAccumulation, _maxAccumulation);}/// <summary>/// 获取最终要发送的移动量(包括当前和累积值)/// </summary>private (int dx, int dy) GetFinalMovement(int currentDx, int currentDy){int finalDx = currentDx + _accumulatedDx;int finalDy = currentDy + _accumulatedDy;ResetAccumulation();return (finalDx, finalDy);}/// <summary>/// 重置累积值/// </summary>private void ResetAccumulation(){_accumulatedDx = 0;_accumulatedDy = 0;}
}// 使用示例
public class MouseSensitivityExample
{private readonly MouseSensitivityOptimizer _optimizer;public MouseSensitivityExample(){// 从环境变量创建或直接配置_optimizer = MouseSensitivityOptimizer.FromEnvironmentVariable();// 或者手动配置:// _optimizer = new MouseSensitivityOptimizer(//     sensitivityMultiplier: 0.7,  // 降低30%灵敏度//     minMovementThreshold: 2,     // 2像素以下不立即发送//     maxAccumulation: 8,          // 最大累积8像素//     enableAccumulation: true// );}public void ProcessMouseMove(int dx, int dy){// 使用优化器处理移动var optimizedMovement = _optimizer.ProcessMovement(dx, dy);if (optimizedMovement.HasValue){// 发送优化后的移动数据SendMouseMove(optimizedMovement.Value.dx, optimizedMovement.Value.dy);}// 否则忽略此次移动(已累积)}public void OnScreenSwitch(){// 屏幕切换时强制发送所有累积的移动var flushedMovement = _optimizer.FlushAccumulatedMovement();if (flushedMovement.HasValue){SendMouseMove(flushedMovement.Value.dx, flushedMovement.Value.dy);}_optimizer.Reset();}private void SendMouseMove(int dx, int dy){// 实际网络发送逻辑Debug.WriteLine($"Sending mouse move: ({dx},{dy})");}public void PrintStats(){var stats = _optimizer.Stats;Debug.WriteLine($"Optimization stats: " +$"{stats.TotalEventsReceived} received, " +$"{stats.TotalEventsSent} sent, " +$"{stats.FilterRate:P0} filtered");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96653.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96653.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/96653.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习 [白板推导](十三)[条件随机场]

​ 17. 条件随机场&#xff08;Conditional Random Field&#xff0c;CRF&#xff09; 17.1. 背景 机器学习分类模型中&#xff0c;有硬分类和软分类两种主流思想&#xff0c;其中硬分类模型有支持向量机SVM&#xff08;最大化几何间隔&#xff09;、感知机PLA&#xff08;误…

调味品生产过程优化中Ethernet/IP转ProfiNet协议下施耐德 PLC 与欧姆龙 PLC 的关键通信协同案例

案例背景在食品饮料行业&#xff0c;生产过程的精准控制对于保证产品质量和安全至关重要。某知名食品饮料企业的生产线上&#xff0c;前处理、灌装和包装环节采用了基于 ProfiNet 主站的施耐德 M340 系列 PLC 进行控制&#xff0c;以确保生产过程的稳定性和精确性。而原料仓储和…

Elasticsearch vs 单表LIKE查询性能对比

关键因素影响 1、索引结构&#xff1a; .Elasticsearch使用倒排索引&#xff0c;特别适合文本搜索 .传统数据库即使有索引&#xff0c;对LIKE %keyword%这种模式也无法有效利用 2、查询复杂度&#xff1a; .简单查询&#xff1a;ES快5-10倍 .复杂组合查询&#xff1a;ES可能快1…

如何通过WordPress联盟营销获取潜在客户

您是否经营着一个销售周期较长的业务&#xff1f; 那么你就会知道&#xff0c;从首次访问者那里获得立即销售的机会是很少见的。 当然&#xff0c;您的潜在客户在进行重大投资之前需要时间进行研究、比较各种方案并建立信任。这时&#xff0c;联盟营销线索挖掘就成为您的秘密…

git实战(8)git高阶命令分析【结合使用场景】

以下是 Git 高阶命令分享&#xff0c;涵盖高效协作、历史重构、问题排查等场景&#xff0c;助你成为 Git 高手&#xff1a; 一、历史重构与清理 1. 交互式变基&#xff08;改写历史&#xff09; git rebase -i HEAD~3 # 修改最近3次提交操作选项&#xff1a; reword&#xff1…

生成一个竖直放置的div,宽度是350px,上面是标题固定高度50px,下面是自适应高度的div,且有滚动条

<!-- 我要生成一个竖直放置的div&#xff0c;宽度是350px&#xff0c;上面是标题固定高度50px&#xff0c;下面是自适应高度的div&#xff0c;且有滚动条。 --><style>html,body{/* height:100vh; */margin:10px; padding:10px;} </style><div style"…

题解:P13754 【MX-X17-T3】Distraction_逆序对_前缀和_Ad-hoc_算法竞赛C++

Beginning 这道题思维难度很大&#xff0c;有两个难点其实都不好解决&#xff0c;但因为其代码太过弱智所以只是绿题。 本题解详细地分析了做题时的历程与思路&#xff0c;所以希望大家可以仔细地完整阅读。 Analysis 首先先大体观察一下题目的性质&#xff1a;nnn 是排列&…

Android Studio下载gradle文件很慢的捷径之路

小伙伴们是不是也经常遇到导入新的项目时&#xff0c;AS一直卡在gradle的下载中。下面介绍一种简单暴力的方式来处理这个问题。 首先我们到gradle的官网下载自己想要的gradle版本。我这里以gradle7.5为例。点击下载gradle-7.5-bin.zip的压缩包。下载完成后无需解压。直接到C:\U…

【C++】全局变量/静态变量的初始化时机

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、全局变量下断点调试1. int a 10; —— 不能卡住断点2. static int b; —— 不能卡住断点3. MyClass c; —— 可以卡住断点4. static MyClass d; —— 可以卡住断…

水体反光 + 遮挡难题破解!陌讯多模态融合算法在智慧水务的实测优化

一、智慧水务行业检测痛点&#xff08;数据支撑 场景难点&#xff09; 根据《2023 年中国智慧水务发展报告》&#xff0c;当前水务监控系统在核心业务场景中面临两大效率瓶颈&#xff0c;直接影响水厂运维与供水安全&#xff1a; 高误报率导致运维资源浪费&#xff1a;水厂沉…

C++的指针和引用:

目录 引用&#xff1a; 注意&#xff1a; 左值引用和右值引用&#xff1a; 左值引用&#xff1a; 右值引用&#xff1a; 指针&#xff1a; 指针与引用的区别&#xff1a; 引用&#xff1a; 在C中&#xff0c;‌引用‌是一种为已存在变量创建别名的机制&#xff0c;它允…

图像处理中的伪影

目录 一、块效应伪影 / 块状伪影 二、 去除块状伪影 三、振铃伪影 一、块效应伪影 / 块状伪影 块状伪影(Blocking Artefacts)是对经过变换编码的图像进行重建时&#xff0c;图像中可能会出现压缩过程产生的可见伪影。基于块的变换编码中&#xff0c;一种常见伪影是 “块效应…

Java:对象的浅拷贝与深拷贝

目录 一、概念 二、实现方式 2.1 浅拷贝&#xff08;不推荐&#xff09; 2.2 深拷贝 2.2.1 方法一&#xff1a;重写 clone() 方法并递归克隆&#xff08;常用&#xff09; 2.2.2 方法二&#xff1a;通过序列化实现&#xff08;更强大&#xff0c;但更重&#xff09; 2.2…

佰钧成 社招 一面

1. “评估需求、排期”的工作流程&#xff1f; “我的工作流程一般是这样的&#xff1a; 需求评审&#xff1a; 首先会和产品、后端同学一起过需求&#xff0c;确保我完全理解了业务背景和要实现的价值&#xff0c;而不仅仅是功能点。技术方案设计&#xff1a; 之后&#xff0c…

最短路径问题(图论)

1 Floyd 作用&#xff1a; 求图中所有顶点之间的最短路径&#xff0c;包括有向图或者无向图&#xff0c;权重正负皆可&#xff0c;用来一次性求所有点之间的最短路径。 思路是 通过逐步扩大中间层&#xff0c;使得最短路径不断被更新&#xff0c;直到中间层扩大到n位置&#…

2025年8月新算法—云漂移优化算法(Cloud Drift Optimization Algorithm, CDO)

1、简介 这项研究介绍了云漂移优化&#xff08;数位长&#xff09;算法&#xff0c;这是一种创新的自然启发的元启发式方法来解决复杂的优化问题。CDO模仿受大气力影响的云粒子的动态行为&#xff0c;在探索和利用之间取得了微妙的平衡。它具有自适应权重调整机制&#xff0c;可…

VS Code进行.NET开发时使用断点和热重载

VS Code 调试热重载 1. VS Code 设置 安装扩展&#xff1a;C#、C# Dev Kit设置中搜索hot reload&#xff0c;选择C#开发工具包&#xff0c;把下图的几项全部打勾2. 启动项目&#xff08;仅用左侧“运行和调试”&#xff09; 打开解决方案&#xff0c;选你的启动项目的“.NET La…

mysqlbinlog解析命令

解析 MySQL Binlog 详细信息的命令以下是解析 MySQL Binlog 详细信息的常用命令&#xff1a;1. 基本 binlog 解析命令# 查看 binlog 文件内容&#xff08;基本格式&#xff09; mysqlbinlog /var/lib/mysql/mysql-bin.000001# 查看特定时间段的 binlog mysqlbinlog --start-dat…

算法训练营day60 图论⑩ Bellman_ford 队列优化算法、判断负权回路、单源有限最短路(修改后版本)

增加对最短路径的优化算法、负权回路、单源有限最短的讲解 Bellman_ford 队列优化算法 -------------------------------------------------------------------------------- 8.24更新&#xff1a;该算法是针对带负值的最短路径的优化算法&#xff0c;核心通过队列来实现&…

Python 学习(十六) 下一代 Python 包管理工具:UV

目录1. UV 介绍1.1 什么是UV&#xff1f;1.2 UV的核心优势1.3 UV和其他工具对比1&#xff09;UV vs. pipvirtualenv2&#xff09;UV vs. Conda3&#xff09;UV vs. Poetry4&#xff09;功能对比表2. UV的安装与常用命令2.1 安装UV1&#xff09;使用官方安装脚本&#xff08;推荐…