Chapter 222 · 3D 图形

异步加载与预算

CPU 解码走 worker 线程,GPU 上传由你按预算泵送:字节、操作数硬上限加时间软上限——帧率由你说了算。

222

请求生命周期

xge3d_loader_desc_t ld = { 0 };
ld.max_requests = 64;   // 0 取默认 64,上限 1024

xge3d_loader *pLoader;
xge3dLoaderCreate(&ld, &pLoader);

xge3d_request_t tReq;
xge3dLoaderRequest(pLoader, "assets/scene.glb", &tReq);

状态机:QUEUED → LOADING → CPU_READY → UPLOADING → READY(或 FAILED / CANCELLED)。xge3dLoaderStatus 随时查询进度字节与结果。

按预算泵送

xge3d_upload_budget_t tBudget = { 2<<20, 2000, 16 };  // 字节 / 微秒 / 操作数
xge3d_upload_stats_t tStats;
xge3dLoaderPump(pLoader, &tBudget, &tStats);
// 字节与操作数是硬顶(大缓冲/纹理分片上传),时间是软限(操作间隙检查)
// 被挡住时的最小需求通过 min_next_bytes 报告
xge3d_request_info_t tInfo;
xge3dLoaderStatus(pLoader, tReq, &tInfo);
if (tInfo.state == XGE3D_REQUEST_READY) {
    xge3d_model *pModel;
    xge3dLoaderTake(pLoader, tReq, &pModel);  // 成功即失效句柄
}

取消、释放与线程

  • Cancel 幂等:立即阻止发布并在拥有线程释放 GPU 残留;CPU 清理可以稍后完成。
  • Release 使句柄失效——防止陈旧结果落到复用的 slot 上。
  • 线程规则:一个 loader 一条 xrt CPU worker;loader 的全部公开调用都走创建线程;Pump 必须在 GPU 上下文线程。
  • 资源提供者:XGE3D_LOADER_RESOURCE_PROVIDERS 标志接入 xgeResource 回调(工作线程执行,须线程安全);默认 IO 是普通文件与 file://。