为什么Mac上的SDL比Linux慢得多?

时间:2020-01-12 02:18:47

标签: 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

那是巨大的区别!

1 个答案:

答案 0 :(得分:7)

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

相关问题