玲珑开发学习记录

个人介绍

梦魇兽,大家叫我小梦即可

  • 本科毕业入职滴滴半年升职,滴滴高级架构研发工程师
  • 两年绩效最优
  • 现裸辞,找寻生命的意义
  • 个人有比较多的软件,比如速享、无界、ADBKIT、Code FA,我个人软件涉及的技术栈远比我在公司所接触的多得多

所以我经常会说,技术本身会是各种过程中,最小的问题

再见滴滴研发,你好梦魇兽

这个博客记录我的一些想法和学习的一些资料

玲珑后台服务

需求场景是,控制风扇转速和设置 TDP 功耗都需要管理员权限,所以玲珑管家在编译的时候就有设置请求管理员权限
这是通过 cmakefile 来实现的

1
SET_TARGET_PROPERTIES(${BINARY_NAME} PROPERTIES LINK_FLAGS    "/MANIFESTUAC:\"level='requireAdministrator' uiAccess='false'\" /SUBSYSTEM:WINDOWS")

所以管理员权限是玲珑的一个必备条件,但是刚开机的时候,用户是没有空间给到玲珑管家管理员权限的

所以我编写一个玲珑服务

这个服务依赖 Windows 的任务计划,开机后不用进入系统,就能把服务启起来,并且能够带有管理员权限

这个目前在玲珑打开的时候就会执行,不用用户手动创建任务计划

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 获取脚本所在目录
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path

# 要启动的程序路径
$programPath = Join-Path $scriptDir "tiny_server.exe"

# 任务名称
$taskName = "TinyManagerAutoStart"

# 检查任务是否存在
$task = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue

if ($task) {
# 如果任务存在,先删除任务
Unregister-ScheduledTask -TaskName $taskName -Confirm:$false
Write-Output "任务已删除。"
}

# 创建新的任务
$action = New-ScheduledTaskAction -Execute $programPath
$trigger = New-ScheduledTaskTrigger -AtStartup
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable

# 注册任务计划
Register-ScheduledTask -TaskName $taskName -Action $action -Trigger $trigger -Principal $principal -Settings $settings
Write-Output "任务已创建并设置为开机启动。"

后台服务隐藏终端

两种方式

一种是默认配置 VS 工程,调用 FreeConsole 函数隐藏终端,再设置一个循环,让程序不退出

1
2
3
4
FreeConsole();
while (running) {
std::this_thread::sleep_for(std::chrono::seconds(10));
}

另一种是直接更改程序子系统为 /SUBSYSTEM:WINDOWS,这样就不会有终端出现,但是这种方案需要改代码入口

1
2
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
}

Windows 共享库

我尝试编写可以交叉编译的 Cmakefile,但是失败了,后面的编译都是通过 Visual Studio 来编译的

需要有些配置

共享库开发好,后面不管是使用任何的上层框架都可以方便的调用

两种方法,一种是设置宏,一种是 .def 文件

def

所以底层对外的输出应该是一个 dll 和一个 .h 文件

例如 dart,可以直接根据 .h 文件生成 dart 文件,可以很方便的调用 dll 中的函数

简单说就是,.h 文件维护好,我就能以很好的代码在各个地方调用

风扇控制

这个我得到的输入是一大坨 C# 代码和这样的文本消息,有点难理解,不过后面代码已经可以控制了,

1
2
3
4
5
6
7
8
9
ARB33
Fan 控制权:0xF02
写0x6C:手动控制转速
写0x00:自动转速

控制Fan :0x1809
写0~0xB8(0xB8对应100%)

读转速:0x0218~0x0219

https://github.com/GermanAizek/WinRing0

然后调研到更改内存的 WingRing0 库

最后经过好些折腾才写出了对应的 dart 代码,不仅是 dart,其他代码要实现控制风扇也比较麻烦

更优解是做成类似于 parsec 的驱动,需要控制风扇的程序根据驱动协议来调用

功耗设置

这个我没有得到可用的输入,自己找到一个是 ryzenadj-win64
对玲珑也是可用的

虚拟显示器

这个目前找到两个关键的库,一个是 parsec-vdd,一个是 Virtual-Display-Driver
https://github.com/nomi-san/parsec-vdd
https://github.com/itsmikethetech/Virtual-Display-Driver

后者我目前没有学会如何使用,所以目前都是用的 parsec-vdd

parsec-vdd 需要安装驱动,但是这个后面也可以自动安装

目前已经实现了开机不需要进入系统就能创建虚拟显示器。

串流软件相关

我个人 Moonlight+Sunshine,或者 Parsec 都是比较大量使用的,我其实不理解为什么 Sunshine 和 Moonlight 会有这么多的分支

但我后面会再详细了解一些这些原因,例如 Sunshine 有阿姨版本,为什么不能往官方提 PR,因为我自己就是一个极度热爱开源的人

者我通常用来玩儿游戏,后者我通常是非游戏需求,因为他支持剪切板共享

Parsec 使用成本其实相对要更低一点

并且我在玲珑上装了 Parsec 后,另一台电脑 A、B 或者 Android 装了 Parsec

不仅 A、B 可以控制玲珑

玲珑是可以直接控制电脑 A、B 的

所以一部分用户肯定是要使用 Parsec 的,并且使用 Moonlight 和 Parsec 的用户都要同等看待

不能直接说 Parsec 的用户就有解决问题的能力,玲珑管家都不适配 Parsec 了

关于玲珑的一点思考

也是我在使用玲珑的一个感受,我家里有 ITX 主机,平时 Mac 也是不离身的,也就是说,我出门,Mac 是一定会带的

那么玲珑对于我这类用户,就是一个比较尴尬的定位

但是经过一些时间,我发现了他的一些使用场景

就是作为串流机

也就是借助玲珑连接我家里的 ITX,这样我不管在哪儿,都能以家里的性能玩儿到游戏

为什么这个设备不是 Mac 呢,因为我手上测试过 5 款手柄,包括飞智,这些手柄都不支持有线连接 Mac

唯一一款支持有线 Mac 的是 Xbox 手柄,但是 Xbox 手柄有没有其他手柄的震感、陀螺仪等

有线可以让我有一个更低的延迟

所以我经常用玲珑去串流我家里的设备

不要再给用户发任何的demo了

作者

梦魇兽

发布于

2024-08-08

更新于

2024-08-13

许可协议

评论