首页 / 知识
关于图形:脏矩形
2023-04-16 04:39:00

Dirty Rectangles在哪里可以找到关于实现一种用于计算"脏矩形"以最小化帧缓冲区更新的算法的参考资料?允许任意编辑并计算更新显示所需的最小"位 blit"操作集的显示模型。 Vexi 是一个参考实现。该类是 org.vexi.util.DirtyList(Apache 许可证),用作生产系统的一部分,即经过彻底测试,并得到很好的评论。 需要注意的是,当前的类描述有点不准确,"用于保存需要重新绘制的矩形区域列表的通用数据结构,具有智能合并功能。"实际上,它目前不进行合并。因此,您可以将其视为基本的 DirtyList 实现,因为它仅与dirty() 请求相交以确保没有重叠的脏区域。 这个实现的一个细微差别是,区域不是使用 Rect 或其他类似的区域对象,而是存储在一个整数数组中,即在一维数组中的 4 个整数块中。这样做是为了提高运行时效率,尽管回想起来我不确定这是否有很多优点。 (是的,我实现了。)用 Rect 替换正在使用的数组块应该很简单。 上课的目的是要快。使用 Vexi,脏可能每帧调用数千次,因此脏区域与脏请求的交集必须尽可能快。不超过 4 个数字比较用于确定两个区域的相对位置。 由于缺少合并,它并不完全是最优的。虽然它确实确保脏/绘制区域之间没有重叠,但您最终可能会得到对齐的区域并且可以合并到更大的区域 - 从而减少绘制调用的数量。 代码Fragments。完整的代码在这里。
构建包含所有需要重绘的区域的最小矩形:
对于添加的每个脏区:
至少,Windows 会维护它所获知的更改的更新区域,以及由于窗口被遮挡和显示而需要进行的任何重新绘制。区域是由许多可能不连续的矩形、多边形和椭圆组成的对象。您通过调用 InvalidateRect 告诉 Windows 需要重新绘制屏幕的一部分 - 对于更复杂的区域还有一个 InvalidateRgn 函数。如果您选择在下一条 WM_PAINT 消息到达之前进行一些绘制,并且您希望将其从脏区中排除,则可以使用 ValidateRect 和 ValidateRgn 函数。 当您开始使用 BeginPaint 绘画时,您提供了一个 PAINTSTRUCT,Windows 会在其中填充有关需要绘画的内容的信息。其中一个成员是包含无效区域的最小矩形。如果您想在有多个小的无效区域时最小化绘图,您可以使用 GetUpdateRgn 获取区域本身(您必须在 BeginPaint 之前调用它,因为 BeginPaint 将整个窗口标记为有效)。 我认为,由于在最初编写这些环境时在 Mac 和 X 上最小化绘图很重要,因此存在维护更新区域的等效机制。 听起来你需要的是一个边界框,用于渲染到屏幕上的每个形状。请记住,多边形的边界框可以定义为"左下"(最小点)和"右上"(最大点)。即最小点的 x 分量定义为多边形中每个点的所有 x 分量中的最小值。对 y 分量(在 2D 的情况下)和边界框的最大点使用相同的方法。 如果每个多边形有一个边界框(又名"脏矩形")就足够了,那么你就完成了。如果您需要一个整体的复合边界框,则适用相同的算法,但您可以只填充具有最小和最大点的单个框。 现在,如果您在 Java 中执行所有这些操作,您可以使用 研究 R-tree 和 quadtree 数据结构。 我最近刚刚编写了一个 Delphi 类来计算两个图像的差异矩形,并且对它的运行速度感到非常惊讶 - 速度足够快,可以在短时间内运行,并且在记录屏幕活动的鼠标/键盘消息之后运行。 其工作原理的分步要点是: 通过矩形将图像细分为逻辑 12x12。 循环遍历每个像素,如果有差异,那么我告诉子矩形该像素属于哪个像素,其中一个像素和位置存在差异。 每个子矩形都会记住它自己最左边、最上面、最右边和最下面的差异的坐标。 一旦找到所有差异,我会遍历所有有差异的子矩形,如果它们彼此相邻,则从它们中形成更大的矩形,并使用最左边、最上面、最右边和这些子矩形的最底部差异,以制作我使用的实际差异矩形。 这对我来说似乎工作得很好。如果您还没有实现自己的解决方案,请告诉我,如果您愿意,我会通过电子邮件将我的代码发送给您。同样到目前为止,我是 StackOverflow 的新用户,所以如果您欣赏我的回答,请投票。 :) 您使用什么语言?在 Python 中,Pygame 可以为您做到这一点。使用 RenderUpdates Group 和一些具有 image 和 rect 属性的 Sprite 对象。 例如:
如果你不使用 Python Pygame,我会这样做:
|
最新内容
相关内容
linux显示错误命令?
linux显示错误命令?,信息,系统,电脑,状态,时间,环境,命令,搜狐,密码,异常,虚拟机里怎么开始linux系统,打startx命令提示错误1、第一种:这个问题linux逐行显示命令?
linux逐行显示命令?,标准,信息,系统,工作,地址,命令,实时,名称,文件,目录,Linux中显示一个文件最后几行的命令是什么?1、tail -n 20 filenamelinux计算机的命令?
linux计算机的命令?,系统,工作,信息,设备,技术,命令,网站,管理,灵活,基础,linux查看路径命令linux命令如果记不得,可以使用man命令来查看某个命linux显示时间命令?
linux显示时间命令?,时间,系统,管理,标准,信息,单位,工具,数据,中国,命令,linux必学的60个命令安装和登录命令:login、shutdown、halt、rebootlinux启动显示命令行?
linux启动显示命令行?,系统,密码,终端,状态,首页,情况,基础,电脑,信息,工具,linux,按了ctrl+alt+F1,进入了类似纯命令行的界面,让输入login信linux启动显示命令行?
linux启动显示命令行?,系统,密码,终端,状态,首页,情况,基础,电脑,信息,工具,linux,按了ctrl+alt+F1,进入了类似纯命令行的界面,让输入login信linux显示之前的命令?
linux显示之前的命令?,系统,信息,命令,地址,服务,环境,数据,标准,数字,不了,linux系统查看自己在linux上使用过的前10次命令首先打开Linux直接linux打开显示器命令?
linux打开显示器命令?,信息,工具,系统,环境,发行,实时,数据,设备,命令,文件,Linux文件系统操作命令cat:可以显示文件的内容(经常和more搭配使用linux命令实时显示?
linux命令实时显示?,系统,实时,时间,信息,情况,命令,对比,电脑,名称,一致,linux用set命令显示当前模式set命令作主要是显系统中已经存在的shellinux外部命令显示?
linux外部命令显示?,系统,工具,命令,一致,盘中,软件,技术,外部,内部,文件夹,Linux中如何分屏显示的命令是什么linux中如果想要把某个命令或者linux命令显示ip?
linux命令显示ip?,地址,系统,网络,信息,技术,电脑,手机,设备,服务,管理,配置LINUX的IP命令1、(1)Ifconfig命令 第一种使用ifconfig命令配置网卡linux纯命令行图形?
linux纯命令行图形?,系统,地址,电脑,密码,图形界面,上会,地方,工具,工作,环境,Linux命令行界面和图形界面切换手工切换:在图形界面中找一个可以