做了个节奏光剑的歌词插件

作者:V君 发布于:2020-8-2 8:56 Sunday 分类:折腾手记

TL;DR [ 下载 ][ 源代码

点击查看原图
效果:在游戏过程中同步显示带翻译、注音的歌词
安装:使用 ModAssistant 安装 IPA 和必要的库,然后将 BeatLyrics.dll 丢进 Plugins 目录
配置:一共需要设置两个环境变量,先设置环境变量再启动 Steam
  BeatSaberDir - 指向 BeatSaber 安装目录,让工具能扫描地图文件
  BeatLyricsDir - 指向歌词目录,工具将会把放歌词文件存到这里,插件将会来这里读取
使用:需要先用工具为地图添加歌词才能在游戏中显示
扯扯:

做这个玩意儿之前肯定会先看看有没有别人做好的东西,比如 BeatSinger 不过它的样式以及歌词关联方式并不符合我的习惯,于是就参照多个插件的源代码来整一个自己的版本,还搞了个管理界面来调整歌词时间轴。

标签: 软件开发 插件 C# Unity VR游戏

评论(1) 引用(0) 浏览(833)

【内存盘已可用】[稳!真香!]基于WinSpd驱动用C#实现虚拟磁盘

作者:V君 发布于:2020-6-14 11:14 Sunday 分类:折腾手记

老样子先 [ 源代码 ] and 目前实现已功能的用法 TL;DR 再展开扯扯。

在开始之前不要忘记安装 WinSpd 驱动,默认安装路径为 Program Files (x86)\WinSpd 附带有引用程序集和示例代码。安装包里面的驱动文件已经过数字签名,无需打开测试模式。

:: 创建磁盘镜像
svd create raw 50GB C:\Path\To\Your\Image.img
:: 创建虚拟磁盘并挂载镜像
svd mount image C:\Path\To\Your\Image.img
:: 创建虚拟磁盘并分配内存(内存盘)
svd mount ramdisk 10GB
:: 创建虚拟磁盘并分配内存(内存盘)建立NTFS分区并创建Temp文件夹
svd mount TempNtfsRamDisk 10GB
:: 创建虚拟磁盘并分配内存(内存盘)建立NTFS分区并创建Temp文件夹 然后分配盘符 Z:
svd mount ZTempNtfsRamDisk 10GB
:: 安装为windows服务
svd install SvdRamdisk10G mount ZTempNtfsRamDisk 10GB

别看 Main 的 Usage 写了那么多参数组合,其实目前也就实现了上面几条……

好了开扯吧! (o ‵-′)ノ”(ノ﹏<。)

两三年前我妄图免驱在 Windows 上实现 FUSE 结果被 WebDAV 坑了一把,接着又被 SMB 接口的实现劝退… 最近折腾起无盘,倒腾 iSCSI 发现这东西除了能实现无盘启动之外,并不香,性能也不高,连接到本地的 Ram Disk 也只有 200MB 每秒。

总的来说 Windows 上自带的这类功能设计的极为保守,iSCSI 和 SMB 在遇到一丁点儿差错的时候都首选了重试并等待的保守策略,造成的直观体验就是界面冻结。在 Windows 的免驱 FUSE、虚拟磁盘的尝试走到尽头。“我V君就算是饿死,从这里跳下去,也不使用三方驱动”自从看到 WinFsp 项目主页上介绍的 WinSpd 之后,“真香!

通过查看示例,发现 WinSpd 的使用方法十分简单,和 TalAloni 的 iSCSI 接口相似(其实都是在 SCSI 层转换成简单接口),还支持 TRIM(UNMAP) 指令,再稍加些外围代码把实现好的接口喂给驱动,运行起来就能听到插入U盘的提示音,然后就能在设备管理器和磁盘管理器中看到新增的虚拟盘了。

把之前做好的 RamDisk 实现移植过来之后就赶紧跑了跑性能测试看看,结果发现完爆 iSCSI 方式,速度可达 1.5GB 每秒,虽然没有 SuperSpeed RamDisk 快,但也够用了。起初认为可能是托管代码效率的影响,勉强尝试用C语言实现接口,发现性能也没差太远。那只能甩锅给内核与应用程序之间来回交互导致的性能损失了吧,印象中 SuperSpeed RamDisk 的内存占用会体现在 System 进程,那就能想象到 RamDisk 的逻辑全都在驱动中实现了。

接下来扯一下稳定性,之前我不首选使用第三方驱动来实现虚拟磁盘的原因是怕蓝屏。在保存好所有需要的东西后,开始做做死看看 WinSpd 的稳定性。尝试在实现的接口里面抛出异常、意外结束进程这些操作之后,发现稳定得一笔,一次蓝屏都没出现!接口中抛出异常给系统的反应是IO错误,进程意外结束则体现为拔掉U盘。这不就是我梦寐以求的粗暴策略吗?去你的重试等待!

最后就是「展望未来」环节了。如果把接口的实现做成 C/S 架构,就能在一定程度上把 iSCSI 代替掉了。目前我用 iSCSI 不仅用作启动,还用来跑远程存储、差分快照、RamDisk。若再加一些简单的压缩,或许还能突破 1Gbps 局域网传输速度呢,反正现在的 CPU 跑的这么快嘛!这就是自己造轮子的好处,可以随意改变姿势~

这个月的干货(?)

标签: 软件开发 C# 控制台 Windows服务

评论(0) 引用(0) 浏览(1008)

[成功]又逮到M$的BUG——十六进制模式下NumericUpDown错误解析,无痛修补!

作者:V君 发布于:2020-4-16 13:47 Thursday 分类:折腾手记

这次遇到的问题是在 WinForms 中使用 NumericUpDown 空间的十六进制模式时,若输入了大于 7FFFFFFF 的值之后,控件会把值非预期地变为 0 的情况。

点击查看原图

TL;DR

  1. 引入 NuGet 包「Lib.Harmony」
  2. 这个文件搬入项目中
  3. 调用 DoPatch 方法

这样不用改变任何现有实现,问题就解决啦!

现在你可以出去了(pia

如果还有时间,可以听我扯扯

最近在折腾一个参数设置的页面,需要填入一系列16、32位的十六进制数值,为了方便操作我就选择了 NumericUpDown 控件。首先将值范围设置成 0 到 65535(0xFFFF) 和 4294967295(0xFFFFFFFF)然后愉快地拿去用了。但是没有想到调试过程中发现了这个问题,起初以为是粘贴的值有空格导致拒绝接受,又尝试手打还是不行,摸索发现是超过 7FFFFFFF 就会触发。

进入解决问题的模式,先在咕狗上查找解决方案,然后就找到了继承并重写的方式。嗯问题的原因找到了,是 WinForms 控件的实现有 BUG,问题也解决了,既然咕狗能找到解决方案,那就不要发表内容重复文章污染互联网!(当时我压根没想过要发表出来

然鹅,这种方式并不适用于所有情况,比如对于封装了原生控件的界面库,就不能使用继承并重写的方式了,比起魔改 DLL 或者找到库源代码改掉,然后驮着到处跑,还是寻找另一种路子来解决这个问题吧。

一个鬼点子冒出来:能不能把跑起来之后把方法替换掉?这样无论是直接使用还是封装使用的情况,统统都把这个问题解决掉。又是一阵咕狗,然后就找到了 Harmony 库,如其名「和谐」,解决 BUG 于无形之中,达到不用修改现有实现、无痛修补代码的目的。

其实这是 monkey patch …

标签: 软件开发 C# bug

评论(0) 引用(0) 浏览(727)

通过嗅探标准输入输出来了解VisualGDB烧录操作

作者:V君 发布于:2020-4-12 13:55 Sunday 分类:折腾手记

这篇文章主要面向的是和我一样不熟悉 GDB 的人,请已经熟练使用 GDB 的老鸟不要笑,或者来看看我是怎样嗅探标准输入输出的也还凑合吧。

最近用起 VisualGDB 之后,总算从 Keil 的地狱中逃出生天,开发过程的确是很爽了。然而,如果仅仅是程序烧录到单片机也要装一个 VS 带上 VisualGDB,还得拿到源代码?很显然实际量产不应该这么做,理想的方式应该是将编译后的程序用烧录工具刷入单片机。

好奇心使我对这个过程产生了兴趣,从调试器适配的时候提示下载 OpenOCD 能看出 VisualGDB 是透过它来调用 ST-LINK 的,进一步又发现 OpenOCD 的另一边由 GDB 来操作。命令行参数可以用 Procexp 轻松获得,但进程启动之后的就全都是通过标准输入输出流来操作 GDB 了。

因为使用 GDB 是个过于庞大的课题,就懒得去学了,短时间内也不会用得顺手吧(如果懂得如何使用 GDB 的话还用得着 VisualGDB 么?

想知道 VisualGDB 如何操作 GDB 来烧录程序。首先去咕狗找找标准输入输出的捕获方法,不断换关键字兜了几圈回来没有一点收获,甚至一点线索都没有。

一拍脑袋,那就搞个透明代理来记录双向传递的内容吧。于是就写了个简单的标准输入输出流嗅探工具,还上传了一个直接可用的二进制文件,将原来的 EXE 改名扩展名前面增加 -real,例如 GDB.EXE 改成 GDB-real.EXE 然后用嗅探工具冒充它,启动之后就会在旁边产生名为 GDB.EXE.stdio-sniff.yyyymmdd-HHmmss-fff.log 的文本文件,将命令行参数标准输入标准输出错误输出记录到里面。

这样问题就解决了——原来烧录要用 GDB 的 load 命令。

然后进一步尝试离开 VS 环境独立运行,将 OpenOCD 和 GDB 以及编译好的程序搬到一台没有环境的机器,装好 ST-LINK 驱动,按照嗅探来的操作走一波,嗯嗯,吼!现在离开 VS 环境也能烧录了!

标签: 软件开发 C# 命令行 cmd 多进程 控制台 调试技术 软件故障诊断

评论(0) 引用(0) 浏览(612)

开始接触 STM32 —— Keil μVision 和 Visual Studio 相比太难用啦!

作者:V君 发布于:2019-12-31 10:59 Tuesday 分类:折腾手记

最近开始摸STM32,用 Keil μVision 来编写代码和调试。单片机型号是 F103 用 ST-Link/v2 以 SWD 的方式下载和调试。尽管 Keil 在占据的市场份额不小,但对于我这个被 VS 宠坏了的家伙来说,太难用啦!先列举些槽点,然后再看看有没有代替方案,如果能用 VS 来搞 STM32 开发就好咯……

吐槽:文档页签不能拖动
吐槽:编译、下载、启动调试,似乎不能一气呵成,得分开操作
  但愿是我不知道怎么配置一键,难道大伙们都能忍?
吐槽:智能感知……只能说是聊胜于无吧,尽管默认绑了 F12——
  可以转到定义,但在找到多个重复定义时,你蹦出一个符号窗格给我……
吐槽:项目 wide 搜索,貌似没有像VS那样列出匹配,只能上一个、下一个来导航
  但愿又是默认不启用的功能,只是我不没调出来……

代替方案?起初想到用 VsCode 来编辑代码,然后再回到 Keil 调试,考虑到 C 语言过于依赖环境,多一个少一个符号定义都会发生很大变化,估计 VsCode 的智能感知估计也不会好到哪里去吧……用各种关键字喂咕狗,找到一个叫做 VisualGDB 的扩展,主页上提到可以用来搞 STM32,但目前还没有试试看能不能用……(咕咕咕)后话:剁手买了正版,很香!

月底了,不刷存在感会觉得很方,必须凑合着发点什么出来

标签: 软件开发 嵌入式

评论(2) 引用(0) 浏览(1535)

Powered by emlog 去你妹的备案 sitemap