我目前正在开展一个项目,我们尝试使用Microsoft Kinect开发视频游戏,使用像PAHANTOM这样的触觉反馈设备,以及针对不同3D设备的立体渲染。在当前情况下,一切都在单个线程内运行,并且您可以想象应用程序缺乏性能,因为触觉设备需要以至少1000 Hz运行其控制回路。我在这里要做的是创建4个线程,一个用于使用Ogre3D进行渲染,一个用于碰撞检测,一个用于触觉,最后一个用于管理Kinect收集的数据。
每个部分都有自己的管理器类,如KinectManager,HapticManager等。因为我们使用的是Ogre3D,所以我们有一个名为MainApplication
的类,它继承自BaseApplication
,其中包含所有必需的函数,如{{1} },setup()
等已实施。在configure()
内调用函数MainApplication
,其中createScene()
已创建:
ColisionManager
void MainApplication::createScene()
{
// Initialize CollisionManager
CollisionManager cManager;
cManager.run();
// Set the scene's ambient light
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5f, 0.5f, 0.5f));
// Create a Light and set its position
Ogre::Light* light = mSceneMgr->createLight("MainLight");
light->setPosition(20.0f, 80.0f, 50.0f);
// Haptic indicator
Ogre::Entity* hapticJoystick = mSceneMgr->createEntity("hapticPos", "Icosphere.mesh");
hapticNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("hapticPos");
hapticNode->attachObject(hapticJoystick);
}
看起来像这样:
CollisionManager.h
#ifndef __COLLISIONMANAGER_H_
#define __COLLISIONMANAGER_H_
#include "HapticManager.h"
#include "KinectManager.h"
#include <boost/bind.hpp>
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/shared_ptr.hpp>
#include <OgreManualObject.h>
#include <OgreSceneManager.h>
bool cManagerReady = false;
class CollisionManager
{
public:
CollisionManager();
virtual ~CollisionManager();
void run();
bool isBusy();
private:
KinectManager *kManager;
HapticManager *hManager;
bool mBusy;
bool mShutdown;
boost::shared_ptr<boost::thread> mThread;
boost::mutex mMutex;
void work();
};
#endif // __COLLISIONMANAGER_H_
调用run()
中的CollisionManager
函数来初始化并启动线程以进行冲突检测。 MainApplication
函数将完成所有工作,需要调用非静态成员变量和函数。
实现如下:
work()
目前我使用#include "CollisionManager.h"
using namespace std;
CollisionManager::CollisionManager() :
kManager ( new KinectManager ),
hManager ( new HapticManager ),
mShutdown ( false ),
mBusy ( false )
{
}
CollisionManager::~CollisionManager(void)
{
}
bool CollisionManager::isBusy()
{
return this->mBusy;
}
void CollisionManager::run()
{
if (!this->mBusy)
{
this->mBusy = true;
this->mThread = boost::shared_ptr<boost::thread>(new boost::thread(boost::bind(&CollisionManager::work, this)));
}
}
void CollisionManager::work()
{
while(!mShutdown)
{
cout << boolalpha << mShutdown << endl;
}
}
创建线程,因为我遇到了无法访问非静态成员变量的问题。现在至少我使用boost::shared_ptr
解决了这个问题。在shared_ptr
函数内,只要work()
变量设置为false(即mSutdown
中指定的初始值),线程就应该运行。不知怎的,constructor
的值被某些东西改变了,无法弄清楚改变值的位置和内容,因为我没有明确地改变它。行为是线程停止运行,因为标志变为mShutdown
。使用true
中的shared_ptr
时会出现这种现象吗?