Nebula3中的Message

本文深入探讨了N3游戏引擎中Message机制的核心概念及其重要性。Message被视为N3的精髓所在,通过Command模式实现了事件与操作的功能,并介绍了Port、AsyncPort及Dispatcher等关键组件的作用。此外,文章还强调了Message机制对于脚本化和多线程化的便利性。

最近心情不好, 一直没学习-_-

今天是近期最后一个双休, 玩够了就看看代码吧

本来是计划看模型部分的, 无奈现阶段N3中的模型还是用的N2的, 作者又说N3的新版本近期内会出来, 所以先放一放, 新的版本很可能包含N3的模型/动画部分, 到时再看也不迟

Message嘛, 我觉得是整个N3中最为核心的部分, 虽然没几个类, 但可以是说整个N3的精华所在. 为什么这么说呢? 看看它有多少多少类从Port派生的(这图不全):

可以说, 每个部分都与它息息相关.

那, Port是什么? 看下图:

Message比较好理解, 它就是一个事件, 或是一个操作. 其实就是设计模式中的Command模型, 但N3中的Command成了脚本库和数据库的指令了, 所以只好改叫Message(xoyojank: 我瞎猜的).

有Message必须有Handler来进行处理, 那Port就好说了, 它就是Message的接收器, 包含了一堆的Handler来处理消息. 有一个异步的Port实现叫AsyncPort, 它是所有Fat线程子系统接口(XXXInterface)的基类, 有自己的线程而已. 功能上来说, 跟Port一样的.

还有个Dispatcher. 其实它也是一个Port, 但是包含了许多个别的Port. 存在的意义在于把复杂的消息处理机制隐藏掉, 给外界留一个简单的外表. 这个在逻辑部分(即N3的Application层)用的比较多, 能把逻辑部分抽像成这样的游戏我还真没怎么见过. (题外话: 我觉得这也是N3跟OGRE之流差别最大的一个地方: 它是一个游戏引擎, 不仅仅是图形引擎)

还有一点值得注意, 那就是Message预留了二进制序列化的接口, 这意味着可以把消息写入流进行转输. Sep2008版本中加入的Remote子系统就是它的应用, 可以远程操控应用程序, 很酷的一个特性.

其实, 我感觉N3中所有的模块都是基于一个思想, 那就是任何的操作, 都有一些相关的消息, 和对应的处理者来执行. 可能有人会觉得这样不如直接编码一个函数调用来得简单, 但是扩展性和可复用性大大地增强了. 无论对于脚本化还是多线程化来说, 这都是非常方便的.

期待N3未来的表现, 因为它不输于任何一个商业引擎! 商业引擎强大在配套的工具上, 但是架构上跟N3相比, 还是有些差距的(至少UE3和GB个人认为不如它)

let db = require('../db/index'); // nebula.js (修正字段别名) exports.all = (req, res) => { var sql = "SELECT * FROM nebula;"; // 表名改为 nebula db.query(sql, (err, data) => { if (err) { return res.send("错误:" + err.message); } res.send(data); }); }; exports.searchNebulaName = (req, res) => { const keyword = req.query.nebulaNameInput || ''; const sql = ` SELECT xingyunbianhao AS 编号, nebulaname AS 名字, photographer AS 摄影师, capturedate AS 拍摄时间, pic AS 图片 FROM nebula WHERE nebulaname LIKE ?; `; db.query(sql, [`%${keyword}%`], (err, data) => { if (err) { console.error('查询错误:', err.message); return res.status(500).send({ status: 500, message: '数据库查询失败', error: err.message }); } if (data.length === 0) { return res.send({ status: 404, message: '未找到相关星云' }); } res.send({ status: 200, data }); }); }; exports.add = (req, res) => { const sql = `INSERT INTO nebula SET ?`; db.query(sql, req.body, (err, result) => { if (err) { if (err.code === 'ER_DUP_ENTRY') { return res.send({ status: 409, message: '星云编号已存在' }); } return res.status(500).send('错误:' + err.message); } res.send({ status: 200, message: '添加成功' }); }); }; // 更新星云 - 修复路由方法 exports.update = (req, res) => { const sql = `UPDATE nebula SET ? WHERE xingyunbianhao = ?`; db.query(sql, [req.body, req.body.xingyunbianhao], (err, result) => { if (err) { if (err.code === 'ER_DUP_ENTRY') { return res.send({ status: 409, message: '星云编号冲突' }); } console.error('更新错误:', err.message); return res.status(500).send({ status: 500, message: '更新失败', error: err.message }); } if (result.affectedRows > 0) { res.send({ status: 200, message: '更新成功' }); } else { res.send({ status: 404, message: '未找到星云记录' }); } }); }; // 删除星云 exports.delete = (req, res) => { const sql = "DELETE FROM nebula WHERE xingyunbianhao = ?"; db.query(sql, [req.query.xingyunbianhao], (err, data) => { if (err) { console.error('删除错误:', err.message); return res.status(500).send({ status: 500, message: '删除失败: ' + err.message }); } if (data.affectedRows > 0) { res.send({ status: 200, message: '删除成功' }); } else { res.send({ status: 404, message: '未找到该星云' }); } }); };出现let db = require('../db/index'); // nebula.js (修正字段别名) exports.all = (req, res) => { var sql = "SELECT * FROM nebula;"; // 表名改为 nebula db.query(sql, (err, data) => { if (err) { return res.send("错误:" + err.message); } res.send(data); }); }; exports.searchNebulaName = (req, res) => { const keyword = req.query.nebulaNameInput || ''; const sql = ` SELECT xingyunbianhao AS 编号, nebulaname AS 名字, photographer AS 摄影师, capturedate AS 拍摄时间, pic AS 图片 FROM nebula WHERE nebulaname LIKE ?; `; db.query(sql, [`%${keyword}%`], (err, data) => { if (err) { console.error('查询错误:', err.message); return res.status(500).send({ status: 500, message: '数据库查询失败', error: err.message }); } if (data.length === 0) { return res.send({ status: 404, message: '未找到相关星云' }); } res.send({ status: 200, data }); }); }; exports.add = (req, res) => { const sql = `INSERT INTO nebula SET ?`; db.query(sql, req.body, (err, result) => { if (err) { if (err.code === 'ER_DUP_ENTRY') { return res.send({ status: 409, message: '星云编号已存在' }); } return res.status(500).send('错误:' + err.message); } res.send({ status: 200, message: '添加成功' }); }); }; // 更新星云 - 修复路由方法 exports.update = (req, res) => { const sql = `UPDATE nebula SET ? WHERE xingyunbianhao = ?`; db.query(sql, [req.body, req.body.xingyunbianhao], (err, result) => { if (err) { if (err.code === 'ER_DUP_ENTRY') { return res.send({ status: 409, message: '星云编号冲突' }); } console.error('更新错误:', err.message); return res.status(500).send({ status: 500, message: '更新失败', error: err.message }); } if (result.affectedRows > 0) { res.send({ status: 200, message: '更新成功' }); } else { res.send({ status: 404, message: '未找到星云记录' }); } }); }; // 删除星云 exports.delete = (req, res) => { const sql = "DELETE FROM nebula WHERE xingyunbianhao = ?"; db.query(sql, [req.query.xingyunbianhao], (err, data) => { if (err) { console.error('删除错误:', err.message); return res.status(500).send({ status: 500, message: '删除失败: ' + err.message }); } if (data.affectedRows > 0) { res.send({ status: 200, message: '删除成功' }); } else { res.send({ status: 404, message: '未找到该星云' }); } }); };let db = require('../db/index'); // nebula.js (修正字段别名) exports.all = (req, res) => { var sql = "SELECT * FROM nebula;"; // 表名改为 nebula db.query(sql, (err, data) => { if (err) { return res.send("错误:" + err.message); } res.send(data); }); }; exports.searchNebulaName = (req, res) => { const keyword = req.query.nebulaNameInput || ''; const sql = ` SELECT xingyunbianhao AS 编号, nebulaname AS 名字, photographer AS 摄影师, capturedate AS 拍摄时间, pic AS 图片 FROM nebula WHERE nebulaname LIKE ?; `; db.query(sql, [`%${keyword}%`], (err, data) => { if (err) { console.error('查询错误:', err.message); return res.status(500).send({ status: 500, message: '数据库查询失败', error: err.message }); } if (data.length === 0) { return res.send({ status: 404, message: '未找到相关星云' }); } res.send({ status: 200, data }); }); }; exports.add = (req, res) => { const sql = `INSERT INTO nebula SET ?`; db.query(sql, req.body, (err, result) => { if (err) { if (err.code === 'ER_DUP_ENTRY') { return res.send({ status: 409, message: '星云编号已存在' }); } return res.status(500).send('错误:' + err.message); } res.send({ status: 200, message: '添加成功' }); }); }; // 更新星云 - 修复路由方法 exports.update = (req, res) => { const sql = `UPDATE nebula SET ? WHERE xingyunbianhao = ?`; db.query(sql, [req.body, req.body.xingyunbianhao], (err, result) => { if (err) { if (err.code === 'ER_DUP_ENTRY') { return res.send({ status: 409, message: '星云编号冲突' }); } console.error('更新错误:', err.message); return res.status(500).send({ status: 500, message: '更新失败', error: err.message }); } if (result.affectedRows > 0) { res.send({ status: 200, message: '更新成功' }); } else { res.send({ status: 404, message: '未找到星云记录' }); } }); }; // 删除星云 exports.delete = (req, res) => { const sql = "DELETE FROM nebula WHERE xingyunbianhao = ?"; db.query(sql, [req.query.xingyunbianhao], (err, data) => { if (err) { console.error('删除错误:', err.message); return res.status(500).send({ status: 500, message: '删除失败: ' + err.message }); } if (data.affectedRows > 0) { res.send({ status: 200, message: '删除成功' }); } else { res.send({ status: 404, message: '未找到该星云' }); } }); };出现错误:ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1如何解决
06-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值