【问题标题】:Efficient algorithm for writing several bits across several words跨多个字写入多个位的高效算法
【发布时间】:2010-11-30 04:50:24
【问题描述】:

我的一个项目涉及绘制文本。该项目基于中级 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

如果有人知道任何此类算法或过去做过类似的事情,那么知道你是如何做到的会很棒。我现在脑部严重阻塞。

【问题讨论】:

    标签: algorithm bit-manipulation


    【解决方案1】:

    你能 rShift 5 位,在第一个 WORD 上做一个 AND 然后 lShift 11 然后在第二个 WORD 上做 AND 还是我遗漏了什么?

    【讨论】:

    • 你知道我没想到这一点。现在看起来很明显!!脑残,呃。
    • @Thomas,那么您可能只想接受这个作为答案。 :)
    【解决方案2】:

    在复杂的图形加速器出现之前的日子里,人们将可以实现的任何东西隐藏在诸如 bitblt 之类的接口后面。在http://swtch.com/~rsc/talks/drawtalk.pdf 传递了一个关于此示例的快速记录,其中一些通过自动生成然后执行机器代码来工作。该论文中的方法被描述为“实际上,绘制实现是上面的 足够的条件和函数调用被推到外面 足够的循环来使开销可以承受。”我看到的一个版本很长,其中提取了各种常见的特殊情况“快速路径”。

    【讨论】:

      猜你喜欢
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      • 2023-01-19
      • 2023-04-06
      • 2021-07-15
      • 1970-01-01
      相关资源
      最近更新 更多