gpt4 book ai didi

javascript - 为什么绘制 POT 图像比 NPOT 图像更快?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:34:36 24 4
gpt4 key购买 nike

我正在研究 Canvas 速度优化,并找到了这个答案:https://stackoverflow.com/a/7682200/999400

  • don't use images with odd widths. always use widths as powers of 2.

所以我想知道,为什么这样更快?

我看到一些帖子解释说这对旧显卡有帮助(当使用 OpenGL 等时),但我说的是速度,而不是兼容性,还有 Canvas ,而不是 OpenGL/WebGL。

最佳答案

速度更快,因为您可以使用 << 运算符而不是 * 运算符。也就是说,执行“左移 1”(乘以 2)比执行“乘以 43”更快。人们可以通过在图像每一行的末尾添加填充字节来绕过这一限制(就像 MS 在内存位图中所做的那样),但本质上,这是两条指令之间速度差异的结果。

在过去的 8 位 320x200(模式 13h)中,您可以使用简单的公式对像素进行索引:

pixOffset = xPos + yPos * 320;

但这太慢了。一个更好的选择是使用

C

pixOffset = xPos + (yPos * 256) + (yPos * 64)

汇编

mov ax, xPos    ;   ax = xPos
mov bx, yPos ; bx = yPos
shl bx, 6 ; bx = yPos * 64
add ax, bx ; ax = xPos + (yPos * 64)
shl bx, 2 ; bx = yPos * 256
add ax, bx ; ax = xPos + yPos * 320

这似乎违反直觉,但如果写得好,它只使用单时钟指令。也就是说,您可以在 6 个时钟周期内计算偏移量。当然,流水线和缓存未命中会使情况复杂化。

在硬件中实现移位寄存器比在 $$ 和晶体管中实现完整的乘法单元要便宜得多。因此,可以使用相同数量的晶体管来提供更好的性能,或者可以使用更少的晶体管以更低的功耗实现相同的性能。

据我所知,现代处理器的 mul(和 div)指令是在查找表的帮助下实现的。这在很大程度上缓解了问题,但也不是没有问题。如需进一步阅读,请查看 Pentium fdiv 错误(芯片内错误填充了查找表)

http://en.wikipedia.org/wiki/Pentium_FDIV_bug

总而言之,它本质上是用于实现功能的硬件/软件的产物。

关于javascript - 为什么绘制 POT 图像比 NPOT 图像更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17100659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com