我的一个项目涉及绘制文字。该项目基于中级16位微控制器dsPIC33FJ128GP802。它能够达到40 MIPS,但其中约92%用于后台处理(输出屏幕显示),因此平均而言,它可以渲染3 MIPS。处理器具有硬件乘法,辅助除法(18个周期)和一个完整的16位桶形移位器。
原始方法很简单。它只需要为每个需要写入的像素调用设置像素例程,但是,这非常慢:每个像素写入需要地址解码,位掩码和写入存储器 - 平均来说,每个像素大约60个周期。此外,需要为要设置的每个像素写入两个位:掩码阵列中的一个(确定像素是否可见),以及级别数组中的一个(确定像素是白色还是黑色)。对于单个字符,8x14像素,这意味着13,440个周期加上开销。鉴于缺乏足够的处理能力,这一点很多。
因此,我提出了一种绘制水平线的算法。它可以在大约20个周期内有效地写入16个像素,这在单独设置像素方面提高了60倍;它还可以处理不在字边界上的线(使用一些聪明的位数学),甚至是完全位于一个字内的线。 (注意 - 一个字是16位,视频存储器存储为4个3,072个字的数组,一个前缓冲区和后缓冲区。)我不确定算法是否是原始的 - 我对此表示怀疑 - 但对于那些好奇的, I've documented it here
现在我绞尽脑汁试图想出一种方法来设置多个单词的多个不同像素。理想情况下,它会像这样工作 - 我们想要从第一个字的第4位(从零开始计数)开始写这个字,并允许它溢出到下一个字:
Memory before : 0000 0000 0000 0000 0000 0000 0000 0000
Word to write : 1111 1010 1111 1111
Memory after : 0000 0111 1101 0111 1111 1000 0000 0000
如果有人知道任何此类算法或过去曾做过类似的事情,那么知道你是如何做到这一点会很棒。我现在有一个主要的脑块。
答案 0 :(得分:2)
你可以转发5位,在第一个WORD上执行AND,然后lShift 11然后在第二个WORD上执行AND,或者我错过了什么?
答案 1 :(得分:0)
在复杂的图形加速器之前的日子里,人们隐藏了他们可以在诸如bitblt之类的接口后面实现的任何东西。在http://swtch.com/~rsc/talks/drawtalk.pdf传递了一个这样的例子的快速记录。其中一些通过自动生成然后执行机器代码来工作。该论文的方法被描述为“有效地,绘制实现是上面的 足够的条件和函数调用推到外面 足够的循环使开销可以承受。“我看到的一个版本很长,有各种常见的特殊情况提取”快速路径“。