窗口挂起和冻结[SDL 2]

时间:2017-03-30 22:14:53

标签: c++ windows sdl-2

我有一个文本文件,其中包含有关在我正在制作的游戏中放置切片的位置的信息,访问此信息的最快方法是使用for循环。但每当我使用for循环来获取所有信息时,它冻结程序大约12秒,在那12个我不能移动窗口,渲染器上没有任何更新/被绘制,然后当我点击窗口时它打破并说“窗口名称(无响应)”。我尝试使用while循环,但它仍然做同样的事情。

如何在没有程序冻结/挂起的情况下循环更大的数字(级别中有大约4,000个图块)?我只是使用SDL 2,没有涉及OpenGL。

    int tiles = 4000;
    int x[4000];
    int y[4000];
    tile obj[4000];

    for(int i = 0; i < tiles; i++)
    {


    x[i] = txt.x;
    y[i] = txt.y;

    obj[i].Load(x[i], y[i]);
    obj[i].Add();

    SDL_RenderClear(ren);
    LoadScreen();
    SDL_RenderPresent(ren);
    }

感谢。

1 个答案:

答案 0 :(得分:0)

您需要创建另一个帖子。

在开始游戏之前等待加载所有数据是个好主意,因此在加载过程中,您不需要渲染任何内容。即使采用这种方法,最好使用另一个线程,不要让“UI线程”忙。在加载时,除了一个将停止加载线程的取消按钮外,您的UI将被禁用。

#include <process.h>

bool bReady;

void LoadTiles(void* pArg)
{
    // Load Data here
    *((int*)pArg) = 0;
    ///////////////////

    bReady = true;
}

void main()
{
    btnStart.SetEnabled(false);
    bReady = false;

    int iTarget;
    uintptr_t hLoadingThread = _beginthread(LoadTiles, 0, &iTarget);

    while (true) // usually you pick a message here
    {
        if (bReady)
            btnStart.SetEnabled(true);
    }
}

这只是一个非常简单的例子,多线程需要大量的工作和学习!