背包排序不是把数组排一下
背包是玩家每天都会用的系统。物品越来越多后,排序和筛选会直接影响体验。玩家想找最近获得的装备、可使用的材料、任务道具、即将过期的礼包、可分解的低品质物品。客户端如果只按 ID 或品质排序,玩家会觉得背包很乱。
背包排序的难点在于规则多、状态多、性能要求高。物品数据来自服务端,展示规则来自配置,玩家还有自己的排序偏好。排序逻辑如果散落在 UI 里,后续新增物品类型时会不断破坏旧体验。
flowchart TD
A[背包原始物品] --> B[物品展示模型]
C[排序规则配置] --> D[排序键生成器]
E[玩家筛选条件] --> F[过滤器]
B --> F
F --> D
D --> G[稳定排序]
G --> H[虚拟网格展示]
I[物品变化事件] --> B
先生成展示模型
背包原始物品通常包含 itemId、数量、绑定状态、过期时间、强化等级、来源、锁定状态等。UI 不应该直接拿这些字段拼规则。更好的做法是生成 ItemViewModel:物品类型、品质、可用性、是否新获得、是否即将过期、是否任务相关、是否可批量操作、排序键候选。
展示模型还可以处理配置缺失。比如某个 itemId 找不到图标,模型标记为异常并使用占位图,同时上报。UI 不需要在每个格子里判断配置是否为空。
新获得标记也应在模型层维护。玩家打开背包看过某个物品后,标记何时消失要有统一规则。否则排序里“最新”一会儿按获得时间,一会儿按红点状态,体验会摇摆。
排序规则要稳定
稳定排序很重要。两个物品排序键相同时,应保持原有顺序或使用固定兜底键。否则玩家每次打开背包,物品位置都微微变化,会很难建立空间记忆。
一套常见排序键是:置顶类别、可操作状态、品质、等级、获得时间、配置 ID、实例 ID。不同页签可以配置不同权重。装备页更看重战力和部位,材料页更看重用途和数量,消耗品页更看重是否可使用和过期时间。
不要把排序规则写死在代码里。至少把类别权重、品质权重、过期优先级、任务物品优先级放到配置里。客户端代码提供排序键能力,策划配置决定具体偏好。
筛选要能组合但不混乱
筛选条件包括类型、品质、部位、可使用、可分解、任务相关、绑定、过期、新获得。玩家希望组合使用,但移动端 UI 空间有限。可以用一级页签解决大类,用筛选面板解决细项,用搜索或快捷标签解决常用条件。
组合筛选要显示当前条件,否则玩家会忘记为什么某些物品不见了。筛选结果为空时,要提示“没有符合条件的物品”,并提供清除筛选按钮。不要让空背包看起来像数据丢失。
筛选逻辑应先过滤再排序。排序所有物品再过滤会浪费性能,尤其物品实例很多时。物品变化时也不必全量重算,如果只是某个物品数量变化,且不影响筛选和排序键,可以只刷新该格子。
批量操作需要独立选择集
分解、出售、使用礼包、合成材料都可能批量操作。批量选择不能直接依赖当前列表索引,因为筛选和排序变化会改变索引。选择集应按物品实例 ID 或堆叠 ID 维护。
进入批量模式后,排序和筛选最好锁定或提示会影响选择。玩家勾选了 10 件装备后切换筛选,如果选择仍保留,需要清楚显示“已选 10 件,其中 4 件不在当前筛选”。否则玩家提交时会很惊讶。
批量操作的风险物品要二次确认,比如高品质、已强化、已锁定、限时稀有。客户端可以在选择阶段阻止,也可以在提交前汇总提示。最终仍由服务端校验。
虚拟网格和滚动位置
背包物品多时必须使用虚拟网格。排序或筛选改变后,滚动位置怎么处理很影响体验。如果玩家只是使用了一个物品,最好保持当前位置;如果切换了大类筛选,可以回到顶部;如果新获得物品插到前面,可以显示轻提示而不是强行跳转。
虚拟网格的格子尺寸要固定,图标异步加载不能改变布局。品质框、数量、锁定标记、过期角标都应该占用稳定位置。背包是高频页面,细小跳动都会让玩家不舒服。
过期物品和任务物品要特殊处理
限时物品需要靠前提醒,但不能把整个背包都被过期排序打乱。可以在消耗品页把即将过期置顶,在全部页只加角标和红点。过期后物品可能由服务端删除,客户端要处理列表突然减少,并给出过期提示或日志。
任务物品通常不可出售、不可分解,也不一定能使用。它们应该有独立类别或标记,防止玩家在批量操作里误选。任务完成后,任务物品消失或转化也要刷新背包和任务界面。
小结
背包排序筛选的目标是让玩家快速找到可行动的物品,而不是展示一份数据库表。客户端用展示模型、稳定排序键、配置化规则、组合筛选和虚拟网格,把复杂物品集合变成可理解的空间。背包越大,这套规则越有价值。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
我会为背包排序写快照测试:给定一组物品和筛选条件,输出物品 ID 顺序。每次改规则都能看到哪些物品位置变化,这比靠人工打开背包翻页可靠得多,也能让策划评审排序规则。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。