在游戏管理器(GameManager)中维护一个消息队列std::queue(mSendMessageQueue),在GameManager::SendMessage中将消息放入队列中,如下
void GameManager::SendMessage(const Message& message) { mGMImpl->mSendMessageQueue.push(dtCore::RefPtr<const Message>(&message)); }然后在每一帧的渲染过程中处理消息队列中的消息,调用所有组件的ProcessMessage函数,过程如下
void GameManager::DoSendMessages() { // PROCESS MESSAGES - Send all Process messages to components and interested actors while (!mGMImpl->mSendMessageQueue.empty()) { mGMImpl->mGMStatistics.mStatsNumProcMessages += 1; // Forward to Components first dtCore::RefPtr<const Message> messageRef = mGMImpl->mSendMessageQueue.front(); mGMImpl->mSendMessageQueue.pop(); if (!messageRef.valid()) { mGMImpl->mLogger->LogMessage(dtUtil::Log::LOG_ERROR, __FUNCTION__, __LINE__, "Message in send queue is NULL. Something is majorly wrong with the GameManager."); continue; } const Message& message = *messageRef; DoSendMessage(message); } } void GameManager::DoSendMessage(const Message& message) { DoSendMessageToComponents(message, false); } void GameManager::DoSendMessageToComponents(const Message& message, bool toNetwork) { GMImpl::GMComponentContainer::iterator compItr = mGMImpl->mComponentList.begin(); while (compItr != mGMImpl->mComponentList.end()) { //RefPtr in case it get deleted during a Message. We need to hang onto it for a bit. dtCore::RefPtr<GMComponent>& component = *compItr; component->ProcessMessage(message); ++compItr; } }
