问题
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