所以我有一个单线程游戏引擎类,它有单独的输入、更新和渲染函数,我刚刚开始学习使用美妙的 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 的渲染方式吗?