Articles of 消息传递

在哪里把我的实体组件消息function?

我已经完成了我的研究,并阅读了许多关于消息传递和ECS的文章和post,正如我所能find的,以帮助我开展工作。 不过,我在如何让我的消息function被正确处理的路障。 关于我的ECS系统的一些信息。 件: 实体 – 只包含附加组件列表的通用对象,有几个方法来询问它是否具有某些组件并检索它们。 组件 – 仅保存特定于其性质的数据,并且都具有表示组件types的位掩码。 系统 – 特定于其本质的function性代码,并保留要处理的组件列表。 消息 – 消息当前通过MessageInfo类创建。 可以使用以下这行代码轻松创建消息: MessageInfo* msg = new MessageInfo(MESSAGE_TYPE, LISTENER_ENTITY, boost::ANY PARAMS); 我试图保持解耦尽可能,并考虑添加一个静态MessageCenter,我可以推送消息,然后将它们立即派遣或投入队列(取决于推function调用)。 例如,消息被创建并被推送到消息中心。 消息中心立即查看其关心X消息的系统映射,并将消息发送到所有系统固有的“RecieveMessage”方法。 这个方法听起来对我来说真的很好,所以我开始用纸来开发,最后跑到了墙上。 让我提出一个我遇到的情况。 场景: 我有一个文本标签实体被用作位置(x / y coords)组件和文本组件(string,字体大小等)的%指标。 我想改变这个实体的一些数据属性,例如显示的文本和它的颜色。 因为我知道所有的系统都有一个recieveMessage方法,所以我很快就能够封装这些types的请求所特有的function,如下所示。 void SOMESYSTEM::RecieveMessage(MessageInfo* messageInfo) { switch(messageInfo->GetMessageType()) { case MessageType::CHANGE_TEXT: { boost::any params = messageInfo->GetParams(); if(params.type() == typeid(std::tuple<BaseComponent*,std::string>)) { auto […]

基于networking的游戏基于networking聊天的结构示例

什么是最好的工具来创建一个基于Web的聊天/消息系统? 为客户端我们有:浏览​​器(任何JS解决scheme – 最好不使用像Flash中的jsocket) 对于服务器,我们有:PHP / Python /(node.js不能确定这个)可扩展的MySQL结构可扩展的MongoDB集群可扩展的redis服务器memcache服务器(每个128GB ram)一堆服务器与路由器(socket基础负载平衡器stage- 4)零-MQ和/或rabbitMQ 我们将有公会聊天,区域聊天(在Xkm内)/领土聊天/ PM 我们有超过一百万的玩家,两万个同时在线的玩家将会分组聊天 根据地理位置,每个小组将有大约100-2k的玩家 客户端将拥有移动应用程序(android和iphone),如果他们select(并推送PM的通知) 我的问题是什么将使用客户端服务器技术的最佳组合? 谢谢

组件消息传递系统 – 使用整数与消息对象

我目前正在为我的游戏开发一个基于组件的系统,并决定使用消息传递系统在组件之间进行通信。 我已经阅读了一些关于这个主题,似乎大多数人正在使用扩展在基本消息对象上的消息对象, MySpecificMessage extends Message 或者可能他们只有一个Message对象,它接受一个stringvariables来决定它的作用,像这样; new Message("positionX:10"); //Plus other variables you might need 但是我也看到了一些使用静态定义的整数的消息,像这样的消息; public static final int MySpecificMessage = 1; //Different numbers for different messages 基本上我想知道他们之间有什么优点和缺点,也可能在什么时候使用他们。 另外,如果你有任何其他types的消息系统,请分享。

如何防止在基于事件的体系结构中发送语义错误的消息?

我用C ++创建了以下架构: ReceiveMessage有两个重要的参数: Scope ,它定义范围,如游戏对象,场景或核心。 这决定了消息将被转发多远。 例如,核心消息将由Core处理,游戏对象消息将由GameObject处理。 Event定义了Event的名称,作为一个枚举。 这可能包括FIND_GAMEOBJECT_IN_RANGE , PLAY_SOUND等 如果我不小心发送了一个只能由Core处理的事件而不是核心,那么只能在运行时检查。 目前,可以发送类似ReceiveMessage(GAMEOBJECTS, PLAY_SOUND, …); 。 这将被转发到每个游戏对象,并不会被处理,因为PLAY_SOUND事件只能由Core正确处理。 如何重新devise我的消息传递系统,以便在尝试发送带有无效范围事件对的消息时,编译器会给出错误或警告?

消息机制比stdfunction便宜

我使用std::function在我的游戏中的实体之间发送消息。 它基本上是这样的: // Entity A create_message(entity_B_ID, [](Entity* entity){ entity->hp -= 25; }); // Entity B for (auto& effect : my_messages) effect(this); 其中my_messages是一个vector<std::function<void(Entity*)>> 。 在做这个devise的时候,我怀疑如果发送了很多的消息,这个机制会非常昂贵,而且这个怀疑被testing和分析所证实。 我的问题是:你将如何devise一个更便宜的消息系统,但仍然尽可能保留使用lambda的performance力?

我如何避免我的消息系统中的大开关?

我一直在为我的小引擎实现一个消息系统,我开始考虑优化和维护它。 现在,我的消息类看起来像这样(在其最简单的 – 只有成员variables): typedef unsigned int MessageID; class Message { std::string message; MessageID messageID; MessageData* data; }; 起初我只使用std::string来识别每个事件,处理是在级联中完成的 – 如果style: void GUI_system::handleMessage(Message* message) { if (message->message == "DELETE_HP") { deleteHearth(static_cast<AttInfo*>(message->data)); } else if (message->message == "PAUSE_GAME") { showPauseIcon(); } } 然而,我觉得这是不舒服的工作,并为一个开关,我需要一个数字variables。 这就是为什么MessageID是每次创建消息时从unordered_map生成的。 每条消息都有自己的ID,如果没有,则会创建一个新的ID。 所以现在看起来像这样: void GUI_system::handleMessage(Message* message) { switch(message->messageID) { case 1 : { […]

寻求简化我的引擎中的消息系统(C ++)

所以一直在建立我自己的定制引擎,其中一个核心是保持所有系统断开连接的消息系统。 就目前来看,我已经把它指向了所有其他系统,然后在它们创建的时候向消息系统注册他们想要接收的信息。 现在的问题是,消息系统现在知道每个系统是什么,我想简化一下。 我的目标是让任何系统注册消息,而消息系统不需要关心系统的types。 我想添加一个“消息类”父类包装来放置每个系统,但是这更像是一个陪审团装备,然后修复,我想避免有层包装。 任何人有任何想法如何简单这一点?

如何devise事件的参数

我正在为我的引擎开发事件系统,并且在决定什么types的参数同时具有通用性和特定性时遇到一些麻烦。 我希望能够通知世界各地的实体使用与观察者模式类似的事情,但是仅仅通知消息本身是不够的,一些消息需要携带附加信息,例如位置,半径,损坏,以及等等。 如何将所有这些不同types的参数封装在一个事件types中,而不会像每个事件为每种types的参数都保存一个字段那样变得非常臃肿? 一些例子来说明我想实现的目标以及到目前为止我所考虑的内容: struct Event { TYPE type; int x, y, z; unsigned radius; float damage; unsigned cost; float healing; … void Observer::notify(Event event) { if (event.type == explosion) handle_explotion(event.x, event.y, event.z, event.damage); else if (event.type == healing) add_hitpoints(event.healing); … 这会使Eventtypes变得非常臃肿,处理过程变得很乏味。 我认为有更less的参数,但他们将保持不明确: struct Event { int arg1, arg2, arg3, arg4; const char * str1, […]

通用游戏引擎中的消息/事件系统? 是还是不是?

我应该为通用游戏引擎开发一个基本的消息传递/事件系统,还是应该根据最终用户的具体情况为其创建针对正在开发的游戏的系统? 这个问题提出了一些有效的观点:(我目前正在使用每帧函数调用系统提到) 每一帧函数调用抗事件驱动的消息,在游戏devise

在“系统”中使用组件逻辑与组件本身有什么优势?

在过去的几天里,我一直在努力做出我的第一场比赛。 我对通常的开发实践和模式做了一些研究,并且决定了一个合成系统,在这个系统中,不同的组件使用容器 – 游戏对象分发的消息进行通信。 比如说我按下了攻击键。 playerInput组件使用GameObject的notify函数向所有其他组件发送AttackMessage。 Weapon组件select消息,设置一些局部variables,并向RigidBody组件发送一个RigidBodyStateMessage,RigidBodyStateMessage又发送另一个包含GameObject的旋转和位置的消息。 Weapon组件捕获消息并使用消息中传递的信息实例化一个项目符号。 不同对象之间的通信是通过消息总线上发送的消息来实现的,消息总线上已经注册了这些消息。 例如,PhysicsComponent不断地发送消息到collisionBus,然后把它传递到已注册的GameObjects。 这种方法允许组件之间完全解耦,但我不确定是否会产生任何长期问题。 有些人还告诉我,组件不应该有任何逻辑,只能保存将在系统中处理的数据。 我想知道后一种方法与我目前使用的方法相比有什么优点。 对不起,墙上的文字,我从我的手机写。 任何帮助深表感谢!