【问题标题】:Drawing images compensation algorithm绘图图像补偿算法
【发布时间】:2015-04-14 19:08:24
【问题描述】:

在一些旧的/常规环境中,渲染图像的唯一选择是使用基本绘图函数

  • putpixel(x, y); (将像素放在画布的 x/y 位置)
  • lineto(x, y); (画一条线从偏移到画布的 x/y 位置)
  • moveto(x, y); (将偏移移动到画布的 x/y 位置)
  • setpen(r, g, b, transp, size);

但是它们真的很慢,特别是如果必须一次绘制很多。


我愿意根据我举例说明的这张图片发明一种补偿算法:

如您所见,它的作用是预测在哪里更适合使用lineto 而不是putpixel 来保存迭代。在这个例子中,它跳过了超过 50% 的迭代。 (红线表示这个偏移量不会用 putpixel 绘制,而是已经绘制的线的一部分) 它决定垂直线还是水平线更好。如果必须使用sin/cosin 函数来确定角度,那将是非常困难和缓慢的缓冲?


在我开始之前,我能收到什么建议来简化这项工作(或者如果已经存在类似的机制)吗?

【问题讨论】:

  • 既然需要为所有像素设置颜色,为什么只画水平线效率不高?
  • 这是一个很好的话题,但你应该知道,在大多数架构(尤其是“旧环境”)上,水平线始终是将任何内容显示在屏幕上的最快方式。大多数体系结构都有某种帧缓冲区,其中升序内存地址对应于下一个 x 坐标。如果到达右边界,下一个地址就是x=0,y+1。一些较旧的架构具有交错位平面,这意味着如果您想设置任意像素,则需要以字节为单位修改位。
  • 画线比 putpixel 效率高得多,准确地说。它将保存另一个调用 setpenputpixel 甚至整个迭代。这就是为什么......必须创建这样的算法。它必须足够聪明,才能确定在哪里使用以及使用什么样的线路。
  • 为什么需要 sin 和(或?)cos 来“确定角度”?您只想知道矩形中的哪一个更大,宽度或高度。
  • 给定一个角度上的线,受影响的像素和绘制到每个这样的像素的颜色是线绘制方法(例如 brezenham 或其他东西)的属性,因此任何有角度的绘图都会成为问题。

标签: c performance bitmap pixels bmp


【解决方案1】:

这是什么疯狂的 API,其中应用此类算法所涉及的处理不仅仅是补偿 API 调用开销?这比我们在单缓冲 4 色 CGA 图形时代所使用的技巧更具限制性!

没有任何图像 blitter 功能,您可以在其中绘制到屏幕外缓冲区并提前 blit 以补偿缓慢的绘制例程?

在任何情况下,授予这种病态示例,我首先建议尝试的只是将图像分解为水平扫描线并将putpixel 合并为单个水平扫描线内的lineto 调用。这实际上可能比您正在做的更好,因为它对内存/缓存更友好,这可能比减少 API 调用的数量更重要。

如果这还不够好,并且您想尝试这条成熟的路线,则在 3D/游戏行业中通常会执行类似的操作,以计算网格的高效三角形条带,以提供更紧凑的表示。示例:http://www.codercorner.com/Strips.htm

您的算法有一个非常相似的想法,但您无需费心创建邻接结构,因为它只是相邻像素(上/下/左/右)。您还希望优先考虑沿同一方向前进的邻居(例如:如果前一个邻居失败,则尽可能优先考虑向上的邻居)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 2013-06-07
    • 1970-01-01
    • 2011-02-11
    • 2021-07-05
    • 2012-04-06
    相关资源
    最近更新 更多