下载 App

tap制造的两套独立的资源管理体系

精华03/25136 浏览开发日记 包含 AI 合成内容
资源管理体系说明
版本: v1.0.0
日期: 2026-03-25
适用范围: 全项目
1. 概述
  本项目存在两套独立的资源管理体系,分别服务于不同的渲染层,两者不可混用、不可互相替代。第一套为引擎资源管线,服务3D场景层,管理Texture2D、Sound、Model等资源,由ResourceController管控;第二套为NanoVG图片句柄,服务2D UI层,管理NanoVG整数句柄,即nvgCreateImage返回值,由各UI模块自行管理。
2. 两套资源体系对比
引擎ResourceCache底层API为cache:GetResource(type, path),句柄类型是引擎C++托管的Resource对象,释放方式为cache:ReleaseResource(type, path),依赖全局cache,引擎启动即可使用,生命周期跟随引擎ResourceCache可延迟释放,引擎内部管理引用计数,支持cache:GetResourceAsync()异步加载,有ResourceController提供的自动淘汰机制,适用于3D场景相关模块,比如SceneView、WorldView等。NanoVG图片底层API为nvgCreateImage(vg, path, flags),句柄类型是int整数句柄,释放方式为nvgDeleteImage(vg, handle),依赖NanoVG实例的vg上下文,必须在nvgDelete(vg)之前释放,无引用计数需手动管理,仅支持同步加载,无自动淘汰机制,适用于NanoVG UI相关模块,比如GameUI、ShopPanel等。
3. ResourceController模块详解
3.1 基本信息文件路径为scripts/module/resource/ResourceController.lua,核心职责是在引擎ResourceCache之上,提供注册表驱动的资源加载、缓存、分组、优先级淘汰、占位降级功能,集成于GameController.lua即3D场景主控制器,初始化条件为config.resource.enabled ~= false时,由GameController自动初始化。
3.2 架构定位ResourceController并非直接加载资源的替代品,而是引擎cache之上的管理层,核心提供四大能力:一是注册表,所有资源先注册key、path、类型、优先级,再按key加载;二是分组加载,按场景/关卡分组批量异步加载,支持进度回调;三是优先级淘汰,内存超阈值时按优先级自动释放资源;四是降级占位,资源加载失败时,自动使用注册好的占位资源。其架构调用逻辑为GameController(3D场景主控)调用ResourceController.init(config)完成启动初始化,调用ResourceController.update(dt)实现每帧更新与定时内存检测,调用ResourceController.shutdown()实现停止时资源释放。
3.3 常量定义缓存优先级分为三级,PRIORITY_PERMANENT值为3,代表永不自动淘汰,适用于UI图标、常用BGM;PRIORITY_NORMAL值为2,代表内存紧张时可淘汰,适用于关卡资源;PRIORITY_TEMPORARY值为1,代表优先淘汰,适用于一次性语音、临时特效。资源分类分为四类,CATEGORY_IMAGE为图片/纹理,CATEGORY_AUDIO为音频,CATEGORY_MODEL为3D模型,CATEGORY_SCENE为场景。
3.4 完整API参考生命周期相关API:init(config?)用于初始化系统,config可配置内存警告阈值、检测间隔、自动淘汰开关;isEnabled()用于判断是否已初始化;update(dt)用于每帧调用,定时检测内存并触发淘汰;shutdown()用于释放所有注册资源,清空注册表并关闭系统。注册管理相关API:registerResource(key, opts)用于注册单个资源;registerBatch(entries)用于批量注册资源;registerGroup(group_name, keys)用于定义资源分组;registerFallback(res_type, path)用于注册某类型的占位降级资源。加载获取相关API:load(key)用于同步加载资源,失败则自动降级到占位资源;loadAsync(key, callback)用于异步加载资源;loadGroup(group, onProgress?, onComplete?)用于异步加载整个资源分组,支持进度与完成回调;getResource(key)用于获取已缓存资源,不触发加载;isLoaded(key)用于检查资源是否加载完成。释放相关API:release(key)用于释放单个资源;releaseGroup(group_name)用于释放整个分组资源;releaseByPriority(max_priority)用于批量释放指定优先级及以下的资源,返回释放数量。内存监控相关API:checkMemory()用于手动触发内存检测;getMemoryStats()用于返回内存统计数据,包含总内存、警告阈值、注册数量、加载数量等。
3.5 内存淘汰机制当cache:GetTotalMemoryUse()超过默认256MB的内存警告阈值时,自动执行三阶段淘汰:第一阶段释放所有PRIORITY_TEMPORARY优先级资源,若内存仍超标,第二阶段释放所有PRIORITY_NORMAL优先级资源,若依旧超标,第三阶段输出严重警告日志,PRIORITY_PERMANENT永久资源不会被自动淘汰。内存检测频率默认5秒一次,在update(dt)中累计计时触发。
3.6 占位降级机制资源加载失败时,自动切换为对应类型的占位资源,降级过程对用户透明,仅输出WARN级别的降级日志,不影响游戏正常运行。
3.7 内部数据结构注册表条目存储资源key、路径、类型、分类、优先级、加载状态等信息;分组表将多个资源key归入同一分组,方便批量管理;占位映射表存储不同资源类型对应的占位资源路径。
3.8 当前集成状态GameController.init()时调用ResourceController初始化,GameController.update(dt)时每帧调用其更新方法,GameController.stop()时调用其关闭方法。当前ResourceController仅服务3D场景层模块,NanoVG游戏逻辑模块与NanoVG UI模块均未使用该模块。
4. NanoVG图片管理现状
4.1 管理模式各NanoVG UI模块自行管理图片句柄,无统一管理层,分为两种管理模式。模式一为表缓存,适用于加载多张不确定图片的模块,通过表格缓存图片句柄,使用模块包括TaskPanel、ShopPanel、SignPanel、GachaPanel、InventoryPanel、GetPopup;模式二为单变量,适用于仅加载1-2张固定图片的模块,通过单个变量存储句柄,使用模块包括GameUI、main.lua。
4.2 持有NanoVG图片句柄的模块清单main.lua管理2张背景图,采用单变量模式;GameUI管理1张设置图标,采用单变量模式;ShopPanel、TaskPanel、SignPanel、GachaPanel、InventoryPanel、GetPopup均管理动态数量的图标,采用表缓存模式。
4.3 生命周期调用链模块停止或游戏重启时,统一调用各UI模块的cleanup(vg_)方法释放图片句柄,包括ShopPanel、TaskPanel、SignPanel等所有UI模块,main.lua自行释放背景图句柄,最后执行nvgDelete(vg_)销毁NanoVG上下文,确保图片句柄在上下文销毁前全部释放。
5. 复用性分析与结论
5.1 核心问题:ResourceController能否管理NanoVG图片?答案是不能,核心原因有四点。一是API层不同,ResourceController封装引擎资源操作API,NanoVG图片使用独立的创建与释放API,两者无法互通;二是上下文依赖,NanoVG图片操作需要vg上下文,ResourceController不持有也不应持有该上下文,其属于3D场景层模块;三是释放时序,NanoVG图片必须在上下文销毁前释放,ResourceController的关闭时序无法保证与之匹配;四是句柄类型不同,ResourceController管理Resource对象,NanoVG是整数句柄,无法纳入同一体系。
5.2 当前方案是否需要优化?当前阶段不需要,理由有四点:一是模块图片规模可控,总量不超过50个,手动管理可行;二是无跨模块共享图片,各模块图片路径互不重复,无重复加载问题;三是cleanup模式统一,所有模块遵循统一的释放约定,由main.lua统一调用;四是引入统一缓存会增加额外复杂度,需要额外做引用计数防止冲突。
6. 未来演进建议当出现以下场景时,需考虑提取统一的NvgImageCache模块:一是出现跨模块共享同一张图片的情况,需要引用计数与去重机制;二是NanoVG图片总量超过50张,需要LRU淘汰策略;三是需要统一的图片加载失败占位降级能力;四是大量图片同步加载导致卡顿,需要分帧或预加载调度。
变更记录
版本v1.0.0,
日期2026-03-25,
初版内容包含ResourceController模块详解、NanoVG图片管理现状、复用性分析与未来演进建议
猜你想搜
taptap 制造资源管理体系
别再烧积分了!从每次 2000 到每次 50 的血泪经验截图
别再烧积分了!从每次 2000 到每次 50 的血泪经验
适用场景:所有在用 TapTap Code 开发游戏的小白 难度:★☆☆☆☆ 背景最近群里总有人"炫耀"一次操作花了几千积分,说实话这不是值得高兴的事——这是在告诉所有人你的开发方式有根本性问题。我也走过这条弯路,所以来说说怎么改。 积分消耗的本质是什么积分 = AI 处理的 token 数量 = 你发给 AI 的内容 + AI 回给你的内容所以烧积分的本质只有两种: 你让 AI 做了大量无效/重
精华
82 赞
23 回复
如何提升你游戏中的UI美术水平截图
如何提升你游戏中的UI美术水平
一、请为你的游戏挑选一款合适的字体 很多开发者没有注意到其实UI界面中最重要的元素是字体,一款合适的字体能给整个游戏的界面感官带来蜕变。 请看案例 那么如何挑选适合自己的字体呢? 我总结出了一些小经验可供参考: 黑体:通用 宋体:古风、武侠、修仙 楷体:古风、武侠、修仙 圆体:卡通、动漫、Q版 科技:科幻、未来、电子 顺手分享一个免费可商用字体网站: 当然 如果你不知道自己的游戏适合什么风格
精华
126 赞
44 回复
安史之乱爆发选择效忠大唐,还是助燕称帝?截图
安史之乱爆发选择效忠大唐,还是助燕称帝?
没有固定的任务线!你可以选择协助大唐勤王,收复河山;也可以加入安史叛军,踏平长安;甚至可以招兵买马,割据一方,成就霸业! 招募兵种、整备战马、收集天下奇珍。步、骑、弓兵种克制,地形、士气、补给缺一不可,真实还原古代战争谋略。 从长安到幽州,大地图自由探索,真实模拟唐朝地理与势力版图。 如果你厌倦了无脑推图,如果你向往真实的乱世求生,欢迎来体验这款硬核策略RPG!求大佬轻喷,给个关注!#安史之乱 #
1 赞
开发日志(day3)今天的积分也是成功归零了截图
开发日志(day3)今天的积分也是成功归零了
一眨眼就到了周一,周一有很多活要干啊,所以也给ai安排了很多的活,一不小心就把积分用没了😂,可惜就是积分用完了也没有改好,所以实质内容改的怎么样了,还得等到明天,不过也是记录一下到底做了什么吧。 修复了装备店只有出售没有购买的按键,导致变成装备展览店了(笑) 增加了背包上限和道具的堆叠上限规则 修复了新手教程因为还没教程就把怪打死了,导致了按钮一直存在的bug 增加了道具拾取背包满了可以切换到背包
3 赞
01:29
官方阅,申请积分计划2,希望官方继续支持我完成这款游戏,截图
官方阅,申请积分计划2,希望官方继续支持我完成这款游戏,
视频内容只是一部分, 本游戏耗时3个月,目前完成进度百分之80, 是生存游戏,进入修仙界,走剧情找到宗门加入, 这时游戏才是真正开始, 提升实力境界后就可以变强,获取功法法术法宝, @视频内是游戏里挑战妖族入侵一种主流玩法,游戏就是围绕着这个来进行, 还有很多地方可以战斗,获得资源修炼变强,比如去藏书阁学习功法, 去法宝楼抽法宝,每一个宗门数十个法宝抽取 去修仙界探索,获得各自的资源,可能遇见妖兽
1 赞
3 回复
00:37
【积分申请】《最后的黎明》全球进化,游历全球,活下去!截图
【积分申请】《最后的黎明》全球进化,游历全球,活下去!
《最后的黎明》 是一款 2D 像素风、横版、末世开放探索 + 轻战斗的冒险游戏。参考《僵尸毁灭工程》的建筑搜刮与风险玩法,《死亡细胞》的战斗手感,《守墓人》《去月球》的叙事氛围。 世界观 灾难过后,文明陨落。 城市化为废墟,天空常年灰蒙,只有地平线尽头透出一线极淡的暖金色黎明。玩家扮演一名饱经沧桑的幸存者,破旧军绿外套、脏污绷带、单边护目镜、缠布的铁管武器,独自深入这座沉睡的城市,追寻那道光。 核
1 赞
1 回复
01:21
请都看过来~!!!截图
请都看过来~!!!
我是傻…… 很遗憾错的过了这次活动的报名,但刚好我的游戏也是在这个期间完成的,看了下大佬们的作品,感觉我做的还是太粗浅了。模型粗糙,UI也用的原始版本,很多地方都还需要打磨,可惜...这次赠送积分已经败光了。以后的积分大概只能先维护下游戏修复点bug,希望以后还能申请积分... 既然都这样了,我也想看看和大佬们的作品有多大的差距。 星三国/星三国纪元 (其实名字我都还没决定好) 游戏了一半灵感来自
2 赞
4 回复
第三天我们收在版本 1.0.51。第四天从凌晨 0 点 05 分的第一笔改动,一直干到 23 点 46 分的最后一次构建,36 次构建把版本推到 1.0.69。这一天没有铺新星球,做的是四件"让世界住得下去"的事:星航号有了生态家园,精灵助手"超能诺诺"正式上岗,Boss 强度重排了一遍,精灵背包按经典结构重做。
星航号生态家园:用现有零件盖一间屋子 家园是今天最大的一条线。主导航点「家园」,直接截图
第三天我们收在版本 1.0.51。第四天从凌晨 0 点 05 分的第一笔改动,一直干到 23 点 46 分的最后一次构建,36 次构建把版本推到 1.0.69。这一天没有铺新星球,做的是四件"让世界住得下去"的事:星航号有了生态家园,精灵助手"超能诺诺"正式上岗,Boss 强度重排了一遍,精灵背包按经典结构重做。 星航号生态家园:用现有零件盖一间屋子 家园是今天最大的一条线。主导航点「家园」,直接
1 赞
【游戏上新】从抓妖开始(RPG抓宠同屏联机)截图
【游戏上新】从抓妖开始(RPG抓宠同屏联机)
《从抓妖开始》上新:多人在线抓宠 RPG,捕捉、养成、打 Boss、摆摊交易都安排上了! 大家好,我正在 TapTap 制造里开发一款多人在线抓宠 RPG:《从抓妖开始》。 @蒜鸟 这次想和大家分享一下目前游戏已经做出的核心玩法,也欢迎大家来体验、反馈、提建议。 一句话介绍 《从抓妖开始》是一款以 抓宠养成、回合制战斗、装备锻造、世界 Boss、天梯竞技和玩家社交交易 为核心的多人常驻服 RPG。
7 赞
游戏自荐《少女终焉契约》截图
游戏自荐《少女终焉契约》
之前玩放置类型的rpg游戏的时候我就在想,现在游戏的操作有的太过于繁琐了,有没有一款休闲一点的,想上线就上线,离线的时候角色能自动行动的游戏呢?感谢TapTap制造,我按照我的想法开发出了现在这款游戏。 一、故事背景和UI 游戏的故事背景是传统的异世界穿越故事,玩家被女神召唤到异世界,随后组建工会,招募美少女,打怪升级探索世界。所以我选择了更加二次元萌系画风的UI风格,主页为各个主要的功能,点开来
8 赞
3 回复