在 Emscripten 中使用 SDL2 RenderDraw 函数
Using SDL2 RenderDraw functions with Emscripten
我一直在努力将一个使用 SDL2 的简单 C 程序移植到使用 emscripten 的网络上。我扫描了示例程序,但无法找到使用 SDL_RenderDrawPoint、SDL_RenderDrawLine 或 SDL_RenderDrawRect 绘制到屏幕上的程序。这些函数适用于我程序的 windows/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) 上,我看到了这个:
这是一个错误,还是我做错了什么?
对于 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;
}
我一直在努力将一个使用 SDL2 的简单 C 程序移植到使用 emscripten 的网络上。我扫描了示例程序,但无法找到使用 SDL_RenderDrawPoint、SDL_RenderDrawLine 或 SDL_RenderDrawRect 绘制到屏幕上的程序。这些函数适用于我程序的 windows/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) 上,我看到了这个:
这是一个错误,还是我做错了什么?
对于 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;
}