使用SDL2 RenderDraw功能与Emscripten(Using SDL2 RenderDr

2019-10-22 10:07发布

我一直在努力使用的端口是emscripten SDL2使用图形到网络的简单的C程序。 我通过示例程序进行扫描,但无法找到一个即将使用SDL_RenderDrawPoint,SDL_RenderDrawLine,或SDL_RenderDrawRect屏幕。 这些功能在我的程序的窗口/ Ubuntu的版本,但不是在emscripten版本。 我只看到绘有颜色清除屏幕,但没有被它吸引了。

下面是展示问题的示例代码。

#include <stdio.h>
#include <SDL2/SDL.h>
#include <assert.h>
#ifdef __EMSCRIPTEN__
#include <emscripten.h>
#endif

int main(int argc, char* argv[])
{
    // setup
    SDL_Window * window;
    SDL_Renderer * renderer;
    assert(SDL_Init(SDL_INIT_VIDEO) == 0);
    SDL_CreateWindowAndRenderer(640, 320, 0, &window, &renderer);

    // clear screen with red color
    SDL_SetRenderDrawColor(renderer, 200, 0, 0, 255);
    SDL_RenderClear(renderer);

    // draw green line across screen
    SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
    SDL_RenderDrawLine(renderer, 0, 0, 640, 320);
    SDL_RenderPresent(renderer);

    SDL_Delay(2000);

    // free resources
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 0;
}

我保存这段代码的main.c然后跑:

emcc main.c -s USE_SDL=2 -o a.html

在Windows / Ubuntu的,我看到这一点:

在Emscripten器(Chrome)我看到这一点:

这是一个错误,还是我做错了什么?

Answer 1:

随着emscripten你几乎总是必须使用主循环的方法。 使用SDL_Delay或睡觉的任何其他形式不好,因为它与普通的PC目标的工作方式不同(更像自旋锁比睡眠)。 你应该使用这样的:

#include <stdio.h>
#include <SDL2/SDL.h>
#include <assert.h>
#ifdef __EMSCRIPTEN__
#include <emscripten.h>
#endif

SDL_Window * window;
SDL_Renderer * renderer;

void render_func(void) {
    SDL_SetRenderDrawColor(renderer, 200, 0, 0, 255);
    SDL_RenderClear(renderer);

    SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
    SDL_RenderDrawLine(renderer, 0, 0, 640, 320);
    SDL_RenderPresent(renderer);

#ifdef EMSCRIPTEN
    emscripten_cancel_main_loop();
#endif
}

int main(int argc, char* argv[])
{
    assert(SDL_Init(SDL_INIT_VIDEO) == 0);
    SDL_CreateWindowAndRenderer(640, 320, 0, &window, &renderer);

#ifdef EMSCRIPTEN
    emscripten_set_main_loop(render_func, 60, 1);
#else
    render_func();
#endif

    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 0;
}


文章来源: Using SDL2 RenderDraw functions with Emscripten