SDL文本呈现访问冲突

时间:2015-01-13 21:04:49

标签: sdl access-violation sdl-2 text-rendering

我正在使用SDL 2.0和C ++进行2D图形处理,压缩图像格式加载,声音回放等。请考虑以下代码:

int main(int argc, char *args[])
{
    SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
    SDL_Window *pWindow = SDL_CreateWindow("Access Violation", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 1920, 1080, SDL_WINDOW_FULLSCREEN);
    SDL_Renderer *pRenderer = SDL_CreateRenderer(pWindow, -1, SDL_RENDERER_ACCELERATED);

    Mix_Init(0);
    Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048);
    Mix_Music *pMusic = Mix_LoadMUS("music.wav");


    TTF_Init();
    TTF_Font *pFont = TTF_OpenFont("font.ttf", 28);

    bool quit = false;
    SDL_Event ev;
    while(!quit)
    {
        while(SDL_PollEvent(&ev) != 0)
        {
            switch(ev.type)
            {
            case SDL_QUIT:
                quit = true;
                break;
            }
        }

        SDL_SetRenderDrawColor(pRenderer, 255, 255, 255, 255);
        SDL_RenderClear(pRenderer);

        for(int i = 0; i < 864; i++)
        {
            SDL_Color clr = { 0, 0, 0 };
            SDL_Surface *pSurface = TTF_RenderText_Solid(pFont, "Hey!", clr);
            SDL_Texture *pTexture = SDL_CreateTextureFromSurface(pRenderer, pSurface);
            SDL_Rect dstrect = { (int)(i/27) * 60, (i%27)*40, pSurface->w, pSurface->h };
            SDL_RenderCopy(pRenderer, pTexture, 0, &dstrect);
            SDL_DestroyTexture(pTexture);
            SDL_FreeSurface(pSurface);
        }

        SDL_RenderPresent(pRenderer);
    }


    TTF_CloseFont(pFont);
    Mix_FreeMusic(pMusic);

    SDL_DestroyRenderer(pRenderer);
    SDL_DestroyWindow(pWindow);

    Mix_CloseAudio();
    Mix_Quit();

    IMG_Quit();
    TTF_Quit();
    SDL_Quit();
    return 0;
}

这基本上做的是它只是初始化SDL,加载音乐,加载字体,并用文本连续填充整个屏幕。细

但是!

如果我添加此行

...
SDL_Event ev;

Mix_PlayMusic(pMusic, 0);

while(!quit)
...

就在这里,文本在循环中重绘

for(int i = 0; i < 864; i++)
{
...
}

开始出现不可预测的行为。其中一个SDL的功能将在一段时间后 - 在启动后1到30秒之间发出访问冲突。另一方面,我是否会省略文本重绘,音乐播放正常。

有什么想法吗?当然,会检查所有返回值。由于代码清晰,我省略了检查。

编辑:错别字。

0 个答案:

没有答案