Using SDL2 RenderDraw functions with Emscripten

China☆狼群 提交于 2020-01-15 08:11:40

问题


I've been struggling to port a simple C program that uses SDL2 for graphics to the web using emscripten. I scanned through example programs but was unable to find one that draws to the screen using SDL_RenderDrawPoint, SDL_RenderDrawLine, or SDL_RenderDrawRect. These functions work on the windows/ubuntu versions of my program, but not on the emscripten version. I simply see the screen painted with the cleared color, but nothing drawn to it.

Here's sample code that showcases the issue.

#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;
}

I saved this code to main.c then ran:

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

On Windows/Ubuntu, I see this:

On Emscripten (Chrome) I see this:

Is this a bug, or am I doing something wrong?


回答1:


With emscripten you almost always have to use its main loop approach. Using SDL_Delay or any other form of sleeping is bad because it works differently from ordinary PC targets (more like spinlock than sleep). You should use something like:

#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;
}


来源:https://stackoverflow.com/questions/29335510/using-sdl2-renderdraw-functions-with-emscripten

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!