【问题标题】:SDL2 unable to unlock surfaceSDL2 无法解锁表面
【发布时间】:2014-03-18 11:30:30
【问题描述】:

我最近一直在写一些 SDL2,今天我重写了我的代码的基础,使其更加结构化和更易于使用。

我遇到的问题是在尝试对 sprite 表面进行 blit 时,它给了我 SDL 错误 Surfaces must not be locked during blit,这似乎是合理的,所以我在 SDL_BlitSurface 之前的 blit 函数的开头添加了 SDL_UnlockSurface 但仍然返回同样的错误。 因为我在文档中看到SDL_UnlockSurface 是一个空洞,所以我不知道它是否成功,但由于它不是多线程的,所以在我进行 blitting 时没有任何东西可以强制锁定它(而且它只是在无论如何都要启动应用程序)。

这是 blit 函数

bool Sprite::blit(SDL_Surface* targetSurface){
    SDL_UnlockSurface(this->surface);
    int success = SDL_BlitSurface( this->surface, NULL, targetSurface, NULL );
    if ( success != 0){
        printf( "Unable to blit surface! SDL Error: %s\n"m SDL_GetError() );
        return false;
        }
    return true;
}

提前致谢!

【问题讨论】:

    标签: c++ sdl-2


    【解决方案1】:

    锁被计算在内。如果您将表面锁定两次,则必须将其解锁两次。最好避免这种方案 - 锁定表面在其工作完成后应该解锁它的相同功能。

    您可以查看 surface->locked 变量,它是锁计数,但它不包含在文档中,因此您不能依赖此名称 - 它可能会在未来的版本中更改。

    【讨论】:

    • 感谢您解决这个问题,不知道。仍然没有意义的是,我每帧都解锁它,而且我从来没有在代码中写过它应该首先被锁定的任何地方。我在整个应用程序中只使用了一个精灵,它的表面只用 SDL_LoadBMP 绘制一次,它返回它是成功的,所以它并没有真正解决问题
    • 我刚查了锁数,锁数很高。奇怪的是,当应用程序聚焦时锁定计数从 512 跳到 1024,而当应用程序不聚焦时又跳回到 512,有什么可能改变呢?这是正确的答案,我只需要更深入地研究我的代码,谢谢!
    • 我所能推荐的就是在调试器中运行并在 LockSurface 中设置断点。不幸的是,我对 SDL2 绘图没有太多经验 - 使用 SDL 1.2 很长一段时间,然后切换到 opengl 绘图。 SDL2 更侧重于纹理和渲染器,也许禁止直接在屏幕表面上进行 blit。
    猜你喜欢
    • 1970-01-01
    • 2016-07-24
    • 2017-04-12
    • 2014-01-14
    • 2016-06-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    相关资源
    最近更新 更多