当前位置: 首页 > news >正文

一台电脑两台手柄?任意 PC 游戏双人分屏的完整指南

一台电脑两台手柄?任意 PC 游戏双人分屏的完整指南

【免费下载链接】UniversalSplitScreenSplit screen multiplayer for any game with multiple keyboards, mice and controllers.项目地址: https://gitcode.com/gh_mirrors/un/UniversalSplitScreen

Universal Split Screen 是一个开源的 PC 游戏分屏工具:一台电脑接上两套键盘鼠标或多只手柄,就能让本来只有单人模式的 PC 游戏实现本地多人同屏对战。它按玩家数量把游戏画面切块,把每套输入设备分别"喂"给对应的玩家区域,整个过程对游戏本身透明。

三步完成安装与编译

先克隆源码:

git clone https://gitcode.com/gh_mirrors/un/UniversalSplitScreen

用 Visual Studio 打开 UniversalSplitScreen.sln 后,按下面的顺序编译各组件(各项目的后构建脚本会自动改名并复制到指定位置):

  1. 主程序:UniversalSplitScreen,用 x86 平台编译,产出主应用;
  2. HooksCPP:x86 与 x64 各编一次,得到 HooksCPP32.dll 与 HooksCPP64.dll,放到主程序目录;
  3. InjectorLoader:x86 与 x64 各编一次,得到 IJx86.exe 与 IJx64.exe,同样放进主程序目录;
  4. SourceEngineUnlocker:x86 编译后,把 SourceEngineUnlocker.dll 复制到主程序目录,供 Source 引擎游戏使用。

也可以直接用 Visual Studio 的批量构建一次编完。配置如何生效:程序启动时会扫描程序目录下 Config 中的全部 JSON 文件,每个文件对应一套游戏选项,加载进界面上方的下拉框。想支持自己的游戏,照着现有格式新建一个 JSON、填好OptionsName即可被识别。

预置游戏与分屏效果

Config 目录已内置 13 份经过调优的预设,按类型大致可以这样分:

类别预置游戏
沙盒建造Minecraft(1.14.3 与 Alternate 两套)、Terraria
生存冒险Don't Starve Together、Stardew Valley、Starbound
动作射击Borderlands 2、Nuclear Throne
策略模拟Factorio、Prison Architect
引擎通用Source Engine、GoldSrc Engine
其他Rift

Source Engine 与 GoldSrc 这两份是"通杀"配置,同引擎的《半条命 2》《Garry's Mod》一类游戏都可以直接套用。分屏时每个玩家拿到独立的操作视角与输入通道,窗口被均分或按人数切块,互不抢占。

工作原理简述

整条链路只有三个角色,各司其职:

  • 输入钩子(HooksCPP):一个 C++ 动态库,注入游戏进程后接管游戏读取键位、鼠标位置的 Windows 系统调用。游戏每次"问键盘",它都先过一道筛子,让各玩家只看到自己那部分输入。
  • 进程注入器(InjectorLoader):把钩子库装进目标游戏进程。这里要解释一下"进程注入":Windows 下往另一个程序里塞代码的唯一常规手段,就是先把代码写成 DLL 再让它被加载,注入器做的就是这件事,32 位与 64 位游戏各有一把钥匙。
  • 窗口管理(主程序内的 SplitScreenManager):按玩家数量把游戏窗口切成若干区域,并持续修正边界,保证玩家 1 的键位不会误发给玩家 2 的区域。

输入本身走的是 Raw Input——Windows 提供的原始输入接口,能绕过系统级的消息轮询直接拿到设备的原始信号,延迟低且与游戏自身的输入方式兼容。

配置参数调优清单

每个游戏预设都是一个 JSON 文件,常用参数分四组:

参数组代表字段作用
输入发送方式SendNormalKeyboardInputSendNormalMouseInputSendRawMouseInputSendScrollwheel选择用普通消息、原始输入还是滚轮事件去"喂"游戏,多数游戏用普通模式即可
钩子开关Hook_GetAsyncKeyStateHook_GetKeyStateHook_GetForegroundWindowHook_FilterRawInput决定拦截哪些系统查询函数,按引擎逐个开关,Source 引擎一般全开
窗口行为RefreshWindowBoundsOnMouseClickDrawMouseSendWM_ACTIVATE控制是否随点击刷新窗口边界、是否绘制系统鼠标、切换时是否激活窗口
手柄Hook_XInputHook_DirectInput分别接管 XInput(Xbox 手柄)与 DirectInput 两套手柄接口

调优建议:

  • 游戏保持窗口化或无边框模式运行,全屏独占下窗口管理手段全部失效;
  • 分屏分辨率按显示器实际规格设置,切块过多会压低单侧帧率;
  • 感觉输入有延迟时优先检查钩子开关是否与引擎匹配,而不是调系统设置;
  • 多显示器时建议整块屏幕分给游戏,避免跨屏切割带来的错位;
  • 分屏前关掉吃 CPU 的后台程序,给每个玩家的输入轮询留足预算。

常见问题自查

现象可能原因解决办法
第二套输入完全没有反应游戏以管理员运行而工具没有两边权限保持一致,都用管理员身份启动
分屏错位、鼠标飘到别人区域游戏处于独占全屏改为窗口化或无边框窗口再分屏
手柄识别不到XInput / DirectInput 钩子未开启按实际手柄接口打开Hook_XInputHook_DirectInput
配置文件不生效JSON 格式错误或缺少OptionsName对照现有预设检查字段名与引号,重启程序重新加载

项目结构与参与方式

源码分成几个职责清晰的块:

目录 / 组件职责
Core主程序协调:配置加载、分屏状态、更新检查
RawInput基于原始输入接口采集键盘、鼠标、手柄的原始数据
SendInput把整理好的输入以系统消息形式发回给游戏
UI操作界面:选项下拉框、复选框、更新弹窗
Config全部游戏预设 JSON
HooksCPP / InjectorLoader / SourceEngineUnlocker输入钩子、进程注入器、引擎解锁,均为 C++ 组件,各有 x86 与 x64 版本

项目采用 MIT 许可证,参与方式不限:提交 issue 反馈问题、修改或扩展代码、为新游戏编写 JSON 预设、翻译文档都可以。改动主程序时注意编译平台是 x86,钩子与注入器则两个平台都要出。

Universal Split Screen 的价值在于把"PC 游戏没有本地多人"这件事变成了纯工程问题。挑一份现成预设跑通你的第一款游戏,是上手的最佳起点。

【免费下载链接】UniversalSplitScreenSplit screen multiplayer for any game with multiple keyboards, mice and controllers.项目地址: https://gitcode.com/gh_mirrors/un/UniversalSplitScreen

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.cnnetsun.cn/news/4157280.html

相关文章:

  • 跑通多模态情感分析:Multimodal-Sentiment-Analysis 图文融合实战指南
  • MonitorControl|macOS外接显示器亮度音量一键调:多屏办公党的屏幕控制方案
  • 论文AI率0%黑科技!降AIGC网站留学生亲测::Turnitin查重秒变“教授最爱”原创风
  • 题解:洛谷 P3184 [USACO16DEC] Counting Haybales S
  • 文档加载工程:从多格式数据到标准化Document对象的实战指南
  • 5 步装好 Windows 微信防撤回补丁:RevokeMsgPatcher 新手完整教程
  • Unlock-Music 音乐解密完整指南:在浏览器里批量解密 qmc、ncm 等加密音乐文件
  • AnythingLLM 本地部署完全指南:私有知识库文档问答
  • Linux入门攻坚——86、ELK Stack-1-基本概念
  • SpringBoot+微信小程序旅游平台:从零到部署的毕设实战指南
  • U盘重装Windows系统全攻略:从启动盘制作到安装设置详解
  • DatalinkX 快速上手指南:从零到跑通第一个数据同步任务
  • 3分钟把整本网页小说存成EPUB:WebToEpub离线阅读工具上手笔记
  • LinkSwift 网盘直链解析工具:实用新手指南
  • 万店连锁智能运维实践:从告警驱动到一键根因定位的STAROps体系
  • slack-irc 消息格式转换艺术:Slack到IRC文本解析与表情映射完整剖析
  • MobilityDB查询完全手册:时空重叠、距离计算与轨迹插值SQL函数大全
  • PhpStorm‑2026.2 完整下载‑安装‑环境配置全套教程(Windows 完整版,适配 PHP8.5、WampServer)
  • React Native和Flutter如何接入Mobile App Automizer?跨平台项目发布自动化实战指南
  • Chrome插件如何实现网页搜索替换:chrome-extensions-searchReplace让整页文字批量更新不伤按钮
  • ISP Tuning 使用
  • NAudio实战上手:5分钟搭出能用的音频播放器
  • TPU与Mooncake集成:如何实现AI推理服务的极致性能与确定性
  • NumPy eigh函数详解:对称矩阵特征值计算的高效工具
  • 基于主体建模(ABM)模拟农业技术采纳:以低排放肥料推广为例
  • 为什么你的 Free Domains 免费子域名申请被拒?10个高频踩坑问题一次说透
  • 金属垫片介绍
  • 从扩散模型到AI设计平台:构建可控生成式AI应用的技术实践
  • [AutoSar]BSW_Memory_Stack_002 NVM介绍
  • iOS推送机制深度解析:挂起态数据存储奥秘