小编Zek*_*eke的帖子

构建和同步多线程游戏循环

我遇到了一个关于游戏循环线程安全性的温和难题.我下面的内容是3个线程(包括主线程),它们可以协同工作.一个用于事件管理(主线程),一个用于逻辑,一个用于渲染.所有这3个线程都存在于它们自己的类中,如下所示.在基本测试中,结构可以正常工作.该系统使用SFML并使用OpenGL进行渲染.

int main(){
    Gamestate gs;
    EventManager em(&gs);
    LogicManager lm(&gs);
    Renderer renderer(&gs);

    lm.start();
    renderer.start();
    em.eventLoop();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,正如您可能已经注意到我有一个"Gamestate"类,它可以充当线程之间需要共享的所有资源的容器(主要是LogicManager作为编写器,Renderer作为读者.事件管理器主要是仅适用于橱窗活动).我的问题是:(1和2是最重要的)

1)这是处理事情的好方法吗?意义是使用"全局"Gamestate类是个好主意吗?有更好的方法吗?

2)我的目的是让Gamestate在getter/setter中有互斥,除了那些不能用于读取因为我仍然无法在它仍被锁定时返回该对象,这意味着我必须将同步放在getters之外/ setters并将互斥体公之于众.这也意味着我将为所有不同的资源提供大量的互斥量.解决这个问题最优雅的方法是什么?

3)我让所有线程访问"bool run"以检查是否继续其循环

while(gs->run){
....
}
Run Code Online (Sandbox Code Playgroud)

如果我在EventManager中收到退出消息,则run设置为false.我是否需要同步该变量?我会把它设置为不稳定吗?

4)是否经常取消引用指针等对性能产生影响?例如gs-> objects-> entitylist.at(2) - > move(); 做所有那些' - >'和'.' 导致任何重大放缓?

c++ multithreading thread-safety

5
推荐指数
2
解决办法
1922
查看次数

使用Cmake编译库

我正在尝试将一个体素库PolyVox包含到我的项目中.但是,库下载不会为您提供预编译的头文件,而是需要Cmake.这不会是一个大问题,除了他们关于这个主题的教程非常不完整.我之前从未使用过Cmake,并且搜索没有解决问题.

我用Visual Studio 10编译器运行了Cmake,它生成了一堆Visual Studio项目.我将这些项目编译成2个库,并将库目录包含在项目的属性中.我还将所有PolyVox的头文件放在Visual Studio所知的目录中.在尝试编译我的项目时,我得到链接器错误,例如:

1>Gamestate.obj : error LNK2019: unresolved external symbol "public: __thiscall PolyVox::Region::Region(class PolyVox::Vector<3,int> const &,class PolyVox::Vector<3,int> const &)" (??0Region@PolyVox@@QAE@ABV?$Vector@$02H@1@0@Z) referenced in function "public: __thiscall Gamestate::Gamestate(void)" (??0Gamestate@@QAE@XZ)
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释如何使用Cmake将PolyVox正确地包含在我的代码中吗?

c++ linker cmake voxel visual-studio

1
推荐指数
1
解决办法
980
查看次数