c++ - 为什么 SDL 在 Mac 上比 Linux 上慢很多?

标签 c++ linux macos performance sdl

我正在研究a single-threaded graphical program that renders using SDL2 。请参阅末尾的较小示例。

它既可以在旧的 Linux 机器上运行,也可以在不太旧的 Mac 上运行。 Linux 计算机的处理器为 1.60GHz,而 Mac 的处理器为 2.2GHz。 Linux 上的 SDL 版本是 2.0.8,Mac 上的 SDL 版本是 2.0.10。在两台计算机上我都用 clang++ 编译使用优化标志-O3-flto 。我用 ./intergrid -fullscreen -pixel-size 3 调用了可执行文件(本质上,我让程序绘制了很多像素。)

由于某种原因,较慢的 Linux 计算机毫不费力地执行了程序,而 Mac 则花了几秒钟来渲染第一帧。正如预期的那样,当我使用 -no-draw 时,Mac 比 Linux 机器更快。禁用图形的标志。

编辑:Linux 计算机具有用于图形的“Intel Haswell Mobile”,Mac 列出“Intel Iris Pro 1536 MB”。

这是一个最小的可重现示例:

#include <SDL2/SDL.h>
#include <stdio.h>

int main(void)
{
    SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);

    SDL_Window *window = SDL_CreateWindow(
        "Example",
        SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
        0, 0,
        SDL_WINDOW_SHOWN);
    SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN_DESKTOP);

    SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, 0);

    SDL_Rect viewport;
    SDL_RenderGetViewport(renderer, &viewport);

    // The screen is not rendered to unless this is done:
    SDL_Event event;
    while (SDL_PollEvent(&event))
        ;

    Uint32 ticks_before = SDL_GetTicks();
    for (int x = 0; x < viewport.w - 10; x += 10) {
        for (int y = 0; y < viewport.h - 10; y += 10) {
            // I just chose a random visual effect for this example.
            SDL_Rect square;
            square.x = x;
            square.y = y;
            square.w = 10;
            square.h = 10;
            SDL_SetRenderDrawColor(renderer, x % 256, y % 256, 255, 255);
            SDL_RenderFillRect(renderer, &square);
        }
    }
    Uint32 ticks_after = SDL_GetTicks();
    printf("Ticks taken to render: %u\n", ticks_after - ticks_before);

    SDL_RenderPresent(renderer);

    SDL_Delay(500);

    // I Won't worry about cleaning stuff up.
}

我在 Mac 和 Linux 上用 clang++ -O3 -flto <filename> -lSDL2 编译了这个。当我在 Mac 上运行该程序时,它打印出:

Ticks taken to render: 849

Linux 上的程序打印出:

Ticks taken to render: 4

这是一个巨大的差异!

最佳答案

@keltar 找到了一个对我来说足够好的解决方案,但他们尚未将其作为答案发布,所以我会的。由于某些原因,SDL2 的 Metal 后端非常慢,因此解决方案是使用 OpenGL 后端。如果我发现默认驱动程序是 Metal(使用 SDL_GetRendererInfo),我会通过调用 SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl") 来完成此操作。

关于c++ - 为什么 SDL 在 Mac 上比 Linux 上慢很多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59700423/

相关文章:

java - 如何更新 Mac 上的 Java 版本以便安装 Eclipse?

c++ - 使用 std::function 在使用模板时调用成员函数

linux - 在 bash 中从 $PATH 获取并打印目录

ruby-on-rails - rails ,Postgres : dyld: lazy symbol binding failed: Symbol not found: _PQresultMemorySize

安装了Python 3,运行时出错

linux - 窗口是否需要图形环境才能存在?

c++ - 带返回类型参数的函数模板特化

c++ - 将vector <int8>转换为vector <uint8>

c# - 防止在 IIS 中加载特定的 dll

javascript - GYP 在 pcduino 上安装 Node 时出错