【发布时间】:2010-12-25 03:19:07
【问题描述】:
我希望实现一个管理 blit 队列的模块。有一个表面,这个表面的一部分(以矩形为界)被复制到表面内的其他地方:
add_blt(rect src, point dst);
可以按顺序向队列发布任意数量的操作。最终,队列的用户将停止发布 blit,并要求在表面上实际执行的一组最佳操作。该模块的任务是确保没有不必要的像素被复制。
这当然会因为重叠而变得棘手。 blit 可以重新 blit 先前复制的像素。理想情况下,blit 操作将在优化阶段进行细分,这样每个块都可以通过一次操作到达其最终位置。
将这些放在一起很棘手,但并非不可能。我只是不想重新发明轮子。
我在网络上环顾四周,唯一发现的是SDL_BlitPool Library,它假定源表面与目标表面不同。它还做了很多繁重的工作,看似不必要:区域和类似的构建块是给定的。我正在寻找更高层次的东西。当然,我不会看在嘴里的礼物马,我也不介意做实际的工作......如果有人能提出一个基本的想法,让这个问题看起来没有那么复杂吗?现在,那也太棒了。
编辑:
想想 aaronasterling 的回答……这行得通吗?
实现自定义区域处理程序代码,该代码可以维护其包含的每个矩形的元数据。当区域处理程序分割一个矩形时,它会自动将这个矩形的元数据与生成的子矩形相关联。
当优化运行开始时,创建一个由上述自定义代码处理的空区域,称之为
master region-
遍历
blt队列,并针对每个条目:让
srcrect成为bltbeng 检查的源矩形把
srcrect和master region的交集变成temp region从
master region中删除temp region,所以master region不再覆盖temp region将
srcrect提升为区域(srcrgn)并从中减去temp region将
temp region和srcrgn与当前blt的向量偏移:它们的联合将覆盖当前blt的目标区域添加到
master regiontemp region中的所有矩形,保留原始源元数据(将当前blt添加到master region的第一步)-
添加到
李>master regionsrcrgn中的所有rects,添加当前blt的源信息(将当前blt添加到master region的第二步)
通过检查作为合并候选者的相邻子矩形是否具有相同的元数据来优化
master region。如果(r1.x1 == r2.x1 && r1.x2 == r2.x2) | (r1.y1 == r2.y1 && r1.y2 == r2.y2),则两个子矩形是合并候选者。如果是,请将它们组合起来。枚举
master region的子矩形。返回的每个矩形都是一个优化的 blt 操作目标。关联的元数据是 blt 操作的源。
【问题讨论】: