KBEngine官方论坛

 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 配置 开服
查看: 56|回复: 7

关于实体序列化的疑问

[复制链接]

10

主题

45

帖子

156

积分

注册会员

Rank: 2

积分
156
发表于 2018-11-15 15:00:03 | 显示全部楼层 |阅读模式
从源码上看所有的类型序列化前都会isSameType之类的, 在Entity和组件中会检查所有的同步字段, 这个是不是消耗有点大,在组件的addToServerStream函数中有一段:        uint16 count = (uint16)pPropertyDescrs->size();
        (*mstream) << count;

        ScriptDefModule::PROPERTYDESCRIPTION_MAP::const_iterator iter = pPropertyDescrs->begin();
        for (; iter != pPropertyDescrs->end(); ++iter)
        {

               PyObject* pyVal = PyObject_GetAttrString(this, propertyDescription->getName());
                if (pyVal)
                {
                        if (!propertyDescription->getDataType()->isSameType(pyVal))
                        {
                                CRITICAL_MSG(fmt::format("EntityComponent::addToServerStream: {} type(curr_py: {} != {}) error! name={}, utype={}, owner={}, ownerID={}, domain={}.\n",
                                        propertyDescription->getName(), (pyVal ? pyVal->ob_type->tp_name : "unknown"), propertyDescription->getDataType()->getName(),
                                        pComponentDescrs_ ? pComponentDescrs_->getName() : "", pComponentDescrs_ ? pComponentDescrs_->getUType() : 0,
                                        owner()->ob_type->tp_name, ownerID(), COMPONENT_NAME_EX(componentType())));
                        }
                        else
                        {
                                (*mstream) << pPropertyDescription_->getUType();
                                (*mstream) << propertyDescription->getUType();

                                propertyDescription->addToStream(mstream, pyVal);
                        }

                        Py_DECREF(pyVal);
                }

          ....
       }
这里检查是基于什么考虑的呢?  如果类型不一致, 同步数据就已经错乱了,  在for外面的count还是原来那么多, 但是写入的实际数量却不是的了, 在接收的端的createFromStream的时候直接会异常了

如果是没办法避免错误或者不应该出现这种错误, 还不如直接别检测了不是更快
回复

使用道具 举报

5

主题

3497

帖子

214748万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2147483647

引擎扛把子

发表于 2018-11-19 10:24:47 | 显示全部楼层
嗯, count是有点不安全, 需要处理一下。

不检测肯定不行, 由用户自己玩那更乱了。
QQ:3603661
3603661@qq.com
回复

使用道具 举报

10

主题

45

帖子

156

积分

注册会员

Rank: 2

积分
156
 楼主| 发表于 2018-11-19 14:12:04 | 显示全部楼层
柯标 发表于 2018-11-19 10:24
嗯, count是有点不安全, 需要处理一下。

不检测肯定不行, 由用户自己玩那更乱了。 ...

检测性能参数不是会受很大影响,我建议是不是在debug下检测, release下不要检测, 所有的协议通信都要保证数据正确性的,检测的意义不大, 这种都要发生错误都是很严重的错误的,都应该在开发测试阶段排除掉
回复

使用道具 举报

5

主题

3497

帖子

214748万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2147483647

引擎扛把子

发表于 2018-11-19 14:15:17 | 显示全部楼层
你因此而产生瓶颈了?序列化有这么频繁?
一款完善的引擎不可能是这样设计的,有些错误不可能在测试阶段能测出来, 一旦正式环境就可能因此而造成解析出错停服或者存储的数据为错误数据, 你如果能接受你可以自己屏蔽掉
QQ:3603661
3603661@qq.com
回复

使用道具 举报

10

主题

45

帖子

156

积分

注册会员

Rank: 2

积分
156
 楼主| 发表于 2018-11-19 14:34:14 | 显示全部楼层
瓶颈倒还没有测试出来, 我只是没理解你所说的安全性,就算你检测了, 该错的还是错了, 并没有防止
回复

使用道具 举报

10

主题

45

帖子

156

积分

注册会员

Rank: 2

积分
156
 楼主| 发表于 2018-11-19 14:36:53 | 显示全部楼层
就比如说,正式环境出错了,在检测到类型不一致时直接返回不序列化, 玩家数据也永远存不了档了, 还是会发生数据丢失, 同样是很严重的问题
回复

使用道具 举报

5

主题

3497

帖子

214748万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2147483647

引擎扛把子

发表于 2018-11-19 14:39:37 | 显示全部楼层
简单来说, 没有合法检查的数据可能是任何数据, 解析可能出现任何错误导致crash都有可能。
错误数据存到硬盘上就是引擎的问题, 如果提前察觉提示了就是开发者的问题。 你提到的方式就是出错了也不知道哪里错了。
这是设计问题,一款引擎的好用是均衡的,  效率的通知兼顾安全和各种辅助提示。

更何况连瓶颈都不是。
QQ:3603661
3603661@qq.com
回复

使用道具 举报

10

主题

45

帖子

156

积分

注册会员

Rank: 2

积分
156
 楼主| 发表于 2018-11-19 14:54:20 | 显示全部楼层
感谢柯标大大的回应, 我再研究研究, 是不是瓶颈我还要测试测试,因为自己也想要加点数据上去, 目前参考实体的设计序列化是有点频繁了, 我再想想要不要换种方式
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|KBEngine Forum

GMT+8, 2018-12-10 19:28 , Processed in 0.031163 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表