在某些旧/常规环境中,渲染图像的唯一选择是使用基本绘图功能
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
函数来确定角度,那将是非常困难和缓慢的缓冲吗?
在开始之前,我是否有任何建议可以简化这项工作(或者如果已有类似的机制)?
答案 0 :(得分:0)
在这种情况下,应用此类算法所涉及的处理不仅可以补偿API调用开销,还有什么样的疯狂API?这比我们在单缓冲4色CGA图形时使用的技巧更具限制性!
没有任何图像阻击功能,你可以绘制到屏幕外缓冲区并提前进行blit以补偿慢速绘制程序?
在任何情况下,给予这种病态示例,我首先建议尝试的只是将图像分解为水平扫描线并将putpixel
合并到一个水平的lineto
个调用中扫描线。这实际上可能比你正在做的更好,因为它更多的内存/缓存友好,这可能不仅仅是减少API调用的数量。
如果这还不够好并且您想要尝试这种完整的路线,那么在3D /游戏行业中通常会做类似的事情来计算网格的高效三角形条带以提供稍微更紧凑的代表。示例:http://www.codercorner.com/Strips.htm
您的算法有一个非常相似的想法,但您不需要为创建邻接结构而烦恼,因为它只是相邻的像素(上/下/左/右)。您还希望优先考虑沿相同方向前进的邻居(例如:如果前一个邻居关闭,请尽可能支持上邻居)。