-1

所以我有一个单线程游戏引擎类,它有单独的输入、更新和渲染函数,我刚刚开始学习使用美妙的 boost 库(asio 和线程组件)。而且我正在考虑将我的更新渲染函数分离到单独的线程中(也许也将输入更新函数彼此分离)。当然这些函数有时会访问内存中的相同位置,所以我决定使用 boost/thread 的 strand 功能来防止它们同时执行。

现在我的主要游戏循环如下所示:

void SDLEngine::Start()
{
    int update_time=0;
    quit=false;
    while(!quit)
    {
        update_time=SDL_GetTicks();
        DoInput();//get user input and alter data based on it
        DoUpdate();//update game data once per loop
        if(!minimized)
            DoRender();//render graphics to screen
        update_time=SDL_GetTicks()-update_time;
        SDL_Delay(max(0,target_time-update_time));//insert delay to run at desired FPS
    }
}

如果我使用单独的线程,它看起来像这样:

void SDLEngine::Start()
{
    boost::asio::io_service io;
    boost::asio::strand strand_;
    boost::asio::deadline_timer input(io,boost::posix_time::milliseconds(16));
    boost::asio::deadline_timer update(io,boost::posix_time::milliseconds(16));
    boost::asio::deadline_timer render(io,boost::posix_time::milliseconds(16));
    //
    input.async_wait(strand_.wrap(boost::bind(&SDLEngine::DoInput,this)));
    update.async_wait(strand_.wrap(boost::bind(&SDLEngine::DoUpdate,this)));
    render.async_wait(strand_.wrap(boost::bind(&SDLEngine::DoRender,this)));
    //
    io.run();
}

如您所见,在循环开始之前:输入->更新->渲染->延迟->重复

每一个都一个接一个地运行。如果我使用多线程,我将不得不使用,这样更新和渲染就不会同时运行。那么,在这里使用多线程仍然值得吗?他们基本上仍然会在不同的内核中一次运行一个。我基本上没有多线程应用程序的经验,因此不胜感激。

哦,还有一件事:我正在使用 OpenGL 进行渲染。像这样的多线程会以任何方式影响 OpenGL 的渲染方式吗?

4

1 回答 1

0

您对所有处理程序使用相同的,因此根本没有多线程。此外,您的deadline_timer在范围内Start(),您不会在任何地方传递它。在这种情况下,您将无法从处理程序重新启动它(注意它不是“间隔”计时器,它只是一个“一次性计时器”)。

我认为这个“改造”没有任何意义,因为在这个例子中你根本没有从asio和/或线程中获得任何好处。

这些方法(输入、更新、渲染)太大了,它们做了很多事情,你不能在没有阻塞的情况下调用它们。很难准确地说,因为我不知道游戏是什么以及它是如何工作的,但我更愿意执行以下步骤:

  • 尝试修改网络 i/o 使其完全异步
  • 尝试使用所有 CPU 内核

关于您尝试过的内容:我认为如果您在代码中搜索真正可以立即并行运行的操作,这是可能的。例如:如果你为每个 NPC 计算一些不依赖于其他角色的东西,你可以io_service.post()每个人都使用当前正在运行io_service.run()的所有线程。所以你的程序保持单线程,但你可以在一些“大”操作上使用,比如说,7个其他线程

于 2012-11-30T05:21:25.373 回答