Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Nebula3中的Entity

Nebula3中的Entity

作者头像
逍遥剑客
发布于 2018-05-23 07:56:26
发布于 2018-05-23 07:56:26
36000
代码可运行
举报
运行总次数:0
代码可运行

N3架构上是分了三层的, foundation, render, application.

一直以来看的都是foundation和render, 上层的一直没怎么看

今天大体上浏览了下, 感觉东西还是满多的

很多引擎都没这一层的, 如果没有实际项目的积累, 也没法抽象出复用的部分来

这里说的Entity不是GraphicsEntity, 而是Game::Entity, 代表游戏中的一个对象, 比如人, 道具什么的

一个Entity由以下几部分组成:

  • ID : 这个没啥好说的
  • AttributeTable: 属性表, 跟数据库绑定, 数据驱动的前提
  • Properties: 或许叫Component更合适, 组件模型, 现在大家都这么干了, 除了国内的人-_-

跟其他组件模型有点不一样的是, 如果想调用Entity中某个组件的功能, 直接发个消息给这个Entity就可以. 它自己找到处理这个消息的Property进行处理. 从这一点来说, Entity也是一个消息分配器(Dispatcher):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                                +------+  
                            +-->| Port |  
                           /    +------+  
            +------------+/     +------+  
--- Msg --->| Dispatcher |----->| Port |  
            +------------+/     +------+  
                           /    +------+  
                            +-->| Port |  
                                +------+  

实际上Property是从Messaging::Port继承的, 然后Port再把消息交给Handler去处理. 这样一来, 扩展功能只需要增加Message和对应的Handler就可以了.

想想N3中其实很多地方都用了消息, 比如多线程. 虽然这种方式解决了同步之类的烦恼, 但是也造就了Message满天飞的现象, 以至于他们写了个idlc来自动生成Message头文件...

在看WPF线程模型的时候, 突然想到, 是不是可以参考它的跨线程调用方法(Dispatcher.BeginInvoke)呢? 其实就是把调用函数变成一个delegate, 再加上参数, 一起装在一起加入队列. 本质上还是消息的形式, 只不过不用定义消息结构和写处理分支了. 坏处就是, 把调用细节暴露出来, 耦合度太大......

嗯, 跑题了

那个Property派生出来GraphicsProperty, TransformableProperty, CameraProperty, InputProperty, StateProperty等等. 想要显示在场景里就用GraphicsProperty, 想响应输入就加一个InputProperty, 诸如此类. 要调用其它Property的方法也不用从Entity中找到再cast什么的, 直接一个消息扔进去就完了...

另外属性表的应用和实现都比较复杂, 下回分解

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2011年01月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Nebula3 SDK (Apr 2009)更新内容
这里还有一些针对Foundation和Render层的有趣的代码统计 (希望图片没有缩放的太失真):
逍遥剑客
2022/01/11
1.2K0
Nebula3 SDK (Apr 2009)更新内容
Nebula3中的Message
最近心情不好, 一直没学习-_- 今天是近期最后一个双休, 玩够了就看看代码吧 本来是计划看模型部分的, 无奈现阶段N3中的模型还是用的N2的, 作者又说N3的新版本近期内会出来, 所以先放一放, 新
逍遥剑客
2018/06/25
5570
WPF Dispatcher
在WPF应用程序中,Application.Current.Dispatcher是一个重要的属性。它允许开发者在WPF应用程序的主线程上执行操作,这对于确保UI响应性和避免假死(程序没有响应用户输入)非常关键。主线程负责接收输入、处理事件、绘制屏幕等任务。为了避免在主线程上执行耗时的操作,开发者可以使用Application.Current.Dispatcher.Invoke或者Application.Current.Dispatcher.InvokeAsync方法,将需要在主线程上执行的代码块放入主线程的工作项队列中执行。
JusterZhu
2023/10/10
2740
WPF Dispatcher
深入了解 WPF Dispatcher 的工作原理(Invoke/InvokeAsync 部分)
发布于 2017-09-25 18:02 更新于 2017-10-19 13:13
walterlv
2018/09/18
3.8K0
深入了解 WPF Dispatcher 的工作原理(Invoke/InvokeAsync 部分)
WPF的消息机制(二)- WPF内部的5个窗口之隐藏消息窗口
目录 WPF的消息机制(一)-让应用程序动起来 WPF的消息机制(二)-WPF内部的5个窗口 (1)隐藏消息窗口 (2)处理激活和关闭的消息的窗口和系统资源通知窗口 (3)用于用户交互的可见窗口 (4)用于UI窗口绘制的可见窗口 WPF的消息机制(三)-WPF输入事件的来源 WPF的消息机制(四)-WPF中UI的更新 WPF内部的5个窗口 对于Windows系统来说,它是一个消息系统,消息系统的核心就是窗口。对于WPF来说也是如此。那么WPF内部为什么需要窗口,又存在哪些窗口呢? 在上一篇,我们频繁的提及“
葡萄城控件
2018/01/10
2K0
WPF的消息机制(二)- WPF内部的5个窗口之隐藏消息窗口
Nebula3 SDK Nov 2009 更新内容
跟以往一样, 只包含了Win32平台的源码. Console平台特定代码 (Xbox360, PS3 还有 Wii) 介于法律问题没有包括进去.
逍遥剑客
2022/01/11
4550
一站式WPF--线程模型和Dispatcher
 书接前文,前篇文章介绍了WPF中的Dispatcher,由于概念太多,可能不是那么好理解。这篇文章继续讨论,希望在线程和Dispatcher这个点上,能把它讲透。
JusterZhu
2023/09/18
3110
一站式WPF--线程模型和Dispatcher
Windows 消息循环
【希沃白板5】课件分享 : 《Windows培训 - 消息循环》 https://r302.cc/q2d1jB 点击链接直接预览课件
jgrass
2024/12/25
970
Windows 消息循环
Nebula3 SDK (Mar2010)更新内容(山寨版)
注: 本文非官方博客发布, 是我自己用版本工具对比出来的. 所以新加的我可能不了解其思想, 零碎的改动也被我忽略, 写出来的也不保证完全正确… Foundation l Core 增加OSX相关支持 config.h增加PUBLIC_BUILD相关配置 增加n_assert2宏 Rtti/Factory增加无FourCC的Register方法 l FrameSync 增加FrameSyncSharedData类, 用于两个线程间的数据交换 FrameSyncHandlerThread增加锁定帧时
逍遥剑客
2018/05/23
5140
September Nebula3 SDK 中的新东西
今天国庆放假的第一天, 饿得无聊就出来找东西吃, 转着转着就来到公司了. 就我一人, 真爽 想想这几天看看N3吧, 工作上的事情还是按计划来 上作者blog一看, 又有新东西啦, 大体翻译一下: 我最后还是抽出时间打包了一个新的N3 SDK. 我会在星期一回到办公室时上传上去,  同时这里有一个大体的列表.  很多底层的东西改变了, 所以我不得不移除一些不错的前台特性(如在实现了多线程的渲染器后N2的角色渲染必须删除, 并且届时shader光照的代码会出错). 我会在下一个release版本中去考虑这些前
逍遥剑客
2018/05/23
5230
web messaging与Woker分类:漫谈postMessage跨线程跨页面通信
iframe_contentWindow.postMessage(message, targetOrigin, [transfer]);
周陆军
2021/07/03
2.2K0
dotnet 读 WPF 源代码 聊聊 DispatcherTimer 的实现
本文来告诉大家在 WPF 框架里面,是如何实现 DispatcherTimer 的功能。有小伙伴告诉我,读源代码系列的博客看不动,原因是太底层了。我尝试换一个方式切入逻辑,通过提问题和解决问题的方法,一步步告诉大家 WPF 是如何实现 DispatcherTimer 的功能
林德熙
2021/12/24
7130
dotnet 读 WPF 源代码笔记 渲染收集是如何触发
在 WPF 里面,渲染可以从架构上划分为两层。上层是 WPF 框架的 OnRender 之类的函数,作用是收集应用程序渲染的命令。上层将收集到的应用程序绘制渲染的命令传给下层,下层是 WPF 的 GFX 层,作用是根据收到的渲染的命令绘制出界面。本文所聊的是渲染上层部分,在 WPF 框架是如何做到界面刷新渲染,包括此调用的顺序以及框架逻辑
林德熙
2021/09/18
8450
dotnet 读 WPF 源代码笔记 渲染收集是如何触发
WPF 的 Application.Current.Dispatcher 中,为什么 Current 可能为 null
在 WPF 程序中,可能会存在 Application.Current.Dispatcher.Xxx 这样的代码让一部分逻辑回到主 UI 线程。因为发现在调用这句代码的时候出现了 NullReferenceException,于是就有三位小伙伴告诉我说 Current 和 Dispatcher 属性都可能为 null。
walterlv
2023/10/22
6410
WPF 的 Application.Current.Dispatcher 中,为什么 Current 可能为 null
深入了解 WPF Dispatcher 的工作原理(PushFrame 部分)
发布于 2017-09-25 19:49 更新于 2017-09-28 23:35
walterlv
2018/09/18
1.9K0
深入了解 WPF Dispatcher 的工作原理(PushFrame 部分)
Openstack之RPC详解
openstack的rpc是由这个oslo_messaging库实现的,下面就主要讲解下这个库的实现原理
tunsuy
2022/10/27
5630
一站式WPF--Window(一)
  这段是MSDN上对Window的描述,虽然翻译的不是那么地道,也可以看出Window的两大功能:一,承载可视化数据。二,使用户可以与可视化数据进行交互。
JusterZhu
2023/09/18
2710
一站式WPF--Window(一)
Android中多线程切换的几种方法
我们知道,多线程是Android开发中必现的场景,很多原生API和开源项目都有多线程的内容,这里简单总结和探讨一下常见的多线程切换方式。 我们先回顾一下Java多线程的几个基础内容,然后再分析总结一些经典代码中对于线程切换的实现方式。
用户1269200
2018/07/30
2K0
Nodejs学习笔记(十六)--- Pomelo介绍&入门
前言&介绍 Pomelo:一个快速、可扩展、Node.js分布式游戏服务器框架 从三四年前接触Node.js开始就接触到了Pomelo,从Pomelo最初的版本到现在,总的来说网易出品还算不错,但是发展不算快;用它做过一些项目和小游戏表现还不错。 用它的主要好处: 1. 入门简单,有比较丰富的文档和示例(虽然现在看版本也比较老了,但是入门没什么问题) 2.分布式多进程且扩展简单(单进程多线程,每个服务器都是一个Node进程,通过配置文件就可以管理集群) 3.可以不去关注底层和网络相关逻辑,聚
Porschev
2018/01/16
8.8K1
Nodejs学习笔记(十六)--- Pomelo介绍&入门
Spark内核详解 (2) | Spark之间的通讯架构
Spark 内置的RPC框架前后共有两种架构,一个是在Spark2.0.0中被移除的Akka,一个则是借鉴了Akka 的 Actor 模型的Netty
不温卜火
2020/10/28
1.4K0
Spark内核详解 (2) | Spark之间的通讯架构
相关推荐
Nebula3 SDK (Apr 2009)更新内容
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档