move() ... 减少系统对象数的建议 ,北大侠客行MUD论坛" />

yunlan 发表于 2012-8-26 17:17:26

减少系统对象数的建议

以前玩过好几个mud,都是在系统更新时"一阵风吹过"摧毁房间里掉落的物品,建议可以采取这种方式。具体实现方法可以是:
给所以物品加一个move_time属性,当执行obj->move()时,就设置move_time为系统时间。当系统更新时,检查房间里各个物品,只要move_time早于15分钟的就销毁该物品。
一般东西掉地上超过15分钟就没人要了,直接销毁也没影响。对于不能销毁的特殊物品,加一个no_destroy标记就是。
这样一来毫毛这个经常惹祸的npc都不需要了,尸体也不用加速腐烂了,目测可以减少不少对象

北大侠客行MUD,中国最好的MUD

yunlan 发表于 2012-8-26 17:18:40

如果建议不当请无视…

labaz 发表于 2012-8-26 17:20:04

大哥你发错地方了

ruoyu 发表于 2012-8-26 18:14:30

不懂计算机的撸过支持一下!

zgbl 发表于 2012-8-26 20:40:51

本帖最后由 zgbl 于 2012-8-26 08:41 PM 编辑

我觉得用队列方法应该挺不错,毕竟加了move_time这个mark后还是得遍历所有物品
按照drop时间顺序加入队列,每15分钟插一个标记,插入第二个标记后删除第一个标记之前的所有物品
drop时的操作:
1、物品加入队列
2、物品上加上一个mark,标记队列中的位置

get时的操作:
根据物品上的mark从队列中去掉这个物品

yunlan 发表于 2012-8-26 21:55:05

本帖最后由 yunlan 于 2012-8-26 01:59 PM 编辑

我觉得用队列方法应该挺不错,毕竟加了move_time这个mark后还是得遍历所有物品
按照drop时间顺序加入队列, ...
zgbl 发表于 2012-8-26 12:40 PM http://pkuxkx.com/forum/images/common/back.gif


    队列方式有一个问题,因为一个物品被丢到房间A之后,它还可能在15分钟内被捡起来,丢到别的房间去,所以每次move物品的时候,还要先遍历队列内已有标记,删除这件东西的旧标记。当有几千件物品标记的时候,这个效率也不见得高啊!
像你说的给物品加mark标记它在队列中的位置,以避免遍历,这个恐怕不太可行吧?因为每15分钟队列中考前的物品要被清除,这个时候队列位置会改变。比如你原先一个物品A在第1000位,而一次更新时消除了队列里前500位的物品,这个时候物品A实际变成了第500位,它身上mark的第1000位位置,这个数据已经失效了

zgbl 发表于 2012-8-26 22:50:40

本帖最后由 zgbl 于 2012-8-26 10:51 PM 编辑

队列方式有一个问题,因为一个物品被丢到房间A之后,它还可能在15分钟内被捡起来,丢到别的房间去 ...
yunlan 发表于 2012-8-26 21:55 http://pkuxkx.com/forum/images/common/back.gif


    不需要,队列元素不是只能有一个数据,也可以给元素加mark,队列元素的mark表示该物品是否在地上。如果被get了,那么修改那个mark,就等同于删除元素了,队列中的顺序没变不过这里还有个问题就是,如果是这样的话,随着时间的递增队列会越来越长,这也比较蛋疼,得动态释放之前的空间

flauto 发表于 2012-8-26 22:56:24

队列方式有一个问题,因为一个物品被丢到房间A之后,它还可能在15分钟内被捡起来,丢到别的房间去 ...
yunlan 发表于 2012-8-26 09:55 PM http://pkuxkx.com/forum/images/common/back.gif


    比如物品A在第1000位,队头指针p指向obj,那么A存在obj;删除队列里前500个物品后,p指向obj,A仍存在obj,这没什么问题吧?

flauto 发表于 2012-8-26 23:03:29

回复 7# zgbl


    递增的问题可以考虑循环队列或静态链表吧

zgbl 发表于 2012-8-27 09:28:36

回复zgbl


    递增的问题可以考虑循环队列或静态链表吧
flauto 发表于 2012-8-26 23:03 http://pkuxkx.com/forum/images/common/back.gif


    循环队列不错
页: [1]
查看完整版本: 减少系统对象数的建议