【发布时间】: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 效率高得多,准确地说。它将保存另一个调用
setpen和putpixel甚至整个迭代。这就是为什么......必须创建这样的算法。它必须足够聪明,才能确定在哪里使用以及使用什么样的线路。 -
为什么需要 sin 和(或?)cos 来“确定角度”?您只想知道矩形中的哪一个更大,宽度或高度。
-
给定一个角度上的线,受影响的像素和绘制到每个这样的像素的颜色是线绘制方法(例如 brezenham 或其他东西)的属性,因此任何有角度的绘图都会成为问题。
标签: c performance bitmap pixels bmp