DrawingSequence 作为场景中所有 BaseObject 的绘图协调器:在注册/注销过程中维护注册列表,按照注册顺序构建有序的 Entry 表,并在每帧 DrawAll() 中负责根据对象的可见性、深度与动画状态统一采集要展示的 CF_Sprite。它用单例+std::mutex 保护来保证主循环、重生流程与可能的其他线程在并发操作对象列表时不会出现竞态。
Register为每个对象分配一个增量的reg_index,防止排序依赖于std::vector的内存地址;重复注册会被检测并略过。Unregister通过查找Entry、移除BaseObject引用并释放记录,同时清理内存、保持序列长度合理。
DrawAll()先加锁、重置last_image_id及s_pending_sprites缓存,确保每帧上下文干净。- 按深度 +
reg_index对活跃对象排序,保持渲染顺序确定性。 - 每个可见对象:更新动画、同步位置、触发 UI 形状/碰撞回调,并调用
PushFrameSprite()生成spritebatch_sprite_t。PushFrameSprite使用当前s_draw->mvp计算几何,累积到s_pending_sprites,当缓存达到kSpriteChunkSize时就通过FlushPendingSprites()封装为一个新的CF_Command。 FlushPendingSprites()会在s_pending_sprites非空时创建CF_Command、将条目逐个写入cmd.items,然后清空缓存,为下一帧或下一个批次做好准备。- 帧遍历完毕后再次调用
FlushPendingSprites(),确保残留条目被提交;最终,app_draw_onto_screen会读取s_draw->cmds,由 Cute 渲染管线遍历cmd.items并最终向屏幕提交图元。
- 中间缓存防止
Cute::Array因瞬时大量DRAW_PUSH_ITEM扩容导致的内存暴涨,同时保留cf_draw/cam_stack所需的s_draw命令结构。 - 缓存批量提交使得即便同一帧渲染成千上万的 sprite,也只会在
s_draw->cmds中生成有限数量的CF_Command,每条cmd.items的容量可控。 - 该流程仍兼容 Cute 的渲染回调,
DrawingSequence仅负责上传与提交,最终绘制由app_draw_onto_screen或其他渲染器执行。