簡體   English   中英

為什么 Mac 上的 SDL 比 Linux 慢這么多?

[英]Why is SDL so much slower on Mac than Linux?

我正在開發一個使用 SDL2 呈現的單線程圖形程序 有關較小示例,請參見結尾。

它可以在舊的 Linux 機器和不太舊的 Mac 上運行。 Linux 計算機有 1.60GHz 的處理器,而 Mac 的處理器是 2.2GHz。 Linux 上的 SDL 版本是 2.0.8,而 Mac 上的 SDL 版本是 2.0.10。 在兩台計算機上,我使用優化標志-O3-flto使用clang++進行編譯。 我用./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") ,我通過調用SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl")來完成此SDL_GetRendererInfo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM