下载 App

数据持久化

06/285 浏览综合
这两个问题很可能是因果关系
投资数据没持久化
    ↓
刷新重进 → Store 加载出来的数据是空的/旧的
    ↓
PostWallNoteToServer() 计算的 profitCents = 0 或上次的旧值
    ↓
wall_profit 在 serverCloud 中始终是 0 或空
    ↓
GetRankList("wall_profit") 返回的要么是 0 要么干脆没有记录
    ↓
便签墙上显示 "+0元" 或者根本没有便签
更严重的情况:如果连 wall_profitSetInt 都没成功写入 serverCloud,那 GetRankList 查询结果为空 → 便签墙完全没有数据可显示。
horizontal linehorizontal line

验证链路

让我追踪完整的数据持久化链路:
环节时机是否可靠
用户添加交易点击"保存"Store 内存修改
MarkDirty保存后标记应该有
SyncToCloud只在 Stop() 中 WASM 刷新不触发
serverCloud 写入UserDataProxy → 服务端如果 Sync 没调用就没机会写
重新加载刷新后 LoadFromCloud读到的是旧数据(因为没写入过)
PostWallNoteToServer登录后用 Store 数据计算基于旧/空数据计算 → 便签错误
核心断裂点SyncToCloud 几乎不被调用(只有 Stop),所以数据永远留在内存里,刷新就丢。
horizontal linehorizontal line

所以根因是同一个

数据不持久化 → 便签墙无数据
不是两个独立 bug,是一个 bug 的两个表现
  1. 表现 A:刷新后持仓/交易记录消失
  2. 表现 B:便签墙空白(因为 wall_profit 从没被正确写入)
horizontal linehorizontal line

修复方向(一个修复解决两个问题)

在 HandleUpdate 中加定时自动保存
lua复制
lua
local autoSaveTimer = 0 local AUTO_SAVE_INTERVAL = 15 -- 每15秒 -- HandleUpdate 中: if isLoggedIn and Store.IsDirty() then autoSaveTimer = autoSaveTimer + dt if autoSaveTimer >= AUTO_SAVE_INTERVAL then Store.SyncToCloud() autoSaveTimer = 0 end end
这样:
  • 用户修改数据 → 15秒内自动同步到 serverCloud
  • 刷新重进 → LoadFromCloud 读到最新数据
  • PostWallNoteToServer 用正确的 profit 计算 → 便签墙正确
要现在修复吗?
06-28 18:04
[图片:暂不支持黏贴,请手动导入]
嗒啦啦忙完啦,接下来想做什么?
消耗53积分|剩余1501通用积分
评价一下嗒啦啦的工作
嗒啦啦陷入沉思中...
好的发现。既然数据持久化没问题(刷新后还在),那便签不显示是独立的问题
让我重新分析便签不显示的原因:
horizontal linehorizontal line

排除持久化问题后,便签不显示的可能原因

原因 1:时序问题(最可能)

登录页渲染(立即)→ 便签区域为空
    ↓(等待 1~10 秒)
服务器连接成功 → ServerReady
    ↓
WallClient 发送 CLIENT_READY
    ↓
服务器返回 WALL_SYNC_ALL(便签数据)
    ↓
Login.RefreshWallWithData(notes) → 更新 UI
如果用户在服务器返回数据之前就点了"进入系统",便签渲染的回调就没机会触发了。
horizontal linehorizontal line

原因 2:wall_profit 从未被写入 serverCloud

在多人模式下,PostWallNoteToServer 只是把便签发给了 WallServer 的共享墙内存(uid=0 公共池)。
serverCloud:SetInt(uid, "wall_profit", profitCents) 这一步可能从未执行
原来设计是用 clientCloud:SetInt("wall_profit", profitCents)(排行榜写入),但多人模式 clientCloud 为 nil,所以:
操作standalone 模式multiplayer 模式
写 wall_profit 到排行榜 clientCloud:SetInt 没有对应代码
便签发到共享墙 无服务端 WallServer
排行榜查询能看到(从未写入 iscore)
这就解释了为什么管理员面板显示 “+0元” —— wall_profit 作为 iscore 从没被写入过。
horizontal linehorizontal line

原因 3:你说的昵称问题

你改了昵称为 “3H”,但便签系统显示的名字取决于:
  • PostWallNoteToServer(WallClient, Login.GetNickname()) 中的 nickname 参数
  • 如果 Login.GetNickname() 返回的是旧值(“coco” 或 “1118015608”),便签上不会显示 “3H”
但这不会导致便签不显示,只会导致显示错误的名字。
horizontal linehorizontal line

真正的 Bug 是什么

最可能的组合:
  1. 服务器连接慢 → WALL_SYNC_ALL 返回时,可能已经过了登录页
  2. 共享墙为空 → 因为 PostWallNoteToServer 是在登录成功后才调用,第一次看登录页时服务器里还没有任何便签
  3. 刷新进入时:服务器如果重启了(persistent_world 不保证永久运行),内存中的便签会丢失,需要从 serverCloud 重新加载
循环死锁
登录页需要便签 → 便签在登录成功后才写入 → 只有下次进入才能看到
    ↓
但如果服务器重启了 → 内存清空 → 又需要从 serverCloud 加载
    ↓
如果 serverCloud 中 wall_profit/wall_msg 没写入 → 加载出来也是空
horizontal linehorizontal line

修复方向

  1. 服务端登录时写 wall_profit iscoreserverCloud:SetInt(uid, "wall_profit", profitCents) 在用户数据保存时同步写入
  2. WallServer 持久化 — 确保共享墙数据在服务器重启后能恢复
  3. 本地缓存便签 — 上次看到的便签数据保存本地,下次立即渲染(不等服务器)
  4. 昵称同步 — PostWallNoteToServer 使用用户实际设置的昵称
【求积分】
因为没有积分继续完善框架,目前测试连接进入游戏界面,可能需要如下操作:
1、先随意输入用户名,默认密码123点击“进入系统”
2、稍等一会儿,会读取到当前用户ID的用户名,默认密码123就可以进入了
3、进入游戏修改密码,下次默认密码就不是123了
如果大家都能帮忙来体验,可能这个便签墙上会有越来越多的便签,需要玩家来丰富便签墙截图
【求积分】 因为没有积分继续完善框架,目前测试连接进入游戏界面,可能需要如下操作: 1、先随意输入用户名,默认密码123点击“进入系统” 2、稍等一会儿,会读取到当前用户ID的用户名,默认密码123就可以进入了 3、进入游戏修改密码,下次默认密码就不是123了 如果大家都能帮忙来体验,可能这个便签墙上会有越来越多的便签,需要玩家来丰富便签墙
3 赞
7 回复
耦合性 V5
结论:主游戏业务耦合优化已经基本完成,可以收尾。 不是说项目里完全没有高入度/高出度模块,而是: 主要业务热点已经拆完 原 API 都保持兼容 每批拆分都通过了 LSP 每批拆分都通过了官方构建 每批局部依赖检查都没有循环 当前项目仍然构建成功 当前 Lua LSP errors = 0 当前验证状态 刚刚重新确认: Lua LSP errors = 0 官方构建成功 当前 Lua 文件数 = 4
官方
3 赞
耦合性 V2
目前耦合性已经从“偏高”降到了 中等偏低、可控。 简单评价: 大问题已经收口,剩下的是结构继续细分的问题。 当前不会再出现明显的全局入口乱写、页面直接抢 UI Root、Network 回调污染全局这类高风险耦合。但 State、App 启动层、投资数据页面仍有进一步拆分空间。 已明显改善的部分 1. 全局 UI Root 已收口 现在 UI.SetRoot 只剩一处: scripts/App/R
官方
4 赞
耦合性 V4
当前游戏耦合性评估 结论:低到中低耦合。 经过多轮拆分后,原来的高入度 Facade / shim 基本已经清空业务依赖,当前主要热点已经转为“细粒度状态模块”和“流程编排模块”,结构比最初健康很多。 1. 当前核心指标 Lua 文件数: 200 内部 require 边数: 615 外部 require 引用: 79 平均内部出度: 3.08 循环节点: 0 关键结论: 循环依赖: 0 这是最重
官方
4 赞
耦合性 V3
当前耦合性已经从“中低耦合”进一步改善到: 低到中低耦合;核心玩法聚合直连基本消除,剩余主要是状态 Facade 和数据 Store 的中心化耦合。 量化结果 只读扫描 scripts/: Lua 文件数:175 内部 require 边数:534 循环依赖数:0 关键聚合模块入度: Pages.纸上障碍 incoming = 0 Pages.怪物工坊.战斗机制 incoming = 0 Page
官方
4 赞
耦合 V1
已分析当前 scripts/ 用户代码,未修改文件。整体看,项目是一个 main.lua 主入口 + 投资页面模块 + 纸上谈兵插件模块 + 网络/数据代理模块 的结构,耦合点比较集中。 1. 主入口如何耦合其他模块 主入口是: scripts/main.lua 它分服务端和客户端两条启动路径。 服务端路径 main.lua 先判断服务端模式: scripts/main.lua:7:判断 IsSe
官方
4 赞
01:32
【号外:新游】《小韭成长记》截图
【号外:新游】《小韭成长记》
《小韭成长记》是一款“投资记录 + 游戏化成长”的复合型小游戏: 投资端:记录股票、资金流水、账户管理等投资行为,生成多维度分析(组合估值、融资成本、指数对比等)。 游戏特色:你可以给后面来踢馆的玩家制造麻烦! 游戏端:通过“纸上谈兵”将投资数据转化为游戏战力(核心、甲片、行动点等),支持造兵、闯关、建设安全屋,让投资成果可视化、趣味化。 股票操作:支持「买入/卖出/分红/融资借入/还款」,自
【申请积分】刚把架构搭建了一些,希望能申请一些积分把游戏跑通截图
【申请积分】刚把架构搭建了一些,希望能申请一些积分把游戏跑通
4 赞
3 回复