This commit is contained in:
zzzisfunnyboy
2025-06-11 23:41:21 +08:00
parent 8e25cd8118
commit 6908ff73eb
5 changed files with 294 additions and 491 deletions

View File

@@ -4,21 +4,17 @@
"type": "split", "type": "split",
"children": [ "children": [
{ {
"id": "9490f88925707195", "id": "f8022c29023d2af6",
"type": "tabs", "type": "tabs",
"children": [ "children": [
{ {
"id": "4e6788fa2bacf67e", "id": "efa82152d99167ff",
"type": "leaf", "type": "leaf",
"state": { "state": {
"type": "markdown", "type": "empty",
"state": { "state": {},
"file": "AllInHole/编辑器.md",
"mode": "source",
"source": false
},
"icon": "lucide-file", "icon": "lucide-file",
"title": "编辑器" "title": "新标签页"
} }
} }
] ]
@@ -34,13 +30,26 @@
"id": "b892947aee3a10a9", "id": "b892947aee3a10a9",
"type": "tabs", "type": "tabs",
"children": [ "children": [
{
"id": "f2ac97a7addb8678",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "文件列表"
}
},
{ {
"id": "bd33cd6e5600118d", "id": "bd33cd6e5600118d",
"type": "leaf", "type": "leaf",
"state": { "state": {
"type": "search", "type": "search",
"state": { "state": {
"query": "", "query": "tag:#flashcards/政治/近代史",
"matchingCase": false, "matchingCase": false,
"explainSearch": false, "explainSearch": false,
"collapseAll": false, "collapseAll": false,
@@ -72,7 +81,7 @@
} }
}, },
{ {
"id": "bd553af56bfd19e2", "id": "4c191f6555b427bd",
"type": "leaf", "type": "leaf",
"state": { "state": {
"type": "file-explorer", "type": "file-explorer",
@@ -85,11 +94,11 @@
} }
} }
], ],
"currentTab": 3 "currentTab": 4
} }
], ],
"direction": "horizontal", "direction": "horizontal",
"width": 357.5 "width": 338.5
}, },
"right": { "right": {
"id": "d809b577c235ae94", "id": "d809b577c235ae94",
@@ -124,8 +133,8 @@
"state": { "state": {
"type": "calendar", "type": "calendar",
"state": {}, "state": {},
"icon": "lucide-file", "icon": "calendar-with-checkmark",
"title": "Plugin no longer active" "title": "Calendar"
} }
}, },
{ {
@@ -187,68 +196,108 @@
} }
], ],
"direction": "horizontal", "direction": "horizontal",
"width": 476.5, "width": 476.5
"collapsed": true
}, },
"left-ribbon": { "left-ribbon": {
"hiddenItems": { "hiddenItems": {
"switcher:打开快速切换": false,
"graph:查看关系图谱": false,
"canvas:新建白板": false,
"daily-notes:打开/创建今天的日记": false, "daily-notes:打开/创建今天的日记": false,
"templates:插入模板": false, "templates:插入模板": false,
"canvas:新建白板": false,
"switcher:打开快速切换": false,
"graph:查看关系图谱": false,
"command-palette:打开命令面板": false, "command-palette:打开命令面板": false,
"copilot:Open Copilot Chat": false "copilot:Open Copilot Chat": false
} }
}, },
"active": "4e6788fa2bacf67e", "floating": {
"id": "8ad6c7a89369c9f6",
"type": "floating",
"children": [
{
"id": "ea5faaa0d41b6909",
"type": "window",
"children": [
{
"id": "5ac5102bf53c6860",
"type": "tabs",
"children": [
{
"id": "fd65654aeee0713f",
"type": "leaf",
"state": {
"type": "empty",
"state": {},
"icon": "lucide-file",
"title": "新标签页"
}
}
]
}
],
"direction": "vertical",
"x": 2595,
"y": 19,
"width": 1024,
"height": 800,
"maximize": false,
"zoom": 0
}
]
},
"active": "4c191f6555b427bd",
"lastOpenFiles": [ "lastOpenFiles": [
"AllInHole/Temp.md", "面经/腾讯 网易 完美 字节 游戏客户端 游戏引擎2020暑期实习岗 综合笔 面经.md",
"AllInHole/编辑器.md", "面经",
"未命名.md", "资源/打包/导航.md",
"资源/打包",
"资源/资源导入.md",
"资源",
"网络同步.md", "网络同步.md",
"TODO.canvas", "编辑器/时间轴编辑器/Timeline TODO.canvas",
"Timeline TODO.canvas", "编辑器/图片/Pasted image 20221025121100.png",
"用户卡及游戏信息处理过程设计文档.md", "编辑器/时间轴编辑器",
"AllInHole", "编辑器/图片",
"外包项目/未命名.canvas", "编辑器/SerializedObject.md",
"外包项目/编辑器业务功能.md", "编辑器/SearchFilter UnityEditor筛选器.md",
"外包项目/编辑器UI.md", "编辑器",
"外包项目/编辑操作功能.md", "算法/TopK 问题.md",
"外包项目/s.md", "算法",
"外包项目/TODO.md", "渲染/软渲染/图片/毛泽东选集第一卷_共产党员网.html",
"外包项目/未命名看板.md", "渲染/软渲染/图片/毛泽东选集第一卷_共产党员网 1.html",
"外包项目",
"战斗/写代码的诗人/战斗系统:状态配置管理(技能配置管理).md",
"战斗/战斗系统 - 3C相关.md",
"战斗/游戏知识学习——【战斗系统】.md",
"战斗/独立游戏-万字解析游戏战斗系统开发.md",
"战斗/动作.md",
"战斗/写代码的诗人/战斗系统:技能实现架构.md",
"战斗/写代码的诗人/战斗系统:属性管理.md",
"战斗/写代码的诗人/战斗系统:什么是数据驱动?.md",
"战斗/写代码的诗人/战斗系统框架设计—战斗视角的GameObject.md",
"战斗/写代码的诗人/角色框架GameObject类型实现.md",
"AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第一个用法|查漏补缺/思路.md",
"AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第一个用法|查漏补缺/如何搞钱/小白金融知识/01_初识通货膨胀钱怎么就不值钱了.md",
"AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第二个用法|私人智囊团/我的侧写档案.md",
"战斗/写代码的诗人",
"TODO.md",
"性能优化/关于Unity加载优化你可能遇到这些问题 - 知乎.md",
"AI for Obsidian/第二个用法|私人智囊团/我的长文参考",
"AI for Obsidian/第二个用法|私人智囊团",
"AI for Obsidian/插件相关说明",
"AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第四个用法|成为对弈的棋手/正方观点/观点9.md.edtz",
"AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第四个用法|成为对弈的棋手/正方观点/观点8.md.edtz",
"AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第四个用法|成为对弈的棋手/正方观点/观点7.md.edtz",
"AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第四个用法|成为对弈的棋手/正方观点/观点6.md.edtz",
"渲染/GPU/Pasted image 20230413163234.png",
"Mesh/图片/Pasted image 20221021171104.png",
"渲染/软渲染/图片/Pasted image 20230613102109.png", "渲染/软渲染/图片/Pasted image 20230613102109.png",
"渲染/软渲染/图片/FAQ.md",
"渲染/软渲染/透视矫正.md",
"渲染/软渲染/还未实现.md",
"渲染/软渲染/课程.md",
"渲染/软渲染/视锥剔除.md",
"渲染/软渲染/视口剔除.md",
"渲染/软渲染/图片",
"渲染/软渲染/冯 高光.md",
"渲染/GPU/Pasted image 20230413163234.png",
"渲染/一些渲染效果/Unity可交互雪地渲染Part5-雪地闪光及SSS.md",
"渲染/一些渲染效果/Unity 技术美术Trick —— dither妙用.md",
"渲染/GPU/GPU渲染流程.md",
"操作系统/多级缓存队列.md",
"战斗/写代码的诗人/战斗系统框架设计—战斗视角的GameObject.md",
"战斗/输入框架/游戏输入框架的设计(基于Unity).md",
"战斗/写代码的诗人/战斗系统:状态配置管理(技能配置管理).md",
"战斗/写代码的诗人/战斗系统:技能实现架构.md",
"战斗/写代码的诗人/战斗系统:什么是数据驱动?.md",
"战斗/写代码的诗人/战斗系统:属性管理.md",
"战斗/独立游戏-万字解析游戏战斗系统开发.md",
"战斗/游戏知识学习——【战斗系统】.md",
"Mesh/图片/Pasted image 20221021171104.png",
"渲染/软渲染/图片/Pasted image 20250609171235.png",
"InBox/TODO.canvas",
"InBox/编辑器/时间轴编辑器/Timeline TODO.canvas",
"InBox/战斗/动作时间轴 随想.canvas",
"InBox/编辑器/图片/Pasted image 20221025121100.png",
"InBox/渲染/GPU/Pasted image 20230413163234.png",
"InBox/Mesh/图片/Pasted image 20221021171104.png",
"InBox/渲染/软渲染/图片/Pasted image 20230613102109.png",
"未命名 1.canvas", "未命名 1.canvas",
"并行计算/GPU.canvas", "并行计算/GPU.canvas",
"并行计算/CPU.canvas", "并行计算/CPU.canvas",
"未命名 2.canvas", "未命名 2.canvas"
"编辑器/图片/Pasted image 20221025121100.png"
] ]
} }

View File

@@ -1,10 +0,0 @@
{
"nodes":[
{"id":"c2a9a261abbf026a","type":"text","text":"# rogulite\n\n分好武器、招式\n->构建->抽卡\n动画表现\n表演->大招、出场\n->timeline\n","x":-400,"y":-637,"width":250,"height":234,"color":"2"},
{"id":"fd504a901787835c","type":"text","text":"# 宠物\n\n","x":-1080,"y":-586,"width":250,"height":367,"color":"4"},
{"id":"09d19f9a3b86463f","x":-760,"y":-880,"width":250,"height":326,"type":"text","text":"# 优化项\n\n\n地图地板图片导入 自动修改图片大小\n\n将RoomConfig改到RoomBase里\n"}
],
"edges":[
{"id":"abda214f71bdc137","fromNode":"09d19f9a3b86463f","fromSide":"bottom","toNode":"fd504a901787835c","toSide":"right"}
]
}

View File

@@ -1,13 +0,0 @@
[^1]
[^1]: 地形系统
FallItem
ItemDefine
[^2]
[^2]: 材质球
standand加上mask模板idmap就是mask图

View File

@@ -0,0 +1,182 @@
https://zhuanlan.zhihu.com/p/424070778
### 游戏输入系统设计总结
#### **核心设计思路**
1. **输入抽象分层**
- **基础输入层**:将输入抽象为按钮(`IButtonInput`)和轴值(`IAxisInput`)两类
- **复合输入层**:支持多个按键绑定到同一行为(`CompoundButtonInput`/`CompoundAxisInput`
- **行为映射层**:将输入状态转化为游戏行为(`InputButtonProcessor`
2. **关键接口设计**
csharp
复制
下载
// 按钮输入
public interface IButtonInput {
bool GetButton(); // 获取按钮状态
}
// 轴值输入
public interface IAxisInput {
float AxisValue(); // 获取轴值(-1~1)
}
#### **核心组件实现**
1. **基础输入实现**
- `KeyCodeButtonInput`封装Unity键值检测
- `ButtonAxisInput`:将按钮转为轴值(正/负方向)
2. **复合输入容器**
csharp
复制
下载
// 复合按钮OR逻辑
public class CompoundButtonInput : IButtonInput {
public bool GetButton() {
foreach(var btn in Buttons)
if(btn.GetButton()) return true;
return false;
}
}
// 复合轴值(取极值叠加)
public class CompoundAxisInput : IAxisInput {
public float AxisValue() {
float max=0, min=0;
foreach(var axis in Axis) {
float val = axis.AxisValue();
if(val<0) min = Mathf.Min(min, val);
else max = Mathf.Max(max, val);
}
return max + min;
}
}
3. **行为状态机**
csharp
复制
下载
public class InputButtonProcessor {
// 状态记录
public bool WasPressed; // 上一帧状态
public bool IsPressed; // 当前帧状态
// 状态查询属性
public bool OnPressed => IsPressed && !WasPressed; // 刚按下
public bool OnReleased => !IsPressed && WasPressed; // 刚释放
// 状态更新
public void Update(bool isPressed) {
WasPressed = IsPressed;
IsPressed = isPressed;
}
}
#### **系统工作流程**
1. **初始化绑定**PlayerInput
csharp
复制
下载
public void AddKeyboardControls() {
// 水平轴A/D/左右箭头
HorizontalDigiPad.Add(new ButtonAxisInput(
new KeyCodeButtonInput(KeyCode.A),
ButtonAxisInput.Mode.Negative
));
// 跳跃空格/Z/Y
Jump.Add(new KeyCodeButtonInput(KeyCode.Space));
}
2. **状态更新**每帧
csharp
复制
下载
void RefreshControls() {
// 1. 更新轴值输入
Input.HorizontalValue = HorizontalDigiPad.AxisValue();
// 2. 更新按钮状态机
for(int i=0; i<buttonInputs.Count; i++) {
bool pressed = buttonInputs[i].GetButton();
buttonProcessors[i].Update(pressed);
}
}
3. **游戏逻辑使用**
csharp
复制
下载
void Update() {
if(Input.Jump.OnPressed) {
// 处理跳跃触发
}
if(Input.Right.Pressed) {
// 处理持续右移
}
}
#### **设计优势**
1. **多键位绑定**一个行为支持多个触发键如跳跃可用空格/Z/Y
2. **输入抽象**统一处理键盘/鼠标/手柄等输入设备
3. **状态封装**提供精细的输入状态检测按下/持续/释放
4. **动态配置**运行时切换控制方案`RefreshControlScheme()`
5. **行为解耦**游戏逻辑只依赖抽象行为而非具体按键
#### **扩展建议**
1. **输入重映射**添加键位配置保存/加载功能
2. **输入缓冲**实现指令缓冲窗口提升操作手感
3. **设备扩展**集成手柄输入`GamepadButtonInput`
4. **组合键**支持Ctrl+Jump等组合键检测
5. **输入事件**改用事件驱动减少每帧状态查询
> 该设计通过分层抽象解决了多键位绑定问题,核心价值在于将**物理输入**到**游戏行为**的映射关系标准化,为复杂输入需求提供了可扩展框架。

View File

@@ -1,405 +0,0 @@
# 用户卡信息处理系统设计文档
## 1. 系统概述
该系统主要由控制器插件、业务插件和游戏端三部分组成通过TCP通信实现用户卡信息处理和游戏数据收集。
## 2. 系统架构
### 字符流程图
```
+----------------+ +----------------+ +----------------+
| 控制器插件 | | 业务插件 | | 游戏端 |
| | | | | |
| - 扫描用户卡 | | - 处理用户信息 | | - 接收用户信息 |
| - 读取卡信息 |--->| - 存储本地数据 |<-->| - 发送游戏信息 |
| - 通知业务插件 | | - 网络请求处理 | | - 本地备份处理 |
+----------------+ +----------------+ +----------------+
| ^
v |
+-----------------+
| 服务器 |
| - 用户资料数据库 |
| - 游戏数据处理 |
+-----------------+
```
### mermaid流程图
```mermaid
flowchart LR
A[控制器插件\n- 扫描用户卡\n- 读取卡信息\n- 通知业务插件] --> B[业务插件\n- 处理用户信息\n- 存储本地数据\n- 网络请求处理]
B <--> C[游戏端\n- 接收用户信息\n- 发送游戏信息\n- 本地备份处理]
B <--> D[服务器\n- 用户资料数据库\n- 游戏数据处理]
```
## 3. 系统详细流程
### 3.1 用户卡信息处理流程
#### 流程说明
用户卡信息处理流程描述了从控制器插件扫描用户卡到业务插件向游戏端发送用户信息的完整过程。当控制器插件检测到用户卡扫描信息后会通知业务插件。业务插件根据网络状态决定从服务器请求用户资料或从本地数据库读取用户信息。如果网络可用业务插件会请求最新的用户信息并存储到本地如果网络不可用或请求失败则从本地SQLite数据库读取历史记录若本地无记录则构造默认用户信息。最终业务插件将完整的用户信息通过TCP12101端口发送给游戏端。
#### 字符流程图
```
+----------------+ +----------------+ +----------------+ +----------------+
| 控制器插件 | | 业务插件 | | 网络/本地数据库 | | 游戏端 |
+-------+--------+ +-------+--------+ +-------+--------+ +-------+--------+
| | | |
| 扫描到用户卡 | | |
+--------------------->+ | |
| | | |
| | 检查网络状态 | |
| +--------------------->+ |
| | | |
| | 有网络: 请求用户信息 | |
| +--------------------->+ |
| | | |
| | 返回用户信息 | |
| +<---------------------+ |
| | | |
| | 无网络/请求失败: | |
| | 读取本地数据 | |
| +--------------------->+ |
| | | |
| | 返回本地数据 | |
| +<---------------------+ |
| | | |
| | 构造用户信息 | |
| +-------------------------------------------------+
| | | | |
| | TCP(12101)发送用户信息| | |
| +--------------------->+--------------------->+ |
| | | | |
| | | | |
| | 本地存储用户信息 <---+
| | | |
+-------+--------+ +-------+--------+ +-------+--------+ +-------+--------+
```
#### mermaid流程图
```mermaid
sequenceDiagram
participant 控制器插件
participant 业务插件
participant 网络/本地数据库
participant 游戏端
控制器插件->>业务插件: 扫描到用户卡
业务插件->>网络/本地数据库: 检查网络状态
alt 有网络
业务插件->>网络/本地数据库: 请求用户信息
网络/本地数据库-->>业务插件: 返回用户信息
else 无网络/请求失败
业务插件->>网络/本地数据库: 读取本地数据
网络/本地数据库-->>业务插件: 返回本地数据
end
业务插件->>业务插件: 构造用户信息
业务插件->>游戏端: TCP(12101)发送用户信息
游戏端->>游戏端: 本地存储用户信息
```
### 3.2 游戏信息收集流程
#### 流程说明
游戏信息收集流程描述了业务插件如何通过TCP监听接收游戏端发送的消息并进行处理的过程。业务插件监听TCP12103端口以接收来自游戏端的信息。根据接收到的消息类型由标识头区分业务插件会进行不同的处理如果是游戏结束消息标识头为"game-over"业务插件会更新对应Player的状态之后接收到该Player的游戏信息将不再与用户卡关联如果是游戏业务信息业务插件会尝试通过网络将数据发送到服务器若网络不可用或发送失败则将数据存储到本地SQLite数据库中以便稍后同步。
#### 字符流程图
```
+----------------+ +----------------+ +----------------+
| 游戏端 | | 业务插件 | | 服务器/本地存储 |
+-------+--------+ +-------+--------+ +-------+--------+
| | |
| TCP(12103)发送游戏信息| |
+--------------------->+ |
| | |
| | 检查消息类型 |
| +-----------------+ |
| | | |
| | 游戏结束消息 | |
| |-----------------+ |
| | 更新Player状态 | |
| +-----------------+ |
| | | |
| | 游戏业务信息 | |
| |-----------------+ |
| | 检查网络状态 | |
| +--------------------->+
| | |
| | 有网络: 发送到服务器 |
| +--------------------->+
| | |
| | 响应结果 |
| +<---------------------+
| | |
| | 无网络/发送失败: |
| | 存储到本地SQLite |
| +--------------------->+
| | |
+-------+--------+ +-------+--------+ +-------+--------+
```
#### mermaid流程图
```mermaid
sequenceDiagram
participant 游戏端
participant 业务插件
participant 服务器/本地存储
游戏端->>业务插件: TCP(12103)发送游戏信息
alt 游戏结束消息
业务插件->>业务插件: 更新Player状态
else 游戏业务信息
业务插件->>业务插件: 检查网络状态
alt 有网络
业务插件->>服务器/本地存储: 发送到服务器
服务器/本地存储-->>业务插件: 响应结果
else 无网络/发送失败
业务插件->>服务器/本地存储: 存储到本地SQLite
end
end
```
### 3.3 游戏信息发送失败处理流程
#### 流程说明
游戏信息发送失败处理流程描述了当游戏端无法直接将游戏信息发送给业务插件时的备份处理机制。当游戏端向业务插件发送信息超时或无响应时,游戏端会将这些数据存储到特定目录中的文件系统,采用一条数据一个文件的方式。业务插件会定期检查该目录,读取这些文件中的数据,处理(如重新发送到服务器或记录到本地数据库)后再删除这些文件。这种机制确保了即使在业务插件暂时不可用的情况下,游戏数据也不会丢失,提高了系统的可靠性和容错性。
#### 字符流程图
```
+----------------+ +----------------+ +----------------+
| 游戏端 | | 文件系统 | | 业务插件 |
+-------+--------+ +-------+--------+ +-------+--------+
| | |
| 信息发送超时/无响应 | |
+-----------------+ | |
| | | |
| 创建数据文件 | | |
|----------------+ | |
| 将数据写入文件 | | |
+--------------------->+ |
| | |
| | 业务插件定期检查目录 |
| +<---------------------+
| | |
| | 读取数据文件 |
| +--------------------->+
| | |
| | 处理数据(重发/记录) |
| +<---------------------+
| | |
| | 处理完成后删除文件 |
| +<---------------------+
| | |
+-------+--------+ +-------+--------+ +-------+--------+
```
#### mermaid流程图
```mermaid
sequenceDiagram
participant 游戏端
participant 文件系统
participant 业务插件
游戏端->>游戏端: 信息发送超时/无响应
游戏端->>游戏端: 创建数据文件
游戏端->>文件系统: 将数据写入文件
业务插件->>文件系统: 定期检查目录
文件系统->>业务插件: 读取数据文件
业务插件->>业务插件: 处理数据(重发/记录)
业务插件->>文件系统: 处理完成后删除文件
```
## 4. 信息结构
### 4.1 发送给游戏的用户信息JSON结构
```json
{
"result": true, // 操作结果
"errMsg": "", // 错误信息
"statusCode": 0, // 状态码0=成功1=未绑定2=无网)
"tag": "user-info", // 标识标签,区分不同类型的信息
"data": {
"playerIndex": 1, // player索引
"cardId": "123456", // 卡ID
"cardSn": "789012", // 卡序列号
"userName": "张三", // 用户名称
"userAvatar": "http://example.com/avatar.jpg" // 用户头像
}
}
```
#### 4.1.1 请求服务器查询玩家资料
请求写入排行榜
```json
{
"tag": "update-user-info", // 标识标签,区分不同类型的信息
"data": {
"cardId": "123456", // 卡ID
"score": 10000 //积分
}
}
```
回复
```json
{
"result": true, // 操作结果
"errMsg": "", // 错误信息
"statusCode": 0, // 状态码0=成功1=未绑定2=无网)
"tag": "", // 标识标签,区分不同类型的信息
"data":{}
}
```
请求查询玩家信息
```json
{
"tag": "select-user-info", // 标识标签,区分不同类型的信息
"data": {
"cardId": "123456", // 卡ID
}
}
```
回复
```json
{
"result": true, // 操作结果
"errMsg": "", // 错误信息
"statusCode": 0, // 状态码0=成功1=未绑定2=无网)
"tag": "user-info", // 标识标签,区分不同类型的信息
"data": {
"playerIndex": 1, // player索引
"cardId": "123456", // 卡ID
"cardSn": "789012", // 卡序列号
"userName": "张三", // 用户名称
"userAvatar": "http://example.com/avatar.jpg" // 用户头像
...
}
}
```
### 4.2 游戏结束消息JSON结构
```json
{
"result": true, // 操作结果
"errMsg": "", // 错误信息
"statusCode": 0, // 状态码0=成功非0=失败)
"tag": "game-over", // 标识标签
"data": {
"playerIndex": 1, // player索引
"cardId": "123456", // 卡ID
"timestamp": 1634567890 // 时间戳
}
}
```
### 4.3 游戏业务信息JSON结构
```json
{
"result": true, // 操作结果
"errMsg": "", // 错误信息
"statusCode": 0, // 状态码0=成功非0=失败)
"tag": "game-data", // 标识标签
"data": {
"playerIndex": 1, // player索引
"cardId": "123456", // 卡ID
"gameData": { // 游戏数据(根据具体业务定义)
// 具体业务数据
},
"timestamp": 1634567890 // 时间戳
}
}
```
## 5. 通信端口说明
- **12101端口**:游戏端监听,业务端发送消息
- **12103端口**:业务端监听,游戏端发送消息
## 6. 数据持久化
### 6.1 SQLite数据结构
#### 用户信息表
```sql
CREATE TABLE user_info (
id INTEGER PRIMARY KEY AUTOINCREMENT,
card_id TEXT NOT NULL,
card_sn TEXT NOT NULL,
user_name TEXT,
user_avatar TEXT,
last_updated INTEGER,
UNIQUE(card_id, card_sn)
);
```
#### 游戏数据表
```sql
CREATE TABLE game_data (
id INTEGER PRIMARY KEY AUTOINCREMENT,
card_id TEXT NOT NULL,
player_index INTEGER NOT NULL,
data_type TEXT NOT NULL,
data_content TEXT NOT NULL,
timestamp INTEGER NOT NULL,
is_synced INTEGER DEFAULT 0
);
```
### 6.2 文件存储结构
游戏数据文件命名格式:`game_data_{timestamp}_{playerIndex}_{cardId}.json`
## 7. 注意事项
### 7.1 数据安全与隐私
- 用户卡信息应进行加密存储
- 本地数据应设置访问权限限制
- 网络传输过程采用HTTPS或加密通道
### 7.2 数据同步机制
- 本地数据与服务器数据定期同步机制
- 冲突解决策略(以服务器数据为准或采用时间戳)
- 同步频率设置(定时/事件触发)
### 7.3 错误处理与恢复
- 网络恢复后的数据自动上传机制
- 重试策略(指数退避算法)
- 错误日志记录与报警机制
- 异常情况下的回滚机制
### 7.4 性能优化
- SQLite查询优化
- 批量数据处理
- 队列机制避免并发问题
- 异步处理大量数据
### 7.5 本地存储管理
- 定期清理过期数据
- 存储空间监控
- 数据备份机制
- 存储空间不足时的处理策略
### 7.6 监控与日志
- 关键操作日志记录
- 系统状态监控
- 异常情况报警机制
## 8. 系统扩展性考虑
- 支持多种类型用户卡的可扩展接口
- 业务消息类型的可扩展设计
- 版本兼容性处理机制
- 插件化架构设计
- 配置化管理