跳到主要内容
asset-pipeline · 代码
Graphics Learning Lab Asset Pipeline / Source

看见反常 · 动一处 · 抓证据

画面上的风险,在代码里从哪儿冒出来?

只读 · 与实验共用计算模型

这页解决什么

按入口检查、材质成本和加载依赖阅读。每一段都对应实验里的一组可见数字。

01 / 入口契约

运行时看到资源前,先做体检

法线、命名、UV 和 schema 都在这里被拦截。

// Asset Pipeline Simulator — Unity Editor pipeline sketch
const qaScore = 100 - missingChecks - schemaDrift - variantPenalty;
const syncRisk = schemaDrift + dependencyDepth * 0.018 + cacheMisses * 0.1;
const rollbackReady = applyMode !== "apply" && schemaVersion === requiredSchema;
02 / 材质成本

变体会放大内存与提交

共享材质和图集是在交换画质、内存与维护成本。

const textureFactor = (textureResolution / 1024) ** 2;
const peakMemoryMb = textureFactor * 4 * materialSlots * (sharedMaterial ? 1 : variants);
const drawCalls = sharedMaterial ? ceil(materialSlots / 4) : materialSlots * variants;
03 / 流式加载

加载时间来自一张依赖图

缓存 miss 和依赖深度,会让小 Bundle 也变慢。

const loadMs = base + bundles * 4 + dependencyDepth * 3 + cacheMisses * 40;
const reportId = stableHash({ schemaVersion, qaScore, loadMs, rollbackReady });
04 / 候选门禁

LOD 与 Collider 分开生成、分开验收

网页只解释候选与门禁;QEM、Mesh 重建、Physics 查询和发布回滚必须在 Unity Editor 工具中执行。

// Q27: generate derived candidates; never overwrite the source Mesh.
const lodCandidate = qemEdgeCollapse(sourceMesh, preserveFeatures);
const colliderCandidate = fitCollider(sourceMesh, colliderPolicy);
const lodGate = compareFixedCameraSilhouette(lodCandidate, limits);
const physicsGate = replayPhysicsQueries(colliderCandidate, fixtures);
const decision = decide(lodGate, physicsGate); // pass | block | manual
publishDerivedCandidateOrKeepStable(decision, previousGoodArtifact);

// The web Lab visualizes this contract; only Unity runs these operations.