SDL2渲染器给我带来了问题

时间:2016-06-22 08:33:05

标签: 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; } ,它也开始以一种我甚至难以找到的方式滞后退出申请。

请注意,我使用C4droid进行Android编程,使用C4droid的SDL插件。

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

编辑通过将screen.surface = SDL_GetWindowSurface(screen.window);重命名为close并在主循环结束时调用end来解决问题。使用此设置时,必须删除屏幕表面 ,否则程序将无法绘制任何内容。

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

1 个答案:

答案 0 :(得分:1)

Screenshot

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

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

//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中是否需要这样做。试一试。