set_default_object 有什么作用?MUD开发的内存优化简介

看到QQ群里有同学问到国内LIB中的set_default_object有什么用,这是个好问题,有很多同学对它都不太清楚,在这里针对这个问题做一个关于MUD开发内存优化方面的介绍。

MUD所有载入游戏的对象都会占用内存,虽然现在服务器性能对多数MUD来说不是问题了,但也不用太任性,对该优化的还是要优化。

在内存优化上,主要是两方面:一是优化游戏中对象的数量,二是优化对象本身的内存占用。

在优化游戏中对象的数量上,主要思路是延迟加载对象,减少非必要对象的加载,比如打怪掉装备,我们不需要把装备放到怪物身上,而是在怪物被消灭时才载入要掉的装备。相关优化教程:

在优化对象本身内存占用上,主要思路是共享全局变量,减少非必要变量占用内存,比如游戏物品固定属性,在复制对象上不设定,而是从蓝图对象(原始对象)上读取。

标题中 set_default_object 就是共享全局变量的一种方式,比如以下代码:

#include <weapon.h>
#include <ansi.h>

inherit HAMMER;

void create()
{
        set_name(HIG "碧绿" HIR "西瓜" NOR, ({ "bilv xigua", "bilv", "xigua", "hammer" }));
        set_weight(35000);
        if (clonep())
                set_default_object(__FILE__);
        else {
                set("unit", "对");
                set("long", HIG "这西瓜由精钢铸成,瓜上漆成绿黑间条之"
                            "色,共有一对,系以钢链。\n" NOR);
                set("value", 3000);
                set("material", "iron");
                set("wield_msg", "$N拿出一对$n,试了试重量,然後握在手中。\n");
                set("unwield_msg", "$N放下手中的$n。\n");
        }
        init_hammer(80);
        setup();
}

代码很简单,如果是复制对象就没有下面一堆set(...),而是只有一个set_default_object(__FILE__)

set_default_object 不是驱动提供的efun,而是LIB自己的优化方案,相关方法在游戏存档相关的F_DBASE文件中:

mapping dbase;
nosave mapping tmp_dbase;

// The default_ob provides the default values of the dbase. It is set to
// be master copy of an object.
nosave mixed default_ob;

mixed query_default_object() { return default_ob; }
void set_default_object(mixed ob)
{
    if (!geteuid())
        seteuid(getuid());

    if (stringp(ob))
        ob = get_object(ob);

    if (objectp(ob))
    {
        default_ob = ob;
        ob->set("no_clean_up", 1);
    }
}

这里代码核心只有一句default_ob = ob;,设置复制对象的default_ob为原始对象。然后在query()方法中有以下关键的一句:

    if (undefinedp(data) && default_ob)
        data = default_ob->query(prop, 1);

就是如果在对象中查不到,但对象有设置default_ob,就从default_ob中查询,这样就实现了通过default_ob共享变量。

在游戏中可以通过memory_info()这个efun查看内存占用,大家可以自己测试效果,对比复制对象使用set_default_object(__FILE__)前后的内存占用。

file

使用共享变量,原始对象内存占用2772,复制对象占用1503。

file

不使用共享变量,原始对象内存占用2740,复制对象占用2292。

对游戏中数量很大的对象,使用内存优化的效果会更明显。因为使用 set_default_object 会多一次查询,对CPU占用会高一些,但基本没有什么影响。

另外,游戏中常见的efun replace_program() 也是对象内存优化的一种。

京ICP备13031296号-4