在 OS X 上,为什么 SDL2_image 的 showimage 示例需要在 while 循环中执行 RenderCopy() ?

2024-02-15

为了快速参考,SDL2_image 库中的 showimage.c 示例代码具有以下代码:

    /* Show the window */
    SDL_SetWindowTitle(window, argv[i]);
    SDL_SetWindowSize(window, w, h);
    SDL_ShowWindow(window);

    done = 0;
    while ( ! done ) {
        while ( SDL_PollEvent(&event) ) {
            /* some event handling code... */
        }
        /* Draw a background pattern in case the image has transparency */
        draw_background(renderer, w, h);

        /* Display the image */
        SDL_RenderCopy(renderer, texture, NULL, NULL);
        SDL_RenderPresent(renderer);

        SDL_Delay(100);
    }
    SDL_DestroyTexture(texture);
}

SDL_RenderCopy() and SDL_RenderPresent()被称为在while(!done) block.

由于它只加载一张图像,我认为应该创建纹理并将其渲染到帧缓冲区一次,然后将其留在那里。所以SDL_RenderCopy() and SDL_RenderPresent()应该只调用一次:

    /* Show the window */
    SDL_SetWindowTitle(window, argv[i]);
    SDL_SetWindowSize(window, w, h);
    SDL_ShowWindow(window);

    /* Draw a background pattern in case the image has transparency */
    draw_background(renderer, w, h);

    /* Display the image */
    SDL_RenderCopy(renderer, texture, NULL, NULL);
    SDL_RenderPresent(renderer);

    done = 0;
    while ( ! done ) {
        while ( SDL_PollEvent(&event) ) {
            /* some event handling code... */
        }

        SDL_Delay(100);
    }
    SDL_DestroyTexture(texture);
}

在我的 ubuntu 12.04 上,图像按照我的预期显示。然而,在我使用 OSX 10.9.2 的 MBA 上,它是全黑的。

为什么有区别?


示例代码只是演示了呈现到屏幕的最便携的方式。您的应用程序不一定控制操作系统是否使用双(或三)缓冲,因此您不能依赖一致地呈现给用户的单个渲染。此外,在某些情况下,默认帧缓冲区内容可能会丢失/更改。

换句话说,你should渲染每一帧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 OS X 上,为什么 SDL2_image 的 showimage 示例需要在 while 循环中执行 RenderCopy() ? 的相关文章

随机推荐