游戏开发图形学【免费下载链接】turbulenz_engineTurbulenz is a modular 3D and 2D game framework for making HTML5 powered games for browsers, desktops and mobile devices.项目地址https://gitcode.com/gh_mirrors/tu/turbulenz_engine点击查看免费下载AssetTracker 是 Turbulenz Engine 提供的资源加载跟踪工具用于在游戏启动阶段精确统计已加载资源数量并计算下载进度。本文基于 assettracker_api.rst 官方 API 文档结合 assettracker.ts 源码实现、loading.ts 示例以及 protolib.js 实战用法完整讲解 AssetTracker 的创建、事件挂载、进度查询与回调机制帮助你为 HTML5 游戏实现可靠的启动加载进度条。概述AssetTracker 解决什么问题Turbulenz 游戏的启动阶段需要下载大量资源模型、纹理、着色器、字体、声音等而这些资源由不同管理器TextureManager、ShaderManager、FontManager、SoundManager异步加载。若没有一个统一的计数工具开发者很难回答两个基本问题启动阶段到底要加载多少个资源当前已经加载了多少、进度是多少AssetTracker 正是为此设计的轻量工具对象。官方文档将其定位为开发期的实用对象在开发阶段用于统计启动时加载的资源数量当游戏启动需求资源清单最终确定后再利用统计结果计算资源下载的加载进度。该工具的核心价值在于它把资源加载计数与进度计算从各个管理器各自的 pending 计数中抽象出来统一挂接到RequestHandler的资源加载事件上从而实现全局、单一来源的进度视图。构造函数AssetTracker.create(numberAssetsToLoad, displayLog)创建 AssetTracker 对象使用静态工厂方法语法如下var assetTracker AssetTracker.create(numberAssetsToLoad, displayLog);参数说明参数类型含义numberAssetsToLoadNumber计划加载的资源总数。如果传入0则不计算进度信息此时只能通过getLoadedCount()获取计数displayLogBoolean是否将加载日志输出到控制台。开发期建议设为true正式发布前应改为false源码视角create 的内部初始化从 assettracker.ts 可以看到create的完整实现static create(numberAssetsToLoad: number, displayLog: boolean): AssetTracker { var f new AssetTracker(); f.assetsLoadedCount 0; f.loadingProgress 0; f.numberAssetsToLoad 0; f.callback null; f.displayLog displayLog; if (numberAssetsToLoad) { f.numberAssetsToLoad numberAssetsToLoad; } f.eventOnLoadHandler function assetTrackerEventOnLoadHandlerFn(event) { f.eventOnAssetLoadedCallback(event); }; return f; }关键点初始状态为assetsLoadedCount 0、loadingProgress 0、callback nullnumberAssetsToLoad仅在传入非零值时才被赋值——这印证了文档中传 0 则不计算进度的行为eventOnLoadHandler在创建时被闭包绑定到实例上它内部委托给eventOnAssetLoadedCallback完成实际计数与进度更新后续可直接将这个句柄注册到RequestHandler上。开发期日志模式官方文档特别强调了一种开发工作流先用numberAssetsToLoad 0displayLog true创建 AssetTracker此时控制台会逐条打印所有已加载资源的名称、序号Asset Number与当前进度待统计出启动阶段资源总数后再修改create的参数传入真实总数。这样既可以在开发期盘点资源清单又不影响后续上线时的进度计算。方法一eventOnLoadHandler —— 挂接资源加载事件eventOnLoadHandler是 AssetTracker 的核心入口必须注册到游戏所使用的RequestHandler的eventOnLoad事件上requestHandler.addEventListener(eventOnload, assetTracker.eventOnLoadHandler);该回调每个资源加载完成后被调用一次负责执行资源计数与进度计算。需要注意RequestHandler的事件名实际存储为eventOnload见 requesthandler.ts 中{ eventOnload: [] }的初始化文档中以eventOnLoad指代同一事件。事件对象字段回调被触发时传入一个包含以下字段的事件对象字段含义name刚加载完成的资源名称eventType触发该回调的事件类型从源码看该事件对象由RequestHandler在资源下载成功后的响应回调中构造并派发requesthandler.tsif (callContext.onload) { var nameStr; if (responseAsset responseAsset.name) { nameStr responseAsset.name; } else { nameStr callContext.src; } sendEventToHandlers(handlers.eventOnload, {eventType: eventOnload, name: nameStr}); callContext.onload(responseAsset, status, callContext); callContext.onload null; }也就是说name优先取响应资源的name属性否则回退到请求时的src地址eventType固定为字符串eventOnload。计数与进度的底层计算事件进入 AssetTracker 后由eventOnAssetLoadedCallback处理assettracker.tseventOnAssetLoadedCallback(event) { var numberAssetsToLoad this.numberAssetsToLoad; this.assetsLoadedCount 1; if (numberAssetsToLoad) { var progress this.assetsLoadedCount / numberAssetsToLoad; this.loadingProgress Math.max(this.loadingProgress, Math.min(progress, 1.0)); } if (this.displayLog) { Utilities.log(event.name (Asset Number this.assetsLoadedCount ) Progress : this.loadingProgress); } if (this.callback) { this.callback(); } }实现细节值得注意计数assetsLoadedCount每次事件触发自增 1因此每个资源调用一次的语义由事件派发保证进度钳制progress assetsLoadedCount / numberAssetsToLoad后经Math.min(progress, 1.0)上限钳制到 1再经Math.max(this.loadingProgress, ...)保证进度单调不减——即使出现重复事件或计数越界进度也不会回退或超过 1日志输出当displayLog为true时通过Utilities.logutilities.ts内部兼容有无console对象的环境打印资源名、序号与进度回调联动若设置了回调每次更新后立即调用这是驱动进度条渲染的机制。方法二getLoadedCount —— 查询已加载数量var numberAssetsLoaded assetTracker.getLoadedCount();返回当前已加载资源的数量即内部维护的assetsLoadedCount。该方法在开发期盘点资源时尤其有用配合displayLog日志可以确认启动阶段实际加载的资源总量。方法三getLoadingProgress —— 查询当前加载进度var loadingProgress assetTracker.getLoadingProgress();返回当前加载进度一个0 到 1含之间的数值。当所有请求的资源加载完成时该值等于 1。实现见 assettracker.ts直接返回内部loadingProgress字段。注意语义边界numberAssetsToLoad为 0 时不会计算进度此时loadingProgress保持初始值 0。因此该方法只有在创建时传入真实资源总数后才有意义。方法四setCallback —— 设置更新回调assetTracker.setCallback(callback);设置一个回调函数每次 AssetTracker 更新其数值与计算时即每次有资源加载完成、或numberAssetsToLoad被重新设置时都会调用。典型用途是在回调中驱动LoadingScreen重绘进度条见下文实战示例。从源码看setCallback仅做赋值assettracker.ts而回调的实际触发点有两处eventOnAssetLoadedCallback中每次资源事件后以及setNumberAssetsToLoad重新设置资源总数后assettracker.ts该方法同样会重新计算一次进度并触发回调。此外setNumberAssetsToLoad允许在创建之后动态修正资源总数并会按当前已加载数量立即重算进度。与 LoadingScreen 集成进度条渲染的完整链路AssetTracker 最常见的下游消费者是LoadingScreen。在 loadingscreen_api.rst 中LoadingScreen.create的可选参数assetTracker被定义为用于统计已加载资源数量并执行加载进度计算的对象若progress未设置则由它生成进度两者都不设置则进度条不渲染。对应地loadingscreen.ts 在渲染时读取进度var assetTracker this.assetTracker; var progress (assetTracker assetTracker.getLoadingProgress()) || this.progress;随后渲染逻辑loadingscreen.ts会将进度值钳制到 [0, 1]以barCenter屏幕百分比坐标为基准绘制背景条与进度条进度条宽度按(barBackgroundWidth - 2 * barBorderSize) * progress计算。也就是说AssetTracker 负责数据LoadingScreen 负责呈现二者通过getLoadingProgress()解耦。实战示例一官方 loading 示例的完整工作流samples/tsscripts/templates/loading.ts 展示了从创建到清理的完整流程var requestHandlerParameters {}; var requestHandler RequestHandler.create(requestHandlerParameters); assetTracker AssetTracker.create(12, false); requestHandler.addEventListener(eventOnload, assetTracker.eventOnLoadHandler); loadingScreen LoadingScreen.create(graphicsDevice, mathDevice, {assetTracker: assetTracker}); var lastLoadingScreenRender 0; function onAssetLoaded() { if ((lastLoadingScreenRender 0.1) TurbulenzEngine.time) { if (graphicsDevice.beginFrame()) { loadingScreen.render(1, 1); graphicsDevice.endFrame(); lastLoadingScreenRender TurbulenzEngine.time; } } } assetTracker.setCallback(onAssetLoaded);该示例的核心模式创建 RequestHandlerRequestHandler.create它是后续所有资源请求与事件派发的枢纽创建 AssetTracker此处以硬编码的12作为numberAssetsToLoad开发期可用0displayLogtrue统计真实值后替换注册事件requestHandler.addEventListener(eventOnload, assetTracker.eventOnLoadHandler)此后每加载完一个资源AssetTracker 便计数并更新进度创建 LoadingScreen 并传入assetTracker进度条的数据源即来自getLoadingProgress()设置回调onAssetLoaded以节流方式lastLoadingScreenRender 0.1时间间隔限制即最多每 0.1 秒一帧调用loadingScreen.render(1, 1)重绘进度条。加载完成后示例还会清理注册loading.tsrequestHandler.removeEventListener(eventOnload, assetTracker.eventOnLoadHandler); assetTracker null;移除监听并置空引用避免正式游戏阶段继续做无谓的计数与渲染开销。RequestHandler的addEventListener/removeEventListener实现在 requesthandler.ts。实战示例二Protolib 自动统计资源总数在protolib基于 Turbulenz 的通用游戏模板中资源总数不再硬编码而是通过各管理器的 pending 计数求和得到protolib.jsvar assetCount shaderManager.getNumPendingShaders() textureManager.getNumPendingTextures() fontManager.getNumPendingFonts(); if (soundManager) { assetCount soundManager.getNumPendingSounds(); } assetTracker protolib.assetTracker AssetTracker.create(assetCount, false); assetTracker.setCallback(updateAssetTrackerFn); requestHandler.addEventListener(eventOnload, assetTracker.eventOnLoadHandler);这段代码给出了一条更稳健的实践路径先创建ShaderManager、TextureManager、FontManager、SoundManager并提交资源请求通过各管理器的getNumPending*()方法汇总待加载资源总数作为numberAssetsToLoad传入发布模式displayLog直接设为falsesetCallback(updateAssetTrackerFn)在每次进度更新时调用protolib.loadingScreen.render(...)见 protolib.js形成事件 → 计数 → 回调 → 渲染的闭环加载完成后由waitForForwardRenderingShaders轮询各管理器 pending 数归零来确认收尾protolib.js。开发到发布的推荐工作流综合官方文档与仓库实践AssetTracker 的推荐使用方式如下开发期盘点以AssetTracker.create(0, true)创建配合getLoadedCount()与控制台日志观察启动阶段实际加载的所有资源及总数固化总数将统计得到的资源总数写入create的numberAssetsToLoad或像 Protolib 那样在运行时用getNumPending*()汇总并保留displayLog接入进度条将assetTracker传入LoadingScreen.create的参数对象或通过setCallback自行驱动渲染发布前收尾将displayLog设为false游戏资源加载完成后调用requestHandler.removeEventListener(eventOnload, assetTracker.eventOnLoadHandler)解除注册并释放引用。相关源码与文档索引官方 API 文档assettracker_api.rst核心实现assettracker.ts事件派发实现requesthandler.ts进度条渲染loadingscreen.tsLoadingScreen API 文档assetTracker参数loadingscreen_api.rst完整示例loading.ts自动统计资源数的框架实现protolib.js理解 AssetTracker 的关键在于抓住它计数归 AssetTracker、事件归 RequestHandler、呈现归 LoadingScreen的分工边界它本身不发起任何资源请求只负责监听、计数、算进度和通知因而可以透明地嵌入任何基于RequestHandler的资源加载流程为 Turbulenz 游戏的启动体验提供精确、可控的进度依据。赞分享游戏开发图形学【免费下载链接】turbulenz_engineTurbulenz is a modular 3D and 2D game framework for making HTML5 powered games for browsers, desktops and mobile devices.项目地址https://gitcode.com/gh_mirrors/tu/turbulenz_engine点击查看免费下载相关推荐QCMA SFO 文件破解指南如何读取 PS Vita 存档的隐藏元数据QCMA SFO 文件破解指南如何读取 PS Vita 存档的隐藏元数据 如果你在用 QCMACross platform content manager桌面应用3分钟搭建跨平台文件服务器HFS2极速上手指南3分钟搭建跨平台文件服务器HFS2极速上手指南 还在为跨平台文件共享烦恼吗传统FTP配置复杂云存储又有隐私顾虑。HFS2HTTP File Server游戏开发图形学lifeRestart资源加载优化预加载策略与加载进度显示lifeRestart资源加载优化预加载策略与加载进度显示 在游戏开发中资源加载是影响用户体验的关键环节。本文将以lifeRestart项目为例详细解析其前端游戏开发上一篇TPFanCtrl2完全概览这款免费的ThinkPad风扇控制工具为何是静音降温的终极选择下一篇golutra快速开始教程5步搭建你的第一个多Agent并行执行工作流创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?