# RangServer
**Repository Path**: aaaaaaa8/rang-server
## Basic Information
- **Project Name**: RangServer
- **Description**: 壤台服务端
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-02-16
- **Last Updated**: 2025-07-03
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 虚幻引擎UE5 像素流 依赖 [中文](README-zh.md) [English](README.md)
和官方臃肿不堪的像素流SDK相比,我们在官方的基础上做了大量的优化和精简,开发出了轻量、零依赖、开箱即用的软件套装,前端的peer-stream.js基于WebComponentsAPI,后端signal.js基于NodeJS、npm/ws及npm/express。
| 文件名 | 大小 | 作用 |
| -------------- | ---- | ---------------------------- |
| /public/api.js | 18KB | 浏览器SDK,一键开启。 |
| signal.js | 5KB | 信令服务器、负载均衡、认证。 |
| http.js | <1KB | ws服务器转发。 |
| server.js | <1KB | 内置前端服务器、远程启动UE。 |
| .signal.js | <1KB | 通过环境变量调节signal.js。 |
| turn.js | <1KB | turn穿透服务 |
| test.html | 3KB | 测试网页。 |
## 示例
```s
# 安装node环境
npm install
# 启动服务器
node ./.signal.js
```
## signal.js 信令服务器
signal.js在官方库的基础上做了大量优化
- 文件只有5KB,压缩后只有3KB。
- 提供http文件服务,和WebSocket共享端口号。
- 面向前端和面向UE5的端口号绑定,通过WebSocket子协议区分。
- 通过环境变量统一传参,支持命令行或配置文件。
- 提供密码认证服务。
- 可以限制最大连接数。
- 支持多个UE5连接。
- 控制台实时打印UE5和前端的多对多映射关系。
- 对WebSocket连接做节流过滤,提高稳定性。
- 支持UE5和前端一一映射。
- 前端连入时,可以自动启动UE5进程。
- 多个UE5连入时,负载均衡。
- 支持stun及turn公网穿透,在公网间互连。
- 控制台可输入调试代码,并打印计算结果。
- 定时发送心跳连接保活。
- 前端的端口号与ID绑定。
### .signal.js 环境变量
| 环境变量 | 类型 | 默认值 | 功能 |
| -------- | ---------- | --------- | ------------------------------ |
| PORT | 正整数 | 88 | WebSocket/HTTP 全局统一端口号 |
| UE5_* | 命令行列表 | [] | UE5自启动脚本池 |
| one2one | 布尔 | false | 限制UE5和前端一一映射 |
| token | 字符串 | '' | WebSocket 密码认证 |
| limit | 正整数 | +Infinity | 限制前端最大连接数 |
| throttle | 布尔 | false | WebSocket 节流,避免频繁的重连 |
### 负载均衡与UE5自启动
`signal.js` 既支持多个前端连接,也支持多个UE5连接,此时前端和UE5的多对多映射关系是均衡负载的:前端会被引向最空闲的UE5进程。若想要限制一一映射关系,开启`one2one` 环境变量。最好提供 `UE5_*` 自启动命令行,更多实例参考 `.signal.js`。流程图如下:
```mermaid
flowchart TD;
subgraph
player([前端连入]);
manual([手动启动])
end
subgraph
finish([结束]);
match([匹配]);
end
subgraph
claim[寻找空闲前端];
start --UE5 连入--> claim;
idle --有--> match;
start --启动失败--> finish;
map121 --关--> min ---> match;
map121[一一映射 ?];
start(((启动 UE5)));
idle[寻找空闲进程];
min[寻找最小负载];
idle --无--> start;
player -- 有 UE5 进程 --> map121;
map121 --开--> idle;
player -- 无 UE5 进程 --> start;
claim --成功--> match;
claim --404--> finish;
manual --命令行--> start;
end
```
## 虚幻引擎
启动插件,并在编辑器中测试:
```s
Plugins > Built-In > Graphics > Pixel Streaming > Enabled
Editor Preferences > Level Editor > Play > Additional Launch Parameters
start path/to/UE5.exe -{key}={value}
```
常用的启动选项:
```s
-PixelStreamingURL="ws://localhost:88"
-RenderOffScreen
-Unattended
-GraphicsAdapter=0
-ForceRes
-Windowed
-ResX=1280
-ResY=720
-AudioMixer
-AllowPixelStreamingCommands
-PixelStreamingEncoderRateControl=VBR
```
## peer-stream.js 前端开发包
- 文件18KB,压缩后12KB。
- 基于 Web Components API 组件化video标签。
- 断线自动重连。
- DOM生命周期绑定:挂载自动连接,卸载自动断开。
- 支持stun公网穿透。
- 全局挂载一份引用方便调试:window.ps。
- 支持5种键盘/鼠标/触屏输入模式。
- 支持3333端口重定向。
- 支持视频自动播放。
- video标签的id即信令服务器地址,默认指向网页的域名。
- 支持异步请求。(不稳定)
### 引入
纯HTML写法:
```html
```
或者使用JavaScript:
```html
```
### 字符串消息收发
发送消息:
```js
// 若传入对象,会被JSON化
ps.emitMessage(msg: string | object);
```
接收消息:
```js
ps.addEventListener("message", e => {
// JSON.parse(e.detail)
});
```
异步请求:
```js
response = await ps.emitMessage(request);
// 返回不稳定
```
## IOS端Safari兼容
由于IOS端Safari不支持自定义内置元素(customized built-in element),需要在peer-stream.js之前引入兼容包:https://github.com/ungap/custom-elements 。除此之外,IOS微信内置浏览器(小程序)禁止video自动播放,必须由用户行为触发调用ps.play()来播放视频流。