• 《2016年度中国手游报告:梦幻西游手游是最大赢家》 移动游戏企业家联盟发布的《2016全球移动游戏产业白皮书》报告显示,2016年全球移动游戏市场达到369亿美元,占全体游戏市场37%市场份额,其中,中国、美国、...


    《2016年度中国手游报告:梦幻西游手游是最大赢家》

    移动游戏企业家联盟发布的《2016全球移动游戏产业白皮书》报告显示,2016年全球移动游戏市场达到369亿美元,占全体游戏市场37%市场份额,其中,中国、美国、德国、俄罗斯以及巴西作为全球各地区游戏大国,一直是全球游戏市场的中坚力量,那么在过去的2016年,在中国,哪些游戏在称王称霸,整个市场发展趋势又如何?

    ►阅读全文


    Cocos3D与Shader从入门到精通

    讲师:卞安

    本课程是由知名Cocos2d-x专家“火云红孩儿”发布的《Cocos2d-x开发3D游戏》与《Shader从入门到精通》视频教程。

    ►开始学习


    cocos2d-x高级渲染技术

    讲师:传智

    本课程讲述cocos2d-x中的渲染技巧,包括混合、裁减等,还不快来为自己get新技能。

    ►开始学习


    游戏引擎初级篇

    讲师:张立铜

    本套餐课程使用标准C++语言 + OpenGLES2.0规范,进行跨平台开发,支持多系统。 从无到有介绍游戏引擎开发中用到的常用技术,从三维理论开始,到高级的算法,场景提出算法,摄像机控制,路径动画,关键帧动画,骨骼动画,地形的编辑,地形的刷绘,GUI界面原型系统等方面进行详细的介绍。

    ►开始学习


    移动端游戏技术分享

    讲师:姜雪伟

    该套餐主要是针对移动端游戏开发技术讲解,移动端海水实现,实时阴影,3D残影实现。

    ►开始学习


    Cocos2d-x 实战演练基础篇

    讲师:王磊

    本课程结合一个实例连连看游戏,讲解cocos2d-x最新3.6版引擎的基础知识和实际用法。

    ►开始学习


    [更多相关文章]

    展开全文
  • 最近研究了一下梦幻西游手游版的资源打包方式其中就用到了Hash表索引 一般的luac文件反编译工作到此就结束了,可梦幻西游手游的luac文件不是一般的luac,直接用上面的工具肯定会报错 这是因为梦幻西游手游版修改了...

    最近研究了一下梦幻西游手游版的资源打包方式其中就用到了Hash表索引


    0x00 先看看梦幻西游手游的资源目录

    ┌─HashRes

    ┊        ├─00

    ┊               ├─000000

    ┊               ├─     ┊

    ┊               ├─FFFFFF

    ┊        ├─01

    ┊        ├─┊

    ┊        ├─FF

    HashRes中的文件夹名称和子文件名组合成了一个4字节的Hash名,如下图反编译so文件后看到的寻找资源的Hash路径


    由于Hash不可逆,且没有资源文件名单,文件名就用hash表示吧


    0x01 在HashRes文件夹里,通过对文件头的分析主要的有大致几类文件,其它类型可以忽略

    &&__sign_of_g18_enc__@@(加密的图片文件,有的用了Lzma压缩)

    L:grxx__sign_of_g18_enc__(加密的luac脚本文件,有的用了Gzip压缩)

    __sign_of_g18_enc__(加密的luac脚本文件)

    LuaQ(luac脚本文件)

    FSB5(音频文件)

    JSON (Json文件)

    XML (xml配置文件)



    手游版的资源和网页版的资源相似,略有不同但加密方式是相同的


    0x02 先分析图片是怎样加载的,在IDA中反汇编中定位到cocos2d::Image::initWithImageData()这个方法



    在解密后,紧接着判断了该图片是否压缩了,如果压缩了就解压缩,ccz和gzip是coocs2dx源码中本来就有的,lzma是梦幻后加的



    继续分析,解压后先通过cocos2d::Image::detectFormat()这个方法判断是什么类型的图片,然后根据类型加载这个图片


    整个图片资源的加载流程是



    0x03 lua的加载比图片加载稍微复杂一丢丢,定位到cocos2d::LuaStack::luaLoadBuffer()这个方法


    首先注意的是strncmp ( const char * str1, const char * str2, size_t n )的返回值:若str1与str2的前n个字符相同,则返回0

    lrc4这个类就是解密lua的

    整个lua资源的加载流程是


    上面这个图左侧部分是指 L:grxx__sign_of_g18_enc__   右侧部分是指 __sign_of_g18_enc__ 

    最终得到的lua资源文件为lua编译过的二进制文件,并不是lua源码,想得到源码就得反编译luac文件。


    0x04 在反编译luac之前,先来分析下lua5.1.4(梦幻西游手游用的是这个版本)源码中是如何加载的

    lua5.1.4 源码下载地址 http://www.lua.org/ftp/


    通过分析源码可知

    #define LUA_SIGNATURE "\033Lua" 33(八进制) = 0x1B(十六进制)

    在f_parser这个方法中 通过判断lua文件的第一个字节是否为LUA_SIGNATURE[0]也就是0x1B

    若是0x1B那么读取的数据是Binary(二进制luac) 调用luaU_undump,否则为Text(源码) 调用luaY_parser,它们最终都会返回一个Proto*类型。


    下面分析一下lua5.1 二进制格式 由两部分组成:头部块和顶层函数

    头部块包含12字节

    头部签名 4字节 0x1B 0x4C 0x75 0x61
    版本号 1字节 0x51 (高十六位是主版本号,低十六位是次版本号)
    版本格式 1字节 0x00 (0=官方版本)
    字节序标志 1字节 0x01 (默认为1 1=大端 0=小端)
    int大小 1字节 0x04 (默认为4 单位为字节)
    size_t大小 1字节 0x04 (默认为4 单位为字节)
    Instruction大小 1字节 0x04 (默认为4 单位为字节)
    lua_Number大小 1字节 0x08 (默认为8 单位为字节)
    整数标志 1字节 0x00 (默认为0 0=浮点数 1=整数)

    顶层函数(持有函数的所有相关数据 关于列表的详细信息这里就不展示了)
    源代码名称长度(size_t) 4字节 例如 0x08 0x00 0x00 0x00 长度为8
    源代码名称 size_t字节 例如 0x40 0x64 0x62 0x2E 0x6C 0x75 0x61 0x00  以0x00结尾
    定义开始行(int) 4字节 0x00 0x00 0x00 0x00 (主代码块默认为 0)
    定义结束行(int) 4字节 0x00 0x00 0x00 0x00 (主代码块默认为 0)
    upvalue数量 1字节 0x00 (主代码块默认为 0)
    参数数量 1字节 0x00 (主代码块默认为 0)
    is_varagr标志 1字节 1=VARARG_HASARG 2=VARARG_ISVARARG 4=VARARG_NEEDSARG
    最大栈尺寸 1字节 使用的寄存器数量
    指令列表   [指令大小] [虚拟机指令]
    常量列表   [常量大小] [常量类型 常量值]
    函数原型列表   [函数原型列表大小] [函数原型数据]
    源码位置列表   [源码位置列表大小] [表索引对应指令位置]  可选的调试数据
    局部变量列表   [局部变量列表大小] [局部变量名 作用域起点 作用域终点]  可选的调试数据
    upvalue列表   [upvalue列表大小] [upvalue的名字]  可选的调试数据


    关于luac的反编译工具,网上开源的代码有

    luadec51 (C++) 下载地址 https://github.com/sztupy/luadec51 (有进行变量分析,但少了很多模式匹配,很容易出错)

    luadec (C++) 下载地址 https://github.com/viruscamp/luadec (属于luadec51的分支)

    unluac (Java) 下载地址 https://github.com/viruscamp/unluac (当程序有调试符号时,它是最好的选择,但它并没有进行变量分析)

    LuaAssemblyTools (lua) 下载地址 https://github.com/mlnlover11/LuaAssemblyTools


    一般的luac文件反编译工作到此就结束了,可梦幻西游手游的luac文件不是一般的luac,直接用上面的工具肯定会报错

    这是因为梦幻西游手游版修改了lua虚拟机中的opcode(字节码)

      lua5.1.4 梦幻西游
    OP_MOVE 0 25
    OP_LOADK 1 19
    OP_LOADBOOL 2 9
    OP_LOADNIL 3 0
    OP_GETUPVAL 4 22
    OP_GETGLOBAL 5 28
    OP_GETTABLE 6 20
    OP_SETGLOBAL 7 26
    OP_SETUPVAL 8 30
    OP_SETTABLE 9 15
    OP_NEWTABLE 10 5
    OP_SELF 11 27
    OP_ADD 12 33
    OP_SUB 13 1
    OP_MUL 14 29
    OP_DIV 15 11
    OP_MOD 16 13
    OP_POW 17 23
    OP_UNM 18 2
    OP_NOT 19 31
    OP_LEN 20 6
    OP_CONCAT 21 34
    OP_JMP 22 35
    OP_EQ 23 36
    OP_LT 24 17
    OP_LE 25 7
    OP_TEST 26 16
    OP_TESTSET 27 4
    OP_CALL 28 21
    OP_TAILCALL 29 18
    OP_RETURN 30 12
    OP_FORLOOP 31 14
    OP_FORPREP 32 10
    OP_TFORLOOP 33 24
    OP_SETLIST 34 8
    OP_CLOSE 35 32
    OP_CLOSURE 36 3
    OP_VARARG 37 37

    至于什么是lua虚拟机的opcode 自己百度谷歌吧 我就不讲解了...

    但是如何在IDA中寻找opcode可以和大家分享一下

    第一种:通过上面对lua_load的分析,在IDA中直接定位lua_load然后一直跟到f_parser进入luaU_undump→LoadFunction→luaG_checkcode→symbexec,在symbexec中有个switch的循环里面有部分的opcode,通过和源码中的逻辑比对找出对应的opcode

    第二中:在lua源码lvm.c中有个luaV_execute方法,其中的switch的循环里面有所有所对应的opcode。可以通过lua_call→luaD_call→luaV_execute定位该方法,通过和源码中的逻辑比对找出对应的opcode

    建议第一种和第二种一起使用

    若大家有更好的方法,欢迎分享,可以在评论中回复

    最后把反编译源代码中默认的opcode顺序修改成得到的opcode顺序,然后编译工具。(注意luadec或luadec51还要修改lua源码lopcodes.c中luaP_opmodes里面的顺序 )


    0x05 根据上面的分析后,我用C#写了个提取工具,这里只给出关键代码

    提取和回写流程逻辑片段

    public void FindFile(string dirPath, OperationType type) //参数dirPath为指定的目录 
    {
        DirectoryInfo Dir = new DirectoryInfo(dirPath);
        try
        {
            //查找子目录 
            foreach (DirectoryInfo d in Dir.GetDirectories())
            {
                FindFile(Dir + "\\" + d.ToString(), type);
            }
    
            //查找文件 
            foreach (FileInfo f in Dir.GetFiles("*.*"))
            {
                if (type == OperationType.Decrypt) //解密资源
                    ReadRes(f);
                else if (type == OperationType.Encrypt) //回写资源
                    ExportRes(f);
                else
                    return;
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
    
    //写入资源文件
    private void ExportRes(FileInfo f)
    {
        FileStream inStream = new FileStream(f.FullName, FileMode.Open, FileAccess.ReadWrite);
    
        byte[] bytes = new byte[inStream.Length];
        inStream.Read(bytes, 0, bytes.Length);
        inStream.Close();
    
        if (FileFormat.IsLUAQ(bytes))
        {
            byte[] gzipBytes = Compress.GzipCompress(bytes); //Gzip压缩
            byte[] lrcBytes = LRC4_S(gzipBytes); //LRC4加密
            byte[] headBytes = Encoding.Default.GetBytes("L:grxx__sign_of_g18_enc__");
            byte[] resBytes = new byte[headBytes.Length + lrcBytes.Length];
            Array.Copy(headBytes, 0, resBytes, 0, headBytes.Length);
            Array.Copy(lrcBytes, 0, resBytes, headBytes.Length, lrcBytes.Length);
    
            OutResFile(f, resBytes, string.Empty);
        }
    }
    
    //提取资源文件
    private void ReadRes(FileInfo f)
    {
        FileStream inStream = new FileStream(f.FullName, FileMode.Open, FileAccess.ReadWrite);
    
        byte[] resBytes;
        byte[] bytes = new byte[inStream.Length];
        inStream.Read(bytes, 0, bytes.Length);
        inStream.Close();
    
        if (Encoding.Default.GetString(bytes).Contains("&&__sign_of_g18_enc__@@"))
        {
            byte[] outBytes;
            ImageResDecrypt(bytes, out outBytes);
    
            if (Encoding.Default.GetString(outBytes).Contains("LZMA"))
            {
                byte[] targetBytes = new byte[outBytes.Length - 4];
                Array.Copy(outBytes, 4, targetBytes, 0, outBytes.Length - 4);
                resBytes = CheckCompress(targetBytes);
            }
            else
            {
                resBytes = CheckCompress(outBytes);
            }
        }
        else if (Encoding.Default.GetString(bytes).Contains("L:grxx"))
        {
            byte[] targetBytes = new byte[bytes.Length - 25];
            Array.Copy(bytes, 25, targetBytes, 0, bytes.Length - 25);
            resBytes = CheckCompress(LRC4_S(targetBytes));
        }
        else if (Encoding.Default.GetString(bytes).Contains("__sign_of_g18_enc__"))
        {
            byte[] targetBytes = new byte[bytes.Length - 19];
            Array.Copy(bytes, 19, targetBytes, 0, bytes.Length - 19);
            resBytes = CheckCompress(LRC4_S(targetBytes));
        }
        else
        {
            resBytes = bytes;
        }
    
        OutResFile(f, resBytes, FileFormat.GetExtension(resBytes));
    }
    
    //检测是否压缩
    private byte[] CheckCompress(byte[] bytes)
    {
        if (FileFormat.CheckFormat(bytes) == FileType.LZMA)
            return Compress.LZMADecompress(bytes);
        else if (FileFormat.CheckFormat(bytes) == FileType.GZip)
            return Compress.GzipDecompress(bytes);
        else
            return bytes;
    }
    
    //保存文件
    private void OutResFile(FileInfo f, byte[] bytes, string extension)
    {
        string outPath = Path.Combine(f.DirectoryName, Path.GetFileNameWithoutExtension(f.FullName) + extension);
    
        using (FileStream outStream = new FileStream(outPath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
        {
            outStream.Seek(0, SeekOrigin.Begin);
            outStream.Write(bytes, 0, bytes.Length);
        }
    }
    
    //图片资源解密算法
    private void ImageResDecrypt(byte[] sourceBytes, out byte[] resBytes)
    {
        byte[] targetBytes = new byte[sourceBytes.Length - 23];
        Array.Copy(sourceBytes, 23, targetBytes, 0, sourceBytes.Length - 23);
    
        int length = targetBytes.Length < 128 ? targetBytes.Length : 128;
        for (int i = 0; i < length; i++)
        {
            targetBytes[i] = (byte)(targetBytes[i] ^ (i - 2));
        }
    
        resBytes = targetBytes;
    
        if (Encoding.Default.GetString(targetBytes).Contains("&&__sign_of_g18_enc__@@"))
        {
            //递归是因为在ios版本中有的图片被重复加密了好几次 - -||
            ImageResDecrypt(targetBytes, out resBytes);
        }
    }
    
    //初始化LRC4
    private byte[] LRC4()
    {
        byte[] bytes = new byte[256];
        int v1 = 0;
    
        for (int i = 0; i < 256; i++)
        {
            bytes[i] = (byte)i;
        }
    
        for (int i = 0; i < 256; i++)
        {
            v1 = (int)(v1 + bytes[i] + ((0x9E3779B9 ^ (i >> 2)) >> 8 * (i & 3)));
            byte[] b = BitConverter.GetBytes(v1);
            if (i != b[0])
            {
                bytes[i] ^= bytes[b[0]];
                bytes[b[0]] = (byte)(bytes[i] ^ bytes[b[0]]);
                bytes[i] ^= bytes[b[0]];
            }
        }
    
        return bytes;
    }
    
    //解密LRC4
    private byte[] LRC4_S(byte[] bytes)
    {
        byte[] lrc = LRC4();
        byte last = 0;
    
        for (int i = 0; i < bytes.Length; i++)
        {
            int index = (i + 1) % 256;
            byte[] v1 = BitConverter.GetBytes(lrc[index] + last);
            last = v1[0];
    
            if (index != last)
            {
                lrc[index] = (byte)(lrc[index] ^ lrc[last]);
                byte v2 = (byte)(lrc[index] ^ lrc[last]);
                lrc[last] = v2;
                lrc[index] ^= v2;
            }
    
            byte[] v3 = BitConverter.GetBytes(lrc[last] + lrc[index]);
            bytes[i] = (byte)(lrc[v3[0]] ^ bytes[i]);
        }
    
        return bytes;
    }
    解压缩算法片段

    //压缩Gzip文件
    public static byte[] GzipCompress(byte[] bytes)
    {
        byte[] result = null;
        using (MemoryStream inStream = new MemoryStream(bytes))
        {
            using (MemoryStream outStream = new MemoryStream())
            {
                using (GZipOutputStream gZipOutputStream = new GZipOutputStream(outStream))
                {
                    gZipOutputStream.Write(bytes, 0, bytes.Length);
                }
    
                result = outStream.ToArray();
            }
        }
    
        return result;
    }
    
    //解压Gzip文件
    public static byte[] GzipDecompress(byte[] bytes)
    {
        byte[] result;
        using (MemoryStream inStream = new MemoryStream(bytes))
        {
            using (GZipInputStream gZipInputStream = new GZipInputStream(inStream))
            {
                using (MemoryStream outStream = new MemoryStream())
                {
                    byte[] array = new byte[4096];
                    int num;
                    while ((num = gZipInputStream.Read(array, 0, array.Length)) != 0)
                    {
                        outStream.Write(array, 0, num);
                    }
                    result = outStream.ToArray();
                }
            }
        }
    
        return result;
    }
    
    //解压LZMA文件
    public static byte[] LZMADecompress(byte[] bytes)
    {
        byte[] result;
        using (MemoryStream inStream = new MemoryStream(bytes))
        {
            using (MemoryStream outStream = new MemoryStream())
            {
                Decoder coder = new Decoder();
                byte[] properties = new byte[5];
                inStream.Read(properties, 0, 5);
    
                byte[] fileLengthBytes = new byte[8];
                inStream.Read(fileLengthBytes, 0, 8);
                long fileLength = BitConverter.ToInt64(fileLengthBytes, 0);
    
                coder.SetDecoderProperties(properties);
                coder.Code(inStream, outStream, inStream.Length, fileLength, null);
                result = outStream.ToArray();
            }
        }
    
        return result;
    }

    注意在Android平台下纹理图片格式为PKM,iOS平台下纹理图片格式为PVR

    FSB音频可以用FsbExtractor软件提取

    PKM格式文件可以用Mali Texture Compression Tool软件中的etcpack.exe进行批处理转换成png

    PVR格式文件可以用TexturePacker软件中的TexturePacker.exe(需要破解版)进行批处理转换成png


    PKM转PNG(path路径改为自己的etcpack.exe所在路径)

    @echo off
    path %path%;"D:\Program Files\ARM\Mali Developer Tools\Mali Texture Compression Tool\bin"
    
    for /f "usebackq tokens=*" %%d in (`dir /s /b *.pkm`) do (
    etcpack.exe "%%d" . -f RGBA8 -ext PNG
    )
    
    pause


    PVR转PNG(path路径改为自己的TexturePacker.exe所在路径)

    @echo off
    
    path %path%;"D:\Program Files\CodeAndWeb\TexturePacker\bin"
    
    for /f "usebackq tokens=*" %%d in (`dir /s /b *.pvr *.pvr.ccz *.pvr.gz`) do (
    TexturePacker.exe "%%d" --sheet "%%~dpnd.png" --data "%%~dpnd.plist" --opt RGBA8888 --allow-free-size --algorithm Basic --no-trim --dither-fs
    ::需要翻转图片 就把下面的::去掉
    ::NConvert.exe -out png -yflip "%%~dpnd.png"
    )
    
    pause

    需要TexturePacker.exe,NConvert.exe,etcpack.exe的可以去网盘下载

    链接:http://pan.baidu.com/s/1eRKjsbg 密码: h332


    资源提取工具下载

    链接: http://pan.baidu.com/s/1bo8j1Rx 密码: f257

    展开全文
  • https://gitee.com/IT_CTO/menghuanxiyou
    展开全文
  • 摘要: 去年,网易游戏学院成立并举行首个公开日活动,现场众多重量级嘉宾的干货分享深受广大游戏从业者的认可。6月27日,网易游戏学院第二届公开日活动在广州网易大楼开启,本次为网易游戏学院的技术专场,分享主题...
    摘要: 去年,网易游戏学院成立并举行首个公开日活动,现场众多重量级嘉宾的干货分享深受广大游戏从业者的认可。6月27日,网易游戏学院第二届公开日活动在广州网易大楼开启,本次为网易游戏学院的技术专场,分享主题为《技 ...
     

    【网易公开日】《梦幻西游》手游服务器如何实现200万玩家同时在线?(技术篇)

    去年,网易游戏学院成立并举行首个公开日活动,现场众多重量级嘉宾的干货分享深受广大游戏从业者的认可。6月27日,网易游戏学院第二届公开日活动在广州网易大楼开启,本次为网易游戏学院的技术专场,分享主题为《技术进步引发的灵感革命》。

     

    以下为游戏陀螺整理的部分内容分享。

     

    3 月26日,《梦幻西游》手游登陆iOS平台,它在上线两个多月的时间里,就创造了2000万注册用户,204万玩家同时在线,全球App Annie畅销榜第四的中国手游最佳纪录。而这其中少不了网易技术团队的支持。

     

     

    导读:

     

    说到手游中的重度游戏MMO,如何提供一个稳定高效的手游MMO服务器引擎?梦幻西游手游如何做到万人同时在线?手游和端游在MMO上有何不同?AOI如何实现?通过什么样的开发流程就可以保证在产品上线时稳定,不会出现大面积DOWN机的情况?

     

    主题:《百万在线的基石——梦幻手游服务器架构》

     

    分享嘉宾:刘强

    梦幻事业部高级技术总监及软件设计专家

    04年至13年,担任《梦幻西游》端游服务端主程,2014年至今,担任《梦幻西游》手游主程。

     

    具体内容:

     

    一、《梦幻西游》手游引擎水准

     

    二、aoi实现

     

    那么mmo手游aoi的特点是什么?

     

    • 更多的传送,比较少的走路

    • 客户端受制于硬件,同屏显示人数有限

    • npc视野类玩法很少基本可忽略,绝大部分aoi是user

     

    同场景1w人压测时的效果


    采用解决措施后的效果

     

    三、一些基础模块的实现

    • udb

    • 行为树

    • 语音

     

    Udb? Why?

    • 退出存盘+定时存盘的机制有性能瓶颈,并且有down机回档的风险。

    • 玩家数据备份不能达到查看任意时刻备份的运营需求。

    • 64位机器内存足够大已经可以完全缓存一周所有登陆的玩家了。

     

     

    AI行为数(战斗)

     

    四、如何优化引擎和提升引擎的健壮性

    • 内存

    • CPU

    • io

    • 延迟

     

    五、流程上可以提供什么助力 (消除掉低级问题)

     

     

    -------今日推荐-------

     

     

    详情请点击【阅读原文】

    ↓↓↓

    阅读原文 

     
     
    展开全文
  • 看下面的这么一段日志,就知道UI肯定是cocos2dx做的,原来cocos2dx还没死呀 [19:53:58.751] M [COCOSUI] NewType detour.scene_detour: 0xc9945340 [19:53:58.753] M [COCOSUI] NewType collisi...

    不好意思真不是Unity3d

    实在是不错的说,就是不知道3D引擎是否网易自己的引擎

    看下面的这么一段日志,就知道UI肯定是cocos2dx做的,原来cocos2dx还没死呀

    [19:53:58.751] M [COCOSUI] NewType detour.scene_detour: 0xc9945340
    [19:53:58.753] M [COCOSUI] NewType collision.scene_col: 0xe32bd860
    [19:53:58.753] M [COCOSUI] NewType collision.col_object: 0xe32bd780
    [19:53:58.753] M [COCOSUI] NewType collision.vehicle: 0xc9945500
    [19:53:58.800] M   <SCRIPT> begin game_entry.start_game
    [19:53:58.835] M [COCOSUI] -----Load output\examples_new.fev succeed!
    [19:53:58.850] M   <SCRIPT> <helper.I18nHelper.I18nHelper object at 0xc22ba670> <ui.I18nHelperUI.I18nHelperUI object at 0xc22ba830>
    [19:53:58.850] M   <SCRIPT> h2.logger=<logging.Logger object at 0xc22ba030>
    [19:54:02.839] M   <SCRIPT> {"display_version": "1.3.6.2491.cocos", "files": {"script.npk": [7579892, "74ca0768d63d42227bb8e79f4cf3ea11"], "res/output/output_player12.fsb": [912512, "5e12f1e339a9a355361845f592182e8e"], "res/output/output_shouji.fsb": [54336, "c56b78c4abf615290152c2b433077a91"], "res.npk": [77129324, "739a452ae505171442430721ed2f0cb2"], "res/output/vo_chat.fsb": [217952, "055f390f53a4bc649fba02f5f2e86282"], "res/output/vo_zhaohuanshou.fsb": [395520, "f74c497a17d7398ce16fa637a85bbe49"], "res/output/vo.fsb": [1087392, "70d239d4fb7c23fe479cbe93cf62d455"], "res/output/output_16player_home.fsb": [507296, "7c75135163db5da509b0fda72b5a1c9e"], "res/output/zuoqi.fsb": [688224, "f3dafd2aa68f1ec3e2fc86b9da3b0dc6"], "res/output/examples_new.fev": [120528, "6a4cbecf216778fbc9d4ab310f6ee809"], "res/output/amb.fsb": [311840, "33a07f543de1d048cdfa33fd03109081"]}, "review_engine_ver": ["1.1.1.11111", "1.2.8.104210", "1.3.3.124780", "1.3.7.140740"], "need_engine_ver": ["1.3.3.100000", "wandoujia-1.3.3.100000-6.0.6"], "npk_version": "mhws_patchlist_cocos_android", "ignore_engine_ver": ["1.1.1.11111", "1.3.0.117192", "1.3.3.124780", "1.3.7.140740"], "res_rev": "293137", "script_rev": "293137", "engine_ver": "1.3.6.132663", "res_ver": "1.3.6.2491"}
    [19:54:02.841] M   <SCRIPT> set dump version: 1.3.6(1.3.6.2491)
    [19:54:02.845] M   <SCRIPT> Set model=generic_a15 to render_lv=0

    其实网易的引擎应该早做到接各种其他框架了,别看网易财报那么惨,好像只是换换皮没什么,换皮快也是技能一种不是么,以网易的人才,外接一个cocos2dx做UI并不是什么稀奇的事情

    所以说,天下武功,唯快不破,并没有什么一成不变的道理,也没有挖掘机这家比那家强的.

    展开全文
  • 之前一直和朋友在玩手游血族。有一天朋友问我能不能把里面某个角色的立绘拿下来。当时没多想就答应了,以为只要解压找到图片就行了。但是万万没想到,图片竟然打不开(被加密了)。快速分析下载最新的血族apk并解压...
  • Airtest Project是网易自研的游戏自动化项目。Airtest IDE是这个项目的一个IDE,就像...Poco框架是一个类似于Appium的主打游戏自动化框架,支持Unity3D、Cocos2dx等游戏引擎(需要接入Poco-SDK),也可以用于Androi...
  • Lua脚本编写逻辑的手游也是越来越多,如梦幻西游、刀塔传奇、开心消消乐、游龙英雄、奇迹暖暖、疾风猎人、万万没想到等手游。随着Lua手游的增加,其安全性更值得关注,在此归纳一些常用的分析方法,同时介绍一些辅助...
  • 手游行业展望

    2016-09-11 19:30:46
    手游行业经历了前两年的疯狂扩张,现在已经进入收缩阶段,发展形势放缓。作为手游行业从业人员,不了解行情只是闭门造车,恐怕很难做到出门合辙。 本文就对手游行业未来的发展进行展望。 1、3D是大趋势 2、大IP时代...
  • 这篇文章是本人在学习android手游安全时总结的一篇关于lua的文章,不足之处欢迎指正,也欢迎大牛前来交流。本文目录如下: 目录 0. 前言 1. lua脚本在手游中的现状 2. lua、luac、luaJIT三种文件的关系 3. lua...
  • 前言 我从小就喜欢玩游戏,最近玩游戏也好奇游戏到底是怎么做出来的 我是做软件的,用qt能做游戏吗? 既然是搞c++的,我就想了解一下游戏是怎么做出来的 ok想搞游戏开发,所以玩了一下游戏引擎 ...cocos2d-x 是基于M...
  • 对于一个能够蕴藏巨大信息量的游戏产品而言,多为玩家准备一些惊喜的心态,是不会有错的。很多的案例和事实也证明,惊喜会给游戏带来很多产品设计师意想不到的收获,但如果惊喜运用得不好往往会编程惊吓,甚至还会给...
  • 手机游戏资源 特效 显存分析工具 http://blog.sina.com.cn/s/blog_73bed4520102w4tt.html ...【cofface】adb基于最新安卓源码编译修改,兼容其它助手,增加参数...
  • step.1 准备工具 1.adb连接工具(我用的cofface adb ) 【cofface】adb基于最新安卓源码编译修改,兼容其它助手,增加参数,支持识别所有机型 工具详情:... ... 2.Adreno Profiler 基于硬件层面查...
  • 继续上一篇文章继续聊吧,这章内容会比较多,也会附上代码,很多朋友加了群,大家在群里面探讨了很多东西,这让大家都觉得受益匪浅,这便是极好的,废话不多了,精灵... 上图的人物素材来自于网络流传的梦幻西游,...
  • 继续上一篇文章继续聊吧,这章内容会比较多,也会附上代码,很多朋友加了群,大家在群里面探讨了很多东西,这让大家都觉得受益匪浅,这便是极好的,废话不多了,精灵是游戏的重要组成部分,那ARPG里面的精灵必然是要...
  • 眼下一大半的手游,都是採用Unity3D和Cocos2dx开发,那么这里,我们就先来一步步给大家演示,用Unity开发的游戏,怎样通过U8SDK来高速地完毕多家渠道SDK的接入。   Unity研发的手游,仅仅须要调用U8SDK抽象层就...
1 2 3 4
收藏数 70
精华内容 28