c++ - SDL2 渲染器给我带来了问题

标签 c++ sdl-2 lag renderer

我正在关注 this tutorial教授如何使用 SDL2,最终目标是以更有趣和互动的方式学习 C++。

为此,我只需要能够画线、多边形和圆。

因此,在阅读了解释如何在屏幕上创建窗口的第 1 部分和介绍事件处理的第 3 部分之后,我继续阅读分别解释如何创建渲染器和绘制矩形的第 7 部分和第 8 部分屏幕上。这是我到目前为止得到的代码(它与教程中的代码不完全相同:我引入了一个结构来传递 SDL 对象并删除了所有令人困惑的错误处理):

#include <SDL2/SDL.h>

//screen dimensions costants
#define SCREEN_WIDTH 540
#define SCREEN_HEIGHT 960

//data structure holding the objects needed to create a window and draw on it
struct interface {
    SDL_Window * window = NULL;
    SDL_Surface * surface = NULL;
    SDL_Renderer * renderer = NULL;
};

//function which inits the sdl and creates an interface object
interface init() {
    interface screen;
    SDL_Init(SDL_INIT_VIDEO);
    screen.window = SDL_CreateWindow("", 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
    screen.surface = SDL_GetWindowSurface(screen.window);
    screen.renderer = SDL_CreateRenderer(screen.window, -1, SDL_RENDERER_ACCELERATED);
    return screen;
}

//function to free the memory and close the sdl application
void close(interface screen) {
    SDL_DestroyRenderer(screen.renderer);
    SDL_DestroyWindow(screen.window);
    screen.renderer = NULL;
    screen.window = NULL;
    SDL_Quit();
}

int main(int argc, char* args[]) {

    //start the application
    interface screen = init();

    //setup for event handling
    bool quit = false;
    SDL_Event event;

    //the shape to render
    SDL_Rect fillRect = { SCREEN_WIDTH / 4, SCREEN_HEIGHT / 4, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 };

    //main loop which first handles events
    while (!quit) {
        while (SDL_PollEvent(&event) != 0) {
            if (event.type == SDL_QUIT)
                quit = true;
        }
        //should draw a red rectangle on the screen
        SDL_SetRenderDrawColor(screen.renderer, 0xFF, 0xFF, 0xFF, 0xFF);
        SDL_RenderClear(screen.renderer);
        SDL_SetRenderDrawColor(screen.renderer, 0xFF, 0x00, 0x00, 0xFF);
        SDL_RenderFillRect(screen.renderer, &fillRect);
    }

    //End the application
    close(screen);
    return 0;
}

问题是,程序实际上没有在屏幕上绘制任何内容(屏幕仍然是黑色),如果我删除行 screen.surface = SDL_GetWindowSurface(screen.window);它也开始以一种我什至难以退出应用程序的方式开始滞后。

请注意,我正在使用 C4droid 和适用于 C4droid 的 SDL 插件在 Android 上进行编程。

为什么会这样?我做错了什么?

编辑 通过重命名 close 解决了问题至 end并通过调用 SDL_RenderPresent(screen.renderer);在主循环的末尾。使用此设置,屏幕表面必须删除,否则程序将不会绘制任何内容。

感谢@keltar 和@Wutipong Wongsakuldej 在评论中回答问题

最佳答案

Screenshot

首先,我在 Windows (MSYS2) 而不是 Android 上测试了代码,因为我目前没有安装 AIDE。

基本上我在主循环中添加了 2 行代码:

//main loop which first handles events
while (!quit) {
    while (SDL_PollEvent(&event) != 0) {
        if (event.type == SDL_QUIT)
            quit = true;
    }
    //should draw a red rectangle on the screen
    SDL_SetRenderDrawColor(screen.renderer, 0xFF, 0xFF, 0xFF, 0xFF);
    SDL_RenderClear(screen.renderer);
    SDL_SetRenderDrawColor(screen.renderer, 0xFF, 0x00, 0x00, 0xFF);
    SDL_RenderFillRect(screen.renderer, &fillRect);
    /** below lines are added **/
    SDL_RenderPresent(screen.renderer);
    SDL_Delay(0);
}
  • SDL_RenderPresent 将您目前渲染的任何内容绘制到屏幕上。这使输出显示出来。

  • SDL_Delay() 添加这个是为了将 cpu 时间返回给操作系统。如果没有这个,您的应用程序可能会变得无响应,并且在某些操作系统(尤其是非常旧的操作系统)中 cpu 利用率将达到 100%(在一个内核上)。我不知道这在 Android 中是否需要。试一试。

关于c++ - SDL2 渲染器给我带来了问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37962627/

相关文章:

c++ - 如何在模板类中使用 std::map 迭代器?

c++ - 检查两条三次贝塞尔曲线是否相交

java - 更新 RecycleView 中的 CardView 项目时遇到延迟

c# - 多线程代码中频繁出现滞后峰值

css - 为什么我网站的背景图片 gif 会占用我计算机的所有 CPU 时间?

c++ - 获取字符串的最后 9 个字符

c++ - 初始化 QByteArray 避免 [-Wnarrowing]

c++ - 绘图线在 SDL2 C++ 中闪烁。如何修改我的游戏循环?

macos - SDL-2:在 OS X 中运行 native cocoa 应用程序时出现问题

sdl - SDL_Init 究竟做了什么?