把很多小任务集中在一帧做完,可能使画面出现长停顿。分批处理会把工作摊开,但不可分割的任务比预算还大时,也需要明确处理规则,否则队头会永远堵住。
先确定规则与输入
任务按先进先出执行,每项成本是自定时间单位。每帧有固定预算,能装下队头就继续;下一项装不下则留到下一帧。如果空帧的第一项本身超过预算,允许它独占一帧并记录超额。
每帧预算9 任务零到十三的成本[2, 4, 7, 1, 8, 16, 5, 7, 8, 9, 3, 6, 2, 2]
逐项算出过程
第1帧执行任务[0, 1],成本6,剩余预算3,超额0;下一队头2。
第2帧执行任务[2, 3],成本8,剩余预算1,超额0;下一队头4。
第3帧执行任务[4],成本8,剩余预算1,超额0;下一队头5。
第4帧执行任务[5],成本16,剩余预算0,超额7;下一队头6。
第5帧执行任务[6],成本5,剩余预算4,超额0;下一队头7。
第6帧执行任务[7],成本7,剩余预算2,超额0;下一队头8。
第7帧执行任务[8],成本8,剩余预算1,超额0;下一队头9。
第8帧执行任务[9],成本9,剩余预算0,超额0;下一队头10。
第9帧执行任务[10, 11],成本9,剩余预算0,超额0;下一队头12。
第10帧执行任务[12, 13],成本4,剩余预算5,超额0;下一队头为空。
全部任务分到10帧;任务总成本80,分帧后不会凭空减少。超大任务明确记录为超额,不能当作符合预算的一帧。
复核时看什么
逐帧检查任务顺序、累计成本和剩余预算。普通帧结束时若仍有任务,下一项必须确实装不下;超额帧只能包含一个超大任务。最终每项恰好执行一次,不能悄悄跳过难处理的队头。
练习时可以先遮住结果,沿用相同输入独立记录中间状态,再逐项比较。发现不同后先定位最早分歧,确认边界包含方式、编号起点、更新顺序以及是否提前取整。最后结果一致也不表示每个中间步骤都正确,因此保留过程记录有助于看清原因。
适用范围
这些成本是假定已知的模型量,并非对实际设备的耗时承诺。真实任务成本会波动,且帧内还有渲染、输入等工作。遇到经常超额的大任务,更合理的改进通常是继续拆分或改变执行方式。
