游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2259

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 2035|回复: 23

[yuxikuo] 使用xlua读取lua数据表性能分析

[复制链接]  [移动端链接]
排名
3418
昨日变化
3

4

主题

32

帖子

601

积分

Rank: 9Rank: 9Rank: 9

UID
74505
好友
1
蛮牛币
1220
威望
0
注册时间
2015-2-12
在线时间
173 小时
最后登录
2018-7-19

专栏作家

发表于 2017-12-21 02:07:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 yuxikuo 于 2017-12-21 02:07 编辑

使用xlua读取lua策划数据表性能分析
使用的lua表
[XML] 纯文本查看 复制代码
Hero =
{
    [1] =
    {
        nHeroId = 1,
            sName = "英雄法师",
            nRare = 11,
            nType = 1,
            nDefaultStar = 1,
            bIsOpen = true,
    },
    [2] =
    {
        nHeroId = 2,
            sName = "英雄法师",
            nRare = 11,
            nType = 1,
            nDefaultStar = 1,
            bIsOpen = true,
    },
    [3] =
    {
        nHeroId = 3,
            sName = "英雄法师",
            nRare = 11,
            nType = 1,
            nDefaultStar = 1,
            bIsOpen = true,
    },
    [4] =
    {
        nHeroId = 4,
            sName = "英雄法师",
            nRare = 11,
            nType = 1,
            nDefaultStar = 1,
            bIsOpen = true,
    },
    [5] =
    {
        nHeroId = 5,
            sName = "英雄法师",
            nRare = 11,
            nType = 1,
            nDefaultStar = 1,
            bIsOpen = true,
    },
    [6] =
    {
        nHeroId = 6,
            sName = "英雄法师",
            nRare = 11,
            nType = 1,
            nDefaultStar = 1,
            bIsOpen = true,
    },
}
测试代码
[C#] 纯文本查看 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;

public class LoadLuaData : MonoBehaviour
{
    void Awake()
    {
        LuaInstance.instance.Get();
    }
    void Start()
    {
        UnityEngine.Profiling.Profiler.BeginSample("Get Lua Data test ===1");
        TableDataHeroPojo data = (TableDataHeroPojo)LuaDataManager.GetLuaDatInfo<TableDataHeroPojo>(4);
        UnityEngine.Profiling.Profiler.EndSample();
        Debug.LogError("1 test hero id = " + data.nHeroId);

        UnityEngine.Profiling.Profiler.BeginSample("Get Lua Data test ===2");
        TableDataHeroPojo data2 = (TableDataHeroPojo)LuaDataManager.GetLuaDatInfo<TableDataHeroPojo>(4);
        UnityEngine.Profiling.Profiler.EndSample();
        Debug.LogError("2 test hero id = " + data2.nHeroId);

        UnityEngine.Profiling.Profiler.BeginSample("Get Lua Data test ===3");
        string path = string.Format(GameConfig.LuaPath, "DataConfig/Hero");
        LuaInstance.instance.Get().DoString(path);
        LuaTable table = LuaInstance.instance.Get().Global.Get<LuaTable>("Hero");
        LuaTable hero = table.Get<int, LuaTable>(1);
        TableDataHeroPojo tb1Class = hero.Cast<TableDataHeroPojo>();
        UnityEngine.Profiling.Profiler.EndSample();

        UnityEngine.Profiling.Profiler.BeginSample("Get Lua Data test ===3");
        LuaTable hero2 = table.Get<int, LuaTable>(2);
        TableDataHeroPojo tb1Class2 = hero2.Cast<TableDataHeroPojo>();
        UnityEngine.Profiling.Profiler.EndSample();

        UnityEngine.Profiling.Profiler.BeginSample("Get Lua Data test ===4");
        LuaTable hero3 = table.Get<int, LuaTable>(3);
        TableDataHeroPojo tb1Class3 = hero3.Cast<TableDataHeroPojo>();
        UnityEngine.Profiling.Profiler.EndSample();

        UnityEngine.Profiling.Profiler.BeginSample("Get Lua Data test ===5");
        LuaTable hero4 = table.Get<int, LuaTable>(4);
        TableDataHeroPojo tb1Class4 = hero4.Cast<TableDataHeroPojo>();
        UnityEngine.Profiling.Profiler.EndSample();

        UnityEngine.Profiling.Profiler.BeginSample("Get Lua Data test ===6");
        LuaTable hero5 = table.Get<int, LuaTable>(5);
        TableDataHeroPojo tb1Class5 = hero5.Cast<TableDataHeroPojo>();
        UnityEngine.Profiling.Profiler.EndSample();

        UnityEngine.Profiling.Profiler.BeginSample("Get Lua Data test ===7");
        LuaTable hero6 = table.Get<int, LuaTable>(6);
        TableDataHeroPojo tb1Class6 = hero6.Cast<TableDataHeroPojo>();
        UnityEngine.Profiling.Profiler.EndSample();


        Debug.Log("hero id = " + tb1Class.nHeroId);
        Debug.Log("hero id = " + tb1Class2.nHeroId);
        Debug.Log("hero id = " + tb1Class3.nHeroId);
        Debug.Log("hero id = " + tb1Class4.nHeroId);
        Debug.Log("hero id = " + tb1Class5.nHeroId);
        Debug.Log("hero id = " + tb1Class6.nHeroId);
    }
}

Table对应数据Class
[C#] 纯文本查看 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using XLua;

public class TableDataHeroPojo : LuaDataInfo
{
    private static string TableName = "Hero";
    private static LuaTable Table = null;

    public int nHeroId;
    public string sName;
    public int nRare;
    public int nType;
    public int nDefaultStar;
    public bool bIsOpen;

    public override object Marshal(int table_id_)
    {
        TableID = table_id_;
        if (Table == null)
        {
            string path = string.Format(GameConfig.LuaPath, lua_hero);
            lua_.DoString(path);
            Table = lua_.Global.GetInPath<LuaTable>(TableName);
        }
        if (Table == null)
        {
            Debug.Log(TableName + "  load success");
            return null;
        }
        lua_table_ = Table.Get<int, LuaTable>(TableID);
        if (lua_table_ == null)
        {
            Debug.Log("load success  " + TableID);
            return null;
        }
        TableDataHeroPojo data = lua_table_.Cast<TableDataHeroPojo>();
        return data;
    }
}

public class LuaDataInfo 
{
    protected static LuaEnv lua_;
    protected string lua_hero = "DataConfig/Hero";
    protected LuaTable lua_table_;

    public static void RegisterToLua(LuaEnv lua)
    {
        lua_ = lua;
        lua_.AddLoader(new LuaLoader((ref string filepath) =>
        {
            filepath = string.Format(GameConfig.LuaLoaderPath, Application.streamingAssetsPath, filepath);
            if (File.Exists(filepath))
            {
                return File.ReadAllBytes(filepath);
            }
            else
            {
                return null;
            }
        }));
    }
    
    public int TableID { get; set; }

    public virtual object Marshal(int table_id_)
    {
        return true;
    }
}

1.第一次DoString开销比较大,主要在File的操作。解决方案:所有lua文件做成大文件,File的open操作打开一次,持有句柄。(test===1)
2.重复Get已经DoString的表仍然有1K的GC,主要在LuaTable.Get操作里。解决方案:在LuaDataInfo里有个Marshal,用来序列化数据,并且能保证只Get一次表。每个表有一个static的表名和LuaTable对表的引用。(test===2)
3.重复获取同一个index的子表,GC开销较大,主要在Activator.CreateInstance里。解决方案:缓存已经读取的子表,每次先从字典里查找,找到直接返回,找不到再走整个读取流程(test===4~8)
4.返回缓存的子表,GC仍然不可忽略,60B。由于我使用的是type的name做key,所以会有一个字符串60B的开销,后面直接用type做key,可以省略这部分开销,但是时间略有消耗

优化点:
1.分表,将大的数据表分成多个
2.读取表的时候,按字段读取,而不是一次性解析整条数据
3.预加载一些道具、活动、任务表
4.注意缓存表的内存占用
5.注意lua堆栈

lua读取数据表.png
lua读取数据表.png

回复

使用道具 举报

7日久生情
2535/5000
排名
3448
昨日变化
2

2

主题

1780

帖子

2535

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
241666
好友
0
蛮牛币
10199
威望
0
注册时间
2017-9-6
在线时间
362 小时
最后登录
2018-6-7
发表于 2017-12-21 06:55:48 来自Mobile--- | 显示全部楼层
感谢分享

回复

使用道具 举报

7日久生情
1561/5000
排名
3246
昨日变化
11

3

主题

853

帖子

1561

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
246489
好友
1
蛮牛币
2596
威望
0
注册时间
2017-9-28
在线时间
295 小时
最后登录
2018-7-19

活力之星迈向小康

发表于 2017-12-21 08:30:29 | 显示全部楼层
谢谢分享

回复

使用道具 举报

7日久生情
2157/5000
排名
3329
昨日变化
18

8

主题

1099

帖子

2157

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
168159
好友
4
蛮牛币
5055
威望
0
注册时间
2016-9-12
在线时间
642 小时
最后登录
2018-7-19
发表于 2017-12-21 09:30:00 | 显示全部楼层

回复

使用道具 举报

5熟悉之中
649/1000
排名
4433
昨日变化
27

0

主题

151

帖子

649

积分

Rank: 5Rank: 5

UID
254155
好友
0
蛮牛币
866
威望
0
注册时间
2017-11-13
在线时间
198 小时
最后登录
2018-7-19
发表于 2017-12-21 09:53:12 | 显示全部楼层
{:90:}

回复

使用道具 举报

4四处流浪
371/500
排名
12546
昨日变化
7

3

主题

133

帖子

371

积分

Rank: 4

UID
216830
好友
2
蛮牛币
217
威望
0
注册时间
2017-4-9
在线时间
172 小时
最后登录
2018-7-13
发表于 2017-12-21 10:00:50 | 显示全部楼层
谢谢分享

回复

使用道具 举报

6蛮牛粉丝
1290/1500
排名
3032
昨日变化
19

12

主题

604

帖子

1290

积分

Rank: 6Rank: 6Rank: 6

UID
218409
好友
3
蛮牛币
4818
威望
0
注册时间
2017-4-19
在线时间
248 小时
最后登录
2018-7-19
发表于 2017-12-21 10:20:20 | 显示全部楼层

谢谢分享

回复

使用道具 举报

7日久生情
3060/5000
排名
2413
昨日变化
7

0

主题

2082

帖子

3060

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
219676
好友
1
蛮牛币
2502
威望
0
注册时间
2017-7-12
在线时间
440 小时
最后登录
2018-7-19

活力之星

发表于 2017-12-21 10:21:58 | 显示全部楼层
谢谢分享

回复

使用道具 举报

排名
796
昨日变化
1

34

主题

811

帖子

3494

积分

Rank: 9Rank: 9Rank: 9

UID
76248
好友
21
蛮牛币
18791
威望
0
注册时间
2015-2-28
在线时间
929 小时
最后登录
2018-7-15

专栏作家蛮牛译员活力之星七夕浪漫情人

发表于 2017-12-21 11:13:21 | 显示全部楼层
谢谢分享,很重要的细节处理

回复 支持 反对

使用道具 举报

排名
13216
昨日变化
8

0

主题

8

帖子

89

积分

Rank: 2Rank: 2

UID
224451
好友
0
蛮牛币
13
威望
0
注册时间
2017-5-31
在线时间
23 小时
最后登录
2018-6-20
发表于 2017-12-21 11:22:06 | 显示全部楼层
zhichi                        

回复 支持 反对

使用道具 举报

7日久生情
1841/5000
排名
2552
昨日变化
10

1

主题

898

帖子

1841

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
216583
好友
2
蛮牛币
3120
威望
0
注册时间
2017-4-7
在线时间
432 小时
最后登录
2018-7-19
发表于 2017-12-21 13:17:05 | 显示全部楼层
谢谢分享

回复

使用道具 举报

5熟悉之中
679/1000
排名
4494
昨日变化
3

0

主题

199

帖子

679

积分

Rank: 5Rank: 5

UID
164084
好友
0
蛮牛币
1499
威望
0
注册时间
2016-8-24
在线时间
189 小时
最后登录
2018-5-23
发表于 2017-12-21 14:17:33 | 显示全部楼层
谢谢分享,学习了

回复

使用道具 举报

2初来乍到
117/150
排名
21419
昨日变化
5

1

主题

67

帖子

117

积分

Rank: 2Rank: 2

UID
252344
好友
0
蛮牛币
94
威望
0
注册时间
2017-11-3
在线时间
29 小时
最后登录
2018-4-6
发表于 2017-12-21 16:59:56 | 显示全部楼层
感谢分享

回复

使用道具 举报

7日久生情
1676/5000
排名
2689
昨日变化
6

40

主题

721

帖子

1676

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
219600
好友
7
蛮牛币
2381
威望
0
注册时间
2017-4-27
在线时间
429 小时
最后登录
2018-7-19
发表于 2017-12-21 17:35:14 | 显示全部楼层
感谢分享
[发帖际遇]: fengjing 发帖时在路边捡到 1 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复

使用道具 举报

5熟悉之中
823/1000
排名
5386
昨日变化
3

0

主题

426

帖子

823

积分

Rank: 5Rank: 5

UID
146677
好友
9
蛮牛币
2690
威望
0
注册时间
2016-4-25
在线时间
161 小时
最后登录
2018-7-13
QQ
发表于 2017-12-21 17:43:12 | 显示全部楼层
谢谢分享,借鉴一下

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

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