【问题标题】:SDL2 Rendering (flickering)SDL2 渲染(闪烁)
【发布时间】:2017-11-06 12:35:01
【问题描述】:

我在使用 SDL2 渲染纹理时遇到问题。在我的程序中,有一堆像素在屏幕上移动,但是它们明显闪烁。这是我的代码:

来源.cpp

 frameStart = SDL_GetTicks();

    screen.update();

    // Makes the screen black
    for (int x = 0; x < Screen::SCREEN_WIDTH; x++)
    {
        for (int y = 0; y < Screen::SCREEN_HEIGHT; y++) {
            screen.setPixel(x, y, 0, 0, 0);
        }
    }

    // Draw + Update people (Code should be separated and moved)
    for (Person &p : people) {
        if (p.isAlive == true) {
            p.Update(p);
            cout << p.x << ", " << p.y << endl;
            screen.setPixel(p.x, p.y, 255, 0, 0);
        }
        else {
            screen.setPixel(p.x, p.y, 0, 0, 0);
        }
    }



    // Manage events
    if (screen.processEvents() == false) {
        break;
    }

    frameTime = SDL_GetTicks() - frameStart;

    if (frameDelay > frameTime) {
        SDL_Delay(frameDelay - frameTime);
    }
}

Screen.update 点在这里:

 void Screen::update() {

    SDL_UpdateTexture(m_texture, NULL, m_buffer, SCREEN_WIDTH * sizeof(Uint32) );       
    SDL_RenderCopy(m_renderer, m_texture, NULL, NULL);
    SDL_RenderPresent(m_renderer);
    SDL_RenderClear(m_renderer);
}

我的渲染器和纹理设置如下:

 m_renderer = SDL_CreateRenderer(m_window, -1, SDL_RENDERER_PRESENTVSYNC);
    m_texture = SDL_CreateTexture(m_renderer, SDL_PIXELFORMAT_RGBA8888,
        SDL_TEXTUREACCESS_STATIC, SCREEN_WIDTH, SCREEN_HEIGHT);

我已经弄乱了渲染器和纹理的标志,但还没有找到阻止闪烁的解决方案。任何帮助将不胜感激。

【问题讨论】:

  • screen.setPixel 代码是什么?为什么将纹理设置为static 但在每一帧都更新它?什么样的闪烁?你得到的帧率是多少?

标签: c++ sdl-2


【解决方案1】:

你应该遵循的顺序是:

  • 清除
  • 渲染
  • 呈现呈现
  • 等等
  • 重复。

您所做的基本上是,正确地渲染和清除。 如果你这样做可能会很好

frameStart = SDL_GetTicks();

SDL_RenderClear(m_renderer);

/* Do you rendering */

/*Manage your events*/


SDL_RenderPresent(m_renderer);


frameTime = SDL_GetTicks() - frameStart;

if (frameDelay > frameTime) {
    SDL_Delay(frameDelay - frameTime);
}

还有关于渲染像素,在清除纹理时,你应该使用更快的 memset。但你的方法仍然有效

memset(pixels,0,h*pitch);

【讨论】:

  • @HolyBlackCat 它是正确的。 memset(ptr, value, size);。反之,将 0 字节设置为值 h*pitch。换句话说,它根本不会做任何事情。
  • @JamesM.Lay 是的,你是对的。我的错。
  • @HolyBlackCat 不用担心。 Tbh 我认为按照您的方式放置 args 会更有意义。
猜你喜欢
  • 1970-01-01
  • 2018-08-04
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2015-06-05
  • 2010-10-02
相关资源
最近更新 更多