【问题标题】:Which is the fastest way to clear a memory block (or a SDL surface)?清除内存块(或 SDL 表面)的最快方法是什么?
【发布时间】:2011-12-21 01:38:28
【问题描述】:

我目前正在使用 SDL 开发一个项目。它基本上在屏幕上绘制和移动图像(表面)。

要移动图像而不留下痕迹,您必须首先清除 屏幕表面,这与 glClear() 非常相似,我目前正在使用一个简单的 for 循环遍历表面的像素(也在表面或 memset 上绘制一个黑框)。

虽然以前的解决方案适用于小表面,但随着表面变大,它们会变得越来越慢,所以我一直在寻找可以清除(零)内存块的最快方法。

另外,一位朋友指出,使用 SIMD 指令可以非常快地完成工作,但我上次使用 ASM 是在 8085 上,对此的任何见解也可能有用。

【问题讨论】:

    标签: c++ c assembly sdl


    【解决方案1】:

    最快的方法是使用memset

    memset(ptr, 0, length);
    

    这会在支持它的架构上自动使用 SIMD*。你不会打败它。它已经受内存限制,因此它写入零的速度与处理器吐出的速度一样快。我不知道谁告诉你 memset 对于较大的块来说速度较慢,但​​你应该停止听那个人的声音。

    *有些工具链无法快速提供memset。您不太可能使用一个。

    【讨论】:

    • 实际上它只适用于SDL功能,没有彻底测试memset。 一些 PIC MCU 工具链,例如(显然不是这样)
    • 好吧,毕竟在 PIC 单片机上运行 SDL 有点奇怪,而且 PIC 没有 SIMD。
    • YMMV。我的经验是 memset 通常很慢。我看过源代码的那些只是做字节集。我自己写的(对于较大的区域)在中间部分使用较大的写入(只是在末端使用小写入作为必要)取得了巨大的成功。
    • @BrianKnoblauch:你看过哪些实现?我查看了 Linux (glibc) 和 Mac OS X (libc) 的库,它们都有一些实现:一个是 C 语言,然后是几个汇编语言。这两个库甚至具有三种不同的 x86 实现:一种用于 x86,一种用于 x86+SSE2,另一种用于 x86-64,全部用汇编语言编写。如果您能在您的平台上向我展示一个基准,那就太好了。
    【解决方案2】:

    您应该尝试memset,该实现应该经过高度优化,以利用您系统上可用的任何指令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-21
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 2011-03-25
      • 1970-01-01
      相关资源
      最近更新 更多