Mix_PlayMusic导致内存损坏

时间:2017-06-03 01:16:03

标签: c++ sdl sdl-2 memory-corruption

我一直在处理一个我一直在努力的游戏,一旦我添加了音乐,它开始在我常用的纹理加载代码中进行分段,在它开始播放后的5-30秒之间。我能想到的最好的是它是某种内存损坏。经过一周的尝试调试失败(尝试像GFlags pageheap这样的事情)后,我设法将其剪切为以下代码,但仍然存在问题。

有时这段会在callstack经过SDL2_mixer.dll时发生,但主要是因为渲染器处于错误状态而发生在SDL_CreateTextureFromSurface调用中。 numTextures在我的机器上达到15000-40000之间(Windows 10 x64,程序编译为x86)。

我的直觉告诉我,我的环境或代码存在问题,而不是SDL本身的问题,但我很茫然。任何帮助或见解将不胜感激。

#include <SDL_image.h>
#include <SDL_mixer.h>
#include <cassert>

int main(int argc, char* argv[])
{
    assert(SDL_Init(SDL_INIT_EVERYTHING) == 0);

    SDL_Window * pWindow_ = SDL_CreateWindow(
        "", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0x0);
    assert(pWindow_ != nullptr);

    SDL_Renderer * pRenderer_ = SDL_CreateRenderer(pWindow_, -1, 0);
    assert(pRenderer_ != nullptr);

    assert(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 512) == 0);

    Mix_Music * pMusic = Mix_LoadMUS("sounds/tranquility.wav");
    assert(pMusic != nullptr);
    assert(Mix_PlayMusic(pMusic, -1) == 0);

    SDL_Surface * pSurface = IMG_Load("images/caution.png");
    assert(pSurface != nullptr);
    SDL_Texture * pTexture = SDL_CreateTextureFromSurface(pRenderer_, pSurface);
    assert(pTexture != nullptr);

    int numTextures = 0;
    while (true)
    {
        numTextures += 10;
        assert(pTexture != nullptr);
        SDL_DestroyTexture(pTexture);
        pTexture = SDL_CreateTextureFromSurface(pRenderer_, pSurface);
        assert(pTexture != nullptr);
    }
}

1 个答案:

答案 0 :(得分:1)

解决方案原来是更新到最新版本的SDL(2.0.3 - > 2.0.5)。

我开始使用引擎代码库开发有问题的项目,大约2年前我将SDL 1.2从2.0升级到2.0,最新版本为2.0.3。

当我最近添加声音和音乐时,我使用了最新的SDL_mixer,并且没想到将SDL更新到最新的2.0.5。

获取SDL的最新开发和运行时库(以及SDL_imageSDL_mixer以获得良好衡量标准)后,问题就消失了。

我对此并不完全满意。如果较新的SDL_mixer与较旧的SDL成功链接,如果它们不兼容,我会感到非常惊讶。此外,我找不到任何在线资源,表明存在任何兼容性问题。因此,我有一种不安的感觉,可能会有其他事情发生,这是由升级偶然解决的。