SDL2 渲染器给我带来了问题
SDL2 renderer is giving me problems
我正在关注 this tutorial,它教授如何使用 SDL2,最终目标是以更有趣和互动的方式学习 C++。
为此,我只需要能够画线、多边形和圆。
因此,在阅读了解释如何在屏幕上创建 window 的第 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);
它也会开始以我什至发现的方式滞后很多很难退出应用程序。
请注意,我在 Android 上使用 C4droid 和 C4droid 的 SDL 插件进行编程。
为什么会这样?我做错了什么?
EDIT 通过将 close
重命名为 end
并在主循环末尾包含对 SDL_RenderPresent(screen.renderer);
的调用来解决问题。使用此设置,必须删除屏幕表面 ,否则程序将不会绘制任何内容。
感谢@keltar 和@Wutipong Wongsakuldej 在评论中回答问题
首先,我在 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 时间回到 os。如果没有这个,您的应用程序可能会变得无响应,并且 cpu 在某些操作系统(尤其是非常旧的操作系统)中的利用率将是 100%(在一个内核上)。我不知道 Android 是否需要这样做。试一试。
我正在关注 this tutorial,它教授如何使用 SDL2,最终目标是以更有趣和互动的方式学习 C++。
为此,我只需要能够画线、多边形和圆。
因此,在阅读了解释如何在屏幕上创建 window 的第 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);
它也会开始以我什至发现的方式滞后很多很难退出应用程序。
请注意,我在 Android 上使用 C4droid 和 C4droid 的 SDL 插件进行编程。
为什么会这样?我做错了什么?
EDIT 通过将 close
重命名为 end
并在主循环末尾包含对 SDL_RenderPresent(screen.renderer);
的调用来解决问题。使用此设置,必须删除屏幕表面 ,否则程序将不会绘制任何内容。
感谢@keltar 和@Wutipong Wongsakuldej 在评论中回答问题
首先,我在 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 时间回到 os。如果没有这个,您的应用程序可能会变得无响应,并且 cpu 在某些操作系统(尤其是非常旧的操作系统)中的利用率将是 100%(在一个内核上)。我不知道 Android 是否需要这样做。试一试。