docs(tests): explain projection cache invalidation and frame notifications
This commit is contained in:
@@ -15,8 +15,10 @@ const document=createDocument('project',[{id:'P',parent:null},{id:'S',parent:{ca
|
||||
// 每次draw与直接投影深比较;标题、选择与元数据不增计算,A局部变化只重算自身,F移动再影响后代及路径。
|
||||
test('indexed renderer projection preserves legacy output and avoids unrelated geometry work on title, selection and ACK',()=>{
|
||||
let id=0;const editor=createEditor({document,registry,createId:()=>`operation-${++id}`,runtime:0}),cache=createGeometryProjectionCache(),owner={},selected=new Set(),draw=()=>{const doc=editor.getSnapshot().document,actual=projectCanvas(doc,'P',registry,selected,()=>undefined,null,undefined,{queries:editor.getQueries(doc),geometry:cache,owner});assert.deepEqual(actual,projectCanvas(doc,'P',registry,selected,()=>undefined));return actual;};
|
||||
// 深比较先证明投影内容一致,再用累计 computed 计数观察额外工作;缓存条目数与累计计算数是不同指标。
|
||||
draw();const before=cache.stats();assert.deepEqual({nodes:before.nodesComputed,children:before.childrenComputed,edges:before.edgesComputed},{nodes:4,children:1,edges:2});editor.dispatch({type:'element.data',target:{id:'A',incarnation:1},patch:{title:'only title'}});draw();assert.deepEqual(cache.stats(),before);selected.add('B');draw();assert.deepEqual(cache.stats(),before);editor.updateRuntime(()=>1);draw();assert.deepEqual(cache.stats(),before);
|
||||
editor.dispatch({type:'element.geometry',target:{id:'A',incarnation:1},patch:{x:300,rotation:25}});draw();assert.equal(cache.stats().nodesComputed,before.nodesComputed+1);assert.equal(cache.stats().childrenComputed,before.childrenComputed);assert.equal(cache.stats().edgesComputed,before.edgesComputed);
|
||||
// 移动 F 会改变自身及 A/B 的投影坐标,也改变子图变换和归上级的 in 曲线路径。
|
||||
editor.dispatch({type:'element.geometry',target:{id:'F',incarnation:1},patch:{x:200}});draw();assert.equal(cache.stats().nodesComputed,before.nodesComputed+4);assert.equal(cache.stats().childrenComputed,before.childrenComputed+1);assert.equal(cache.stats().edgesComputed,before.edgesComputed+1);
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user