sdl - 在 Emscripten 中使用 SDL2 RenderDraw 函数

标签 sdl 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 上,我看到了这个: enter image description here

在 Emscripten(Chrome)上我看到了这个: enter image description here

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

最佳答案

对于 emscripten,您几乎总是必须使用其主循环方法。使用 SDL_Delay 或任何其他形式的 sleep 是不好的,因为它与普通 PC 目标的工作方式不同(更像是自旋锁而不是 sleep )。你应该使用类似的东西:

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

关于sdl - 在 Emscripten 中使用 SDL2 RenderDraw 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29335510/

相关文章:

c - SDL2 - 纹理和频繁变化的图片

c++ - SDL 窗口在启动时关闭并返回 0

video - 以编程方式将 Sdd 水印到 YUV 视频数据 (SDL_Overlay)

c++ - 使用 CMake 时 Emscripten 找不到全局路径

c++ - 面向WASM的C++代码(具有dlib和opencv)的编译面临的问题

c++ - SDL:IDE/镜像问题

c++ - 没有任何 vbo 输入的顶点着色器输出

macos - 在 OSX 10.15 上安装和运行 emscripten

javascript - WebAssembly 包括 OpenCV

emscripten - 是否可以在 emcc 编译的 wasm 代码中导入 Javascript 函数?