在Emscripten中使用SDL2 RenderDraw函数 [英] Using SDL2 RenderDraw functions with Emscripten

查看:80
本文介绍了在Emscripten中使用SDL2 RenderDraw函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在努力将使用SDL2图形的简单C程序通过emscripten移植到Web.我浏览了示例程序,但找不到使用SDL_RenderDrawPoint,SDL_RenderDrawLine或SDL_RenderDrawRect绘制到屏幕上的程序.这些功能在我的程序的Windows/ubuntu版本上有效,但在emscripten版本上无效.我只是看到屏幕上涂有清除的颜色,但没有画任何东西.

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

我将此代码保存到main.c中,然后运行:

I saved this code to main.c then ran:

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

在Windows/Ubuntu上,我看到以下内容:

On Windows/Ubuntu, I see this:

在Emscripten(Chrome)上,我看到以下内容:

On Emscripten (Chrome) I see this:

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

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

推荐答案

使用emscripten,您几乎总是必须使用其主循环方法.使用 SDL_Delay 或任何其他形式的睡眠都是不好的,因为它与普通PC目标的工作方式不同(更像是自旋锁而不是睡眠).您应该使用类似这样的内容:

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

这篇关于在Emscripten中使用SDL2 RenderDraw函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆