远程控制软件在 MacOS 上的优化
目前的远程控制软件的整个市场, 竟争已经非常的白热化了, 有非常的多软件例如: 象操作复杂的 Teamview, 国产传统的向日葵远程控制等等. 基本上优化都是针对 Windows, 主要是因为 Windows 可能占相应公司最大的用户比重的原因, 所以让 MacOS 都成为了二等公民.
在这, 还有几个原因, 首先. 是 Windows 本身硬件环境比较复杂, 要针对优化的硬件更加多, 为了更好的体验, 需要针对不同的显卡如 Intel 与英伟达来做优化, 如果给硬件显示的性能用上, 可以减少 15ms 的端到端延时(end-to-end delay) 通过屏幕编码技术上的优化, 才能达成更低的端到端延时. 其次, MacOS 在很多开发者看来更难开发, 比如 Cocoa 的这种技术, 还有 Object C 都在国内的开发者上不流行.
莎士比亚说的: “一千个观众眼中有一千个哈姆雷特”. 对于界面, 用户可是众口难调, MacOS 在这方面可能是做得最好, 界面 UI , 字体, 配色, 优化到基本上大家都满意. 但远程控制软件, 很多还是优化不充足. 比如现在流行的黑暗模式(DarkMode), 又叫深色模式, 相关的远程控制软件就很少支持. 这个在 MacOS 上如果能根据自动优化实现很棒的效果, 在晚上使用更加能让远程办公的人员沉浸进去.
想象一下: 晚上, 关掉家中房间的主灯, 然后打开一个台灯, 光线调暗指向自己工作的台面, 给操作系统变成深色模式. 然后所有软件也跟着变成了这个深色模式, 敲击着机械键盘, 是不是一下就来了工作的气氛. 但如果点击这个远程控制的软件, 跳出来是个白色, 是不是感觉一下就没了^_^.
![image-20211231101257971](/image/MacOS-better-Remote-Contron.assets/image-20211231101257971.png)
苹果对于软件的安全要求很高, 在 MacOS 中有个名为 Gatekeeper 的功能, 它会让我们在分发应用程序的过程会变麻烦。因为 MacOS 中的 Gatekeeper 会不断检查您正在运行的应用程序,确保其中没有任何可疑内容。您是否曾经启动过一个应用,结果却突然收到一条警告告诉您 该应用来自身份不明的开发者 那是由于 Gatekeeper 的功能在生效。
您可能已经注意到并非所有应用程序都会导致此警报弹出。它通常发生在不太受欢迎或非原生的应用程序中。没有弹出警报是因为我们的软件做了苹果所要求的签名和上传到苹果服务器那边进行公证并分发, 所以在 AppStore 中可以直接搜索到我们的软件.
我们远程控制软件对于安全在开发时更加需要注意, 因为大家对于自己的隐私都非常注意. 所以我们使用的点对点加密, 它的方式类似于 Telegram 的点对点加密. 发信息之前就已经通过公钥对信息进行加密了.
我们注意到, 在 MacOS 的相关操作系统中, 目前基本的远程控制软件, 都有个问题. 就是通常我们为了更加方便的远程操作对方的时候, 我们会使用远程协助软件的全屏显示功能. 但现在的类似软件都有个问题, 我们鼠标上移的时候, 想唤出操作栏的, 这时会出现系统的状态栏和远程协助软件的操作栏同时弹出的问题, 这时操作起来就很痛苦.就象下图一样, 弹出二个栏, 系统的状态栏与操作栏.
![image-20211231100539978](/image/MacOS-better-Remote-Contron.assets/image-20211231100539978.png)
秒点的 geelevel 远控, 针对这种情况做了特殊处理, 当我们点击全屏的时候, 我们会自动的检查系统的状态栏, 让他们与我们的操作栏不会同时弹出. 退出我们软件的全屏模式时, 这个功能消失. 接下来我们还设计了一种新的模式来做操作栏, 大家可以小小的期待一下.
当主控端画面窗口的大小进行了缩放, 通常在 Windows 上一定会这样, 并且苹果的 MacOS 在 4k 屏幕上会给 4 个象素合成一个来显示,这时远程控制会出现光标很大或很小的情况,与画面不成比例,严重影响远控的使用体验, 并且也影响点击的精准程度。这对于设计师, 或对于使用远程控制软件, 进行远程办公的人员, 有致命的打击.如下, 同类友商在 MacOS 下的效果.
被控制主机鼠标显示大小
![image-20211231103955424](/image/MacOS-better-Remote-Contron.assets/image-20211231103955424.png)
发起控制的一方显示的大小
![image-20211231102645962](/image/MacOS-better-Remote-Contron.assets/image-20211231102645962.png)
所以主控端的光标大小需要做适配处理。秒点远程 geelevel 会当主控端画面窗口进行缩放的时候,获取当前窗口的大小,与画面原始分辨率的大小进行比较,计算出缩放比例,然后根据缩放比例改变本地光标的大小。
当被控端改变了分辨率的时候,我们要将分辨率变化的消息通知到主控端,主控端收到消息后,将分辨率与画面渲染窗口的大小进行比较,计算出缩放比例,然后根据缩放比例改变本地光标的大小。
关于鼠标, 我们有平滑处理, 还有 FEC 之类的技术机制, 以后的文章中在详细介绍.