Android夜神模拟器

《腾讯斯诺克:客户端计算》

夜神安卓模拟器
NOX,是一个方可让手提式有线电电话机应用程序运转在处理器上的软件,也是总计机玩手游的新一代神器,

此次分享总计,起点于腾讯斯诺克项目,然则不仅仅限于项目本人。固然基于Unity3D,很多事物一样适用于Cocos。本文从以下10大点举办阐释:

与守旧安卓模拟器相比较,基于基于Android5.1.1,包容X86/英特尔,在质量、稳定性、兼容性等方面抱有巨大优势

  1. 架构划设想计

  2. 原生插件/平台互相

  3. 本子与补丁

  4. 用剧本,还是不要?那是1个标题

  5. 能源管理

  6. 属性优化

  7. 异常与Crash

  8. 适配与协作

  9. 调剂及开发工具

  10. 花色运行

1.官网下载地址:

https://www.yeshen.com/

美高梅4688.com 1美高梅4688.com 2美高梅4688.com 3

2.配置模拟器:

默许打开是生硬情势,打开右上角
系统安装->高级设置>设置为手提式有线话机情势,然后设置显示器分辨率

美高梅4688.com 4

 

3.安装app

1).使用adb device查看模拟器是不是连上。

> adb device

 美高梅4688.com 5

2).安装**app到模拟器上

> adb install app文件的路子(拽过来就行)

 

 

 

 

 

1.框架结构划设想计

美高梅4688.com 6

好的架构利用常见项目标几个人集体开发和代码管理,也利用查找错误和末代维护。

  • 框架的抉择:需求根据公司、项目来开始展览精选,没有最好的框架,唯有最合适的框架。

  • 框架的运用:统一的框架能正式大家的行为,相互之间能够相比坦荡切换,可维护性大大升级。除此之外,还是能代码解耦。例如StrangeIOC是一个超轻量级和高度可扩展的决定反转(IoC)框架,专门为C#和Unity编写。已知集团里面使用StrangeIOC框架的7日游有:腾讯斯诺克、开心麻将、植物大战僵尸Online。<https://github.com/strangeioc/strangeioc>

 

借助注入(Dependency Injection,简称DI),是七个关键的面向对象编制程序的法则来收缩总计机程序的耦合难点。信赖注入还有贰个名字称为控制反转(Inversion of Control,英文缩写为IoC)。看重注入是这么1个进度:由于某客户类只依靠于服务类的多少个接口,而不借助于具体服务类,所以客户类只定义3个注入点。在程序运维进程中,客户类不直接实例化具体服务类实例,而是客户类的运维上下文环境尤其组件担当实例化服务类,然后将其注入到客户类中,保险客户类的正规运作。即对象在被创设的时候,由二个周转上下文环境或越发组件将其所依靠的服务类对象的引用传递给它。也足以说,注重被注入到对象中。据此,控制反转是,关于一个对象怎么样获取她所依赖的靶子的引用,这一个权利的反转

 

美高梅4688.com 7

 

StrangeIOC选取MVCS(数据模型 Model,展现视图 View,逻辑控制 Controller,服务Service)结构,通过音讯/信号进行互动和通讯。整个MVCS框架跟flash的robotlegs基本一致,(忽略语言不平等)详细的参照<http://www.cnblogs.com/skynet/archive/2012/03/21/2410042.html>。

  • 数据模型 Model:首要承担数据的积存和大旨数据处理

  • 来得视图 View:主要承担UI界面显示和卡通表现的拍卖

  • 逻辑控制 Controller:首要承担作业逻辑处理,

  • 劳动Service:首要承担独立的网络收发请求等的局地功用。

  • 音信/信号:通过音讯/信号去解耦Model、View、Controller、Service那八种模块,他们中间通过音信/信号举行交互。

  • 绑定器Binder:负责绑定音信处理、接口与实例对象、View与Mediator的附和关系。

  • MVCS Context:能够知道为MVC种种模块存在的上下文,负责MVC绑定和实例的成立工作。

美高梅4688.com 8

腾讯斯诺克客户端项目框架

 

  • 代码目录的组织:诚如客户端用得比较多的MVC框架,怎么划分目录?

    • 先按工作功用区划,再根据 MVC 来划分。”生日蛋糕心语”正是应用的那种形式。
    • 先按 MVC 划分,再根据工作成效划分。”D9″、”婴儿斗场”、”魔法花园”、”腾讯台球”、”欢喜麻将”使用的那种方法。

美高梅4688.com 9

 

基于使用习惯,能够活动选取。个人推举”先按工作功用划分,再按照MVC 来划分”,使得模块更聚焦(高内聚),第三种艺术用多了发现随着项目标运行模块增多,没有第叁种那么好维护。

  • Unity项目目录的团组织:结合Unity规定的部分奇异的用处的文件夹,大家提出Unity项目文件夹组织章程如下。

美高梅4688.com 10

里面,Plugins援救Plugins/{Platform}那样的命名规范:

  • Plugins/x86
  • Plugins/x86_64

  • Plugins/Android

  • Plugins/iOS

一旦存在Plugins/{Platform},则加载Plugins/{Platform}目录下的文书,否则加载Plugins目录下的,也正是说,要是存在{Platform}目录,Plugins根目录下的DLL是不会加载的。

其它,财富公司使用分文件夹存款和储蓄”成品能源”及”原料财富”的办法处理:幸免毫无干系能源到场打包,RawResource即原始财富,Resource即成品财富。当然并不限于RawResource那种情势,其余Unity规定的奇特文件夹都能够那样,例如Raw
Standard Assets。

 

  • 商厦组件
-   msdk(sns、支付midas、推送灯塔、监控Bugly)

-   apollo

-   apollo
    voice 
-   xlua

时下大家的腾讯斯诺克、四国军棋都联网了apollo,然则若是服务器不利用apollo框架,不建议客户端接apollo,而是一间接msdk缩小二回封装音信的丢失和带动的不当,方便以往升迁维护,并且减弱导入无用的代码。

 

  • 其三方插件选型
-   NGUI

-   DoTween

-   GIF

-   GAF

-   VectrosityScripts

-   PoolManager

-   Mad
    Level Manger 

 

2.原生插件/平台互相

美高梅4688.com 11

虽说大多时候使用Unity3D进行游戏支付时,只必要使用C#开展逻辑编写。但有时候不可幸免的需求使用和编辑原生插件,例如有个别第2方插件只提供C/C++原生插件、复用已有个别C/C++模块等。有部分效益是Unity3D完成持续,必须求调用Android/iOS原生接口,比如获取手提式无线电话机的硬件新闻(UnityEngine.SystemInfo没有提供的部分)、调用系统的原生弹窗、手提式有线电话机激动等等

 

2.1C/C++插件

美高梅4688.com 12

编纂和平运动用原生插件的多少个关键点:

  • 制造C/C++原生插件
-   导出接口必须是C ABI-compatible函数
-   函数调用约定
  • 在C#中标识C/C++的函数并调用
-   标识
    DLL 中的函数。至少指定函数的名称和包含该函数的 DLL
    的名称。 
-   创建用于容纳
    DLL 函数的类。可以使用现有类,为每一非托管函数创建单独的类,或者创建包含一组相关的非托管函数的一个类。

-   在托管代码中创建原型。使用 **DllImportAttribute** 标识 DLL
    和函数。 用 **static** 和 **extern** 修饰符标记方法。

-   调用
    DLL 函数。像处理其他任何托管方法一样调用托管类上的方法。
  • 在C#中开创回调函数,C/C++调用C#回调函数
-   创建托管回调函数。

-   创建一个委托,并将其作为参数传递给 C/C++函数。**平台调用会自动将委托转换为常见的回调格式。**

-   确保在回调函数完成其工作之前,垃圾回收器不会回收委托。

 

那么C#与原生插件之间是如何兑现互动调用的吧?在弄精晓那一个标题在此以前,我们先看下C#代码(.NET上的先后)的施行的进度:(更详实一点的牵线能够瞻仰我事先写的博客:http://www.cnblogs.com/skynet/archive/2010/05/17/1737028.html

  1. 将源码编写翻译为托管模块;

  2. 将托管模块组合为顺序集;

  3. 加载公共语言运维时CLSportage;

  4. 实践顺序集代码。

注:CL帕杰罗(公共语言运维时,Common Language
Runtime)
和Java虚拟机一样也是二个运作时环境,它承担财富管理(内部存款和储蓄器分配和垃圾收集),并保管应用和底部操作系统之间要求的分手。

为了增强平台的可信赖性,以及为了达到面向事务的电子商务应用所供给的稳定性级别,CL奥迪Q5还要负担别的部分任务,比如监视程序的周转。依照.NET的布道,在CLGL450监视之下运转的程序属于“托管”(managed)代码,而不在CL哈弗之下、直接在裸机上运转的应用也许零部件属于“非托管”(unmanaged)的代码

那多少个经过自个儿计算为下图:

美高梅4688.com 13


.NET上的程序运行

回调函数是托管代码C#中的定义的函数,对回调函数的调用,达成从非托管C/C++代码中调用托管C#代码。那么C/C++是什么样调用C#的吧?大概分为2步,能够用下图表示:

美高梅4688.com 14

  • 将回调函数指针注册到非托管C/C++代码中(C#中回调函数指委托delegate)

  • 调用注册过的托管C#函数指针

相比较托管调用非托管,回调函数方式有个别复杂一些。回调函数分外适合重复执行的职分、异步调用等状态下使用

由地点的介绍能够明白CLLAND提供了C#程序运行的条件,与非托管代码的C/C++交互调用也由它来形成。CL奇骏提供三种用于与非托管C/C++代码举行相互的体制:

  • 阳台调用(Platform
    Invoke,简称PInvoke大概P/Invoke),它使托管代码能够调用从非托管DLL中导出的函数。

  • COM
    互操作,它使托管代码能够由此接口与组件对象模型 (COM)
    对象交互。考虑跨平台性,Unity3D不应用那种方法。

 平台调用注重于元数据在运作时追寻导出的函数并封送(马尔斯hal)其参数。 下图呈现了这一历程。

美高梅4688.com 15

专注:1.除关乎回调函数时以外,平台调用方法调用从托管代码流向非托管代码,而绝不会以相反方向流动。 即使平台调用的调用只好从托管代码流向非托管代码,然则数量仍是可以够看做输入参数或输出参数在四个样子流动。2.图中DLL表示动态库,Windows平台指.dll文件、Linux/Android指.so文件、Mac
OS
X指.dylib/framework文件、iOS中不得不使用.a。后文都使用DLL代指,并且DLL使用C/C++编写

当”平台调用”调用非托管函数时,它将逐条执行以下操作:

  • 搜索包蕴该函数的DLL。

  • 将该DLL加载到内部存款和储蓄器中。

  • 探寻函数在内部存款和储蓄器中的地址并将其参数推到堆栈上,以封送所需的数量(参数)。

注意

只在第一次调用函数时,才会查找和加载 DLL 并查找函数在内存中的地址。iOS中使用的是.a已经静态打包到最终执行文件中。

  • 将控制权转移给非托管函数。

 

 2.2Android插件

美高梅4688.com 16

Java同样提供了那样七个恢宏机制JNI(Java
Native Interface),能够与C/C++相互通信。

注:

  • JNI wiki-https://en.wikipedia.org/wiki/Java\_Native\_Interface,这里不深刻介绍JNI,有趣味的能够自动去斟酌。假若你还不驾驭JNI也不用怕,就像是Unity3D使用C/C++库一样,用起来照旧相比较简单的,只须求领会那么些事物即可。并且Unity3D对C/C++桥接器那块做了包装,提供AndroidJNI/AndroidJNIHelper/AndroidJavaObject/AndroidJavaClass/AndroidJavaProxy方便使用等,具体应用后面在介绍。JNI提供了若干的API完毕了Java和其他语言的通讯(重假如C&C++)。从Java1.1方始,JNI标准改成java平台的一片段,它同意Java代码和其余语言写的代码进行互动,保险本地代码能办事在别的Java 虚拟机环境下。”

  • 用作文化扩充,提一下Android
    Java虚拟机。Android的Java虚拟机有三个,最初阶是Dalvik,前边谷歌在Android
    4.4种类新增一种接纳运转情势AHavalT。A路虎极光T与Dalvik
    之间的基本点分裂是其具有超前 (AOT) 编写翻译格局。 遵照 AOT
    概念,设备安装使用时,DEX 字节代码转换仅举行一遍。 比较于
    Dalvik,那样可完成真正的优势 ,因为 Dalvik 的即时 (JIT)
    编写翻译方法必要在每一遍运维应用时都开始展览代码转换
    。下文中用Java虚拟机代指Dalvik/A陆风X8T。

 

C#/Java都足以和C/C++通讯,那么通过编写制定一个C/C++模块作为桥接,就使得C#与Java通讯成为了恐怕,如下图所示:

美高梅4688.com 17

注:C/C++桥接器本人跟Unity3D没有直接关系,不属于Android和Unity3D,图中位居Unity3D中是为了代指libunity.so中完结的桥接器以代表真实的景色。

由此JNI既能够用来Java代码调用C/C++代码,也可用来C/C++代码与Java(Dalvik/ACR-VT虚拟机)的相互。JNI定义了二个根本概念/结构:JavaVMJNIENVJavaVM提供虚拟机创造、销毁等操作,Java中3个进程能够创建几个虚拟机,然则Android一个历程只可以有1个虚拟机JNIENV是线程相关的,对应的是JavaVM中的当前线程的JNI环境,唯有附加(attach)到JavaVM的线程才有JNIENV指针,通过JNIEVN指针能够获取JNI功用,不然不能调用JNI函数。

美高梅4688.com 18

C/C++要拜访的Java代码,必供给能访问到Java虚拟机,获取虚拟机有第22中学方法:

  • 在加载动态链接库的时候,JVM会调用JNI_OnLoad(JavaVM*
    jvm, void* reserved)
    ,第一个参数会传出JavaVM指针。
  • 在C/C++中调用JNI_CreateJavaVM(&jvm,
    (void**)&env, &vm_args)创建JavaVM指针

所以,大家只须要在编写C/C++桥接器so的时候定义**JNI_OnLoad(JavaVM* jvm, void*
reserved)方法即可,然后把JavaVM指针保存起来作为上下文使用**。

收获到JavaVM之后,还无法直接得到JNI函数去取得Java代码,必须经过线程关联的JNIENV指针去赢得。所以,作为贰个好的付出习惯在历次获得一个线程的JNI相关功用时,先调用AttachCurrentThread();又恐怕每一趟通过JavaVM指针获取当前的JNIENV:java_vm->GetEnv((void**)&jni_env, version),一定是早就附加到JavaVM的线程。通过JNIENV能够获取到Java的代码,例如你想在地面代码中做客三个对象的字段(田野),你能够像上面那样做:

  1. 对于类,使用jni_env->FindClass收获类对象的引用

  2. 对于字段,使用jni_env->GetFieldId得到字段ID

  3. 行使相应的主意(例如jni_env->GetIntField)获取字段的值

恍如地,要调用2个艺术,你step1.得获得二个类对象的引用obj,step2.是办法methodID。那个ID经常是指向运营时内部数据结构。查找到它们供给些字符串相比,但借使你实际去履行它们获取字段也许做方法调用是可怜快的。step3.调用jni_env->CallVoidMethodV(obj, methodID, args)

从地方的示范代码,大家可以看来使用原有的JNI形式去与Android(Java)插件交互是多的麻烦,要团结做太多的政工,并且为了质量须求团结考虑缓存查询到的主意ID,字段ID等等。幸运的是,Unity3D已经为大家封装好了那个,并且考虑了品质优化。Unity3D首要提供了须臾间二个级别的卷入来提携高效编写代码:

美高梅4688.com 19

注:Unity3D中对应的C/C++桥接器包蕴在libunity.so中。

  • Level
    1:AndroidJNI、AndroidJNIHelper,原始的包裹相当于大家地点自身编辑的C#
    Wrapper。AndroidJNIHelper 和AndroidJNI自动完结了累累职分(指找到类定义,构造方法等),并且应用缓存使调用java速度更快。AndroidJavaObject和AndroidJavaClass基于AndroidJNIHelper 和AndroidJNI创造,但在拍卖自动落成都部队分也有诸多友好的逻辑,那些类也有静态的版本,用来访问java类的静态成员。更详实接口参考帮衬文书档案:http://docs.unity3d.com/ScriptReference/AndroidJNI.htmlhttp://docs.unity3d.com/ScriptReference/AndroidJNIHelper.html

  • Level
    2:AndroidJavaObject、AndroidJavaClass、AndroidJavaProxy,那些二个类是依照Level1的包装提供了更高层级的卷入使用起来更简便易行,这么些在第③局地详细介绍。

 

2.3iOS插件

美高梅4688.com 20

iOS编写插件比Android要简明很多,因为Objective-C也是
C-compatible的,完全匹配标准C语言。
那一个就足以卓殊不难的包一层 extern
“c”{},用C语言封装调用iOS功效,揭示给Unity3D调用。并且能够跟原生C/C++库一样编成.a插件。C#与iOS(Objective-C)通讯的原理跟C/C++完全等同:

美高梅4688.com 21

 

 

除去,Unity
iOS支持插件自动集成方式。全数位于Asset/Plugings/iOS文件夹中后缀名为.m ,
.mm , .c ,
.cpp的公文都将电动并入到已成形的Xcode项目中。不过,最后编进执行文书中。后缀为.h的文书无法被含有在Xcode的花色树中,但他俩将面世在对象文件系统中,从而使.m/.mm/.c/.cpp文件编写翻译。那样编写iOS插件,除了要求对iOS
Objective-C有自然领会之外,与C/C++插件无差异,反而更简便易行。

 

3.版本与补丁

美高梅4688.com 22

其余游戏(端游、手游)都应该提供娱乐内更新的路线。一般娱乐分为全量更新/整包更新、增量更新、财富创新。

  • 全量

android游戏内完全安装包下载(ios跳转到AppStore下载)

 

  • 增量:主要指android省流量更新
-   可以使用bsdiff生成patch包

-   应用宝也提供增量更新sdk可供接入

 

  • 资源

Unity3D通过行使AssetBundle即可兑现动态更新能源的功效。

 

手游在完结那块时须要注意的几点:

  1. 打闹发表出一定要提供娱乐内更新的路子。固然是删掉测试,保不准那之间要求开始展览财富如故BUG修复更新。很多玩家并不知道怎么样翻新,而且Android手机应用分发平台二种,分发平台小编也不会跟官方同步更新(特别是小的散发平台)。

  2. 履新效率要提供强制更新、非强制更新配置化选项,并钦点哪些版本能够不强更,哪些版本必须强更。

  3. 当游戏提供非强制更新功效之后,现网一定会设有八个本子。如若供给针对分化版本做差异的更新,例如配置文件A针对1.0.0.1改动了一项,针对1.0.0.2修改了另一项,二个版本须求各自更新对应的改动,要求协调完结立异策略IIPS不提供那几个功能。当必要复杂的翻新策略,推荐自个儿编排更新服务器和客户端逻辑,不使用iips组件(其实本人达成也很简短)。

![](https://images2015.cnblogs.com/blog/92071/201604/92071-20160419000347366-1630977637.png)

没有运营经验的人会选择二进制,认为二进制安全、更小,这对端游/手游外网只存在一个版本的游戏适合,对一般不强升版本的手游并不适合,反而会对更新和维护带来很大的麻烦。
  1. 配置使用XML可能JSON等文本格式,更方便人民群众多版本的卓殊和翻新。最伊始腾讯斯诺克客户端应用的二进制格式(由excel转换而来),但是随着运行配置格式要求充实字段,那样老版本程序就解析不了新的二进制数据,给包容和翻新带来了相当大的麻烦。那样就需求地点提到的针对性不一样台做不一样更新,又或然安顿一从头就留给好充足的恢宏项,其实不管怎么预留扩大也很难跟上必要的生成,而且一初叶会把配置表复杂化不过实际上只有一张只怕几张才会改变结构。
 
  1. iOS版本的送审版本供给一而再一定的蕴藏新情节的服务器,现网服务器还不包罗新内容。送交审查通过之后,上架游戏现网服务器会开始展览创新,iOS版本须要一而再次出现网服务器而非送审服务器,不过那里面又不能够修改客户度,那几个切换需求经过服务器下发开关举办控制。例如通过点名送交审查的iOS游戏版本号,客户端判断当地版本号是或不是为送交审查版本,假设是三番五次送交审查服务器,不然连接现网服务器。

 

4.用剧本,依然不要?那是2个标题

美高梅4688.com 23

便宜更新,减少Crash(越发是选拔C++的cocos引擎)

通过地方一节【版本与补丁】知道要贯彻代码更新是不行不方便的,正式那一个缘故客户端支出的压力是比较大的,假如出现了比较严重的BUG必须发强制更新版本,使用脚本能够消除这几个题目。

是因为Unity3D手游更新资金相比大,而且近期腾讯台球须要不能强制更新,那造成新本子的移位覆盖率提高相比较慢、出现难点以往难以修复。针对那一个情景,考虑引入lua实行活动开发,后续公布活动及修复bug只必要宣布lua能源,实行财富立异即可,大大降低了宣告和修复难题的资金财产。

可选方案还有使用Html5实行活动开发,最近游玩中曾经预埋了Html5活动入口,并且已经用来发过”玩家调查”、”腾讯棋牌宣传”等。不过与lua相比较,无法一气浑成与Unity3D的深度融合,体验不如使用lua,例如不可能操作游戏中的ui、不能够形成复杂界面包车型大巴制作、不能够复用已部分效益、玩家付费充值跟已部分也会相差非常大

 

游玩脚本之王——Lua

在店堂里面魔方相比较喜欢用lua,火隐忍者(手游)unity+ulua,全体公民水浒cocos2d-x+lua等等都有使用lua进行支付。大家能够使用公司内部的xlua组件,也得以应用ulua<http://ulua.org/>、UniLua<https://github.com/xebecnan/UniLua>等等。

 

5.财富管理

美高梅4688.com 24

 

5.1能源管理器

美高梅4688.com 25

 


业务并非一贯利用引擎或许系统原生接口,而是包装叁个财富管理器负责:能源加载、卸载


包容Resource.Load与AssetBundle能源互相变更要求,开发时期采纳Resource.Load格局而无需打AB包效用更高


加载财富时,不管是联合加载依旧异步加载,最好是采用异步编码格局(回调函数大概信息文告机制)。若是什么日期能源由当地加载改为从服务器按需加载,而游戏中的逻辑都以联合署名格局编码的,改起来将那么些难受。其实异步编码格局相当粗略,不比同步格局复杂。

 

5.2财富类型

美高梅4688.com 26

 

  • 图片/纹理(对质量、包体影响最大要素)

  • 音频

-   背景音乐,腾讯桌球使用.ogg/.mp3

-   音效,腾讯桌球使用.wav
  • 数据
-   文本

-   二进制
  • 动画/特效

 

5.3图片-文件格式与纹理格式

美高梅4688.com 27

常用的图像文件格式有BMP,TGA,JPG,GIF,PNG等;
常用的纹路格式有Tiguan5G6B5,奥迪A4瑞虎4G4B4,A1大切诺基5G5B5,昂Cora8G8B8, A第88中学华V8G8B8等。

 

文件格式是图像为了存款和储蓄消息而采用的对音讯的特种编码格局,它存款和储蓄在磁盘中,也许内部存款和储蓄器中,但是并不能被GPU所识别,因为以向量总结见长的GPU对于那个纷纭的测算无能为力。这几个文件格式当被游戏读入后,依旧需求通过CPU解压成Evoque5G6B5,CrossCRUISER4G4B4,A1汉兰达5G5B5,纳瓦拉8G8B8,
A8索罗德8G8B8等像素格式,再传递到GPU端进行应用。

纹理格式是能被GPU所识其余像素格式,能被神速寻址并采集样品。举个例子,DDS文件是娱乐开发中常用的文件格式,它里面能够涵盖SylphyPAJERO4G4B4的纹路格式,也足以包涵A8奥德赛8G8B8的纹理格式,甚至能够分包DXT1的纹路格式。在那里DDS文件有点容器的表示。OpenGL
ES
2.0支撑上述关联的福睿斯5G6B5,Sagitar奥迪Q54G4B4,A1奇骏5G5B5,福特Explorer8G8B8,A8安德拉8G8B8等纹理格式,其中本田UR-V5G6B5,Cross奥迪Q34G4B4,A1CRUISER5G5B5种种像素占用一个字节(BYTE),景逸SUV8G8B8每一个像素占用二个字节,A8索罗德8G8B8种种像素占用
伍个字节。

 

基于OpenGL
ES的削减纹理有广泛的如下三种实现:

1)ETC1(埃里克sson
texture compression),ETC1格式是OpenGL
ES图形标准的一有个别,并且被抱有的Android设备所扶助。

2)PVRTC
(PowerVR texture compression),支持的GPU为Imagination
Technologies的PowerVR SGX系列。
3)ATITC (ATI texture compression),支持的GPU为Qualcomm的Adreno系列。
4)S3TC (S3 texture
compression),也被称为DXTC,在PC上普遍被利用,不过在活动设备上可能属于特种事物。协理的GPU为NVIDIA
Tegra连串。

 

美高梅4688.com 28

 

5.4财富工具

美高梅4688.com 29

有了规范就可以做工具检查,从源头到打包

  • 财富导入检查

  • 能源打包检查

 

6.质量优化

美高梅4688.com 30

掉帧主要针对GPU和CPU做分析;内存占用大重点针对美术能源,音响效果,配置表,缓存等分析;卡顿也亟需对GPU和CPU峰值分析,其余IO也许GC也易导致。

美高梅4688.com 31

6.1工欲善其事,必先利其器

美高梅4688.com 32

 

  • Unity
    Profiler
  • XCode instruments

  • Qualcomm Adreno
    Profiler

  • NVIDIA
    PerfHUD ES Tegra

 

6.2CPU:最佳标准裁减总计

美高梅4688.com 33

  • 复用,UIScrollView
    Item复用,制止频仍创建销毁对象
  • 缓存,例如Transform

  • 运算裁剪,例如碰撞检查和测试裁剪

-   粗略碰撞检测(划分空间——二分/四叉树/八叉树/网格等,降低碰撞检测的数量)

-   精确碰撞检测(检查候选碰撞结果,进而确定对象是否真实发生碰撞)

-   休眠机制:避免模拟静止的球
  • 逻辑帧与渲染帧分离

  • 分帧处理

  • 异步/四线程处理

 

6.3GPU:最佳标准收缩渲染

美高梅4688.com 34

  • 纹理压缩

  • 批处理减弱DrawCall(unity-Static
    Batching和Dynamic Batching,cocos SpriteBatchNode)

  • 缩减无效/不须求绘制:荧屏外的剪裁,Flash脏矩阵算法,

  • LOD/特效分档

  • NGUI动静分离(UIPanel.LateUpdate的损耗)

  • 控制剧中人物骨骼数、模型面数/顶点数

  • 降帧,并非全部场景都急需60帧(腾讯斯诺克游戏场景60帧,其他场景30帧;每天酷跑,在开头游戏前,FPS被界定为30,游戏开头以后FPS才为60。每一天飞车的FPS为30,不过当用户一段时间不点击界面后,FPS自动降)

 

6.4内部存款和储蓄器:最佳条件缩短内部存款和储蓄器分配/碎片、及时放出

美高梅4688.com 35

  • 纹理压缩-Android
    ETC① 、iOS PVKugaTC 4bpp、windows DXT5
  • 对象池-PoolManager

  • 联合空闲图集

  • UI九宫格

  • 删去不用的本子(也会占用内部存款和储蓄器)

 

6.5IO:最佳条件减少/异步io

美高梅4688.com 36

 

  • 财富异步/二十十二线程加载

  • 预加载

  • 文本裁减

  • 客观统筹财富集合打包,并非texturepacker打包成大图集一定好,会大增文件io时间

 

6.6互联网:其实也是IO的一种

美高梅4688.com 37

运用单线程——共用UI线程,通过事件/UI循环驱动;还是二十多线程——单独的网络线程?

  • 单线程:由游戏循环(事件)驱动,单线程情势比选择多线程形式开发、维护简单很多,但是性能比三十二线程要差那么一点,所以在互连网IO的时候,须要小心别阻塞到娱乐循环。表达,如若网络IO不复杂的事态下,推荐应用该情势。
-   在UI线程中,别调用可能阻塞的网络函数,优先考虑非阻塞IO

-   这是网络开发者经常犯的错误之一。比如:做一个简单如
    gethostbyname()
    的调用,这个操作在小范围中不会存在任何问题,但是在有些情况中现实世界的玩家却会因此阻塞数分钟之久!如果你在
    GUI 线程中调用这样一个函数,对于用户来说,在函数阻塞时,GUI
    一直都处于 frozen 或者 hanged
    状态,这从用户体验的角度是绝对不允许的。 
  • 多线程:单独的网络线程,使用独立的网络线程有3个可怜显明的补益,主线程能够将脏活、累活交给网络线程做使得UI更通畅,例如音信的编解码、加解密工作,那一个都是拾分耗费时间的。不过采纳八线程,给开发和保养带来一定资金,并且只要没有早晚的阅历写出来的网络库不那么平稳,简单失误,甚至招致游戏崩溃。上面是几点注意事项:
-   千万千万别在网络线程中,回调主线程(UI线程)的回调函数。而是网络线程将数据准备好,让主线程主动去取,亦或者说网络线程将网络数据作为一个事件驱动主线程去取。当年我在用Cocos2d-x +
    Lua做魔法花园的手机demo时,就采用的多线程模式,最初在网络线程直接调用主线程回调函数,经常会导致莫名其妙的Crash。因为网络线程中没有渲染所必须的opengl上下文,会导致渲染出问题而Crash。

6.6包大小

美高梅4688.com 38

 

  • 采取压缩格式的纹理/音频

  •  尽量不要使用System.Xml而采用较小的Mono.Xml

  •  启用Stripping来减小库的轻重

  •  Unity
    strip level(strip by byte code)

  •  Unity3D输出APK,取消X86架构

  •  iOS Xcode strip开启

 

6.7耗电

美高梅4688.com 39

上面影响功耗的多少个因素和影响度摘自公司内部的一篇小说。

美高梅4688.com 40

 

 

7.异常与Crash

美高梅4688.com 41

7.1防御式编制程序

美高梅4688.com 42

 

  • 地下的输入中维护你的程序
-   检查每一输入参数

-   检查来自外部的数据/资源
  • 断言
  • 错误处理

  • 隔栏

 

防不胜防,不管怎么防御总有失手的时候,这就须要万分捕获和举报。

 

7.2很是捕获

美高梅4688.com 43

不行捕获已经有为数不少第①零件可供对接,那里不介绍组件的而接入,而是大致谈一下十三分捕获的原理。

美高梅4688.com 44

出于众多荒唐并不是发出在支付工小编调试阶段,而是在用户或测试工小编辑采访用阶段;那就供给相关代码维护理工科人作者对于程序万分捕获收集现场音信。极度与Crash的监督和汇报,那里不介绍Bugly的选用,依据apollo恐怕msdk的文书档案接入即可,没有太多能够说的。那里重要透过Bugly介绍手游的几类非凡的捕获和分析:

  • Unity3D
    C#层非凡捕获:相比简单使用Application.RegisterLogCallback/Application.RegisterLogCallbackThreaded(在四个新的线程中调用委托)注册回调函数。越发注意:保险项目中只有一个Application.RegisterLogCallback注册回调,不然前边注册的会覆盖前边注册的回调!回调函数中stackTrace参数包非常调用栈。

public void HandleLog(string logString, string stackTrace, LogType type)

{

    if (logString == null || logString.StartsWith(cLogPrefix))

    {

        return;

    }

   

    ELogLevel level = ELogLevel.Verbose;

    switch (type)

    {

   

        case LogType.Exception:

            level = ELogLevel.Error;

            break;

        default:

            return;

    }

   

    if (stackTrace != null)

    {

        Print(level, ELogTag.UnityLog, logString + "\n" + stackTrace);

    }

    else

    {

        Print(level, ELogTag.UnityLog, logString);

    }

}

 

  • Android
    Java层非凡捕获

try…catch显式的抓获非凡一般是不引起游戏Crash的,它又称作编译时万分,即在编写翻译阶段被处理的不胜。编写翻译器会强制造进程序处理全数的Checked极度,因为Java认为那类非常都以足以被处理(修复)的。倘若没有try…catch这几个这一个,则编写翻译出错,错误提醒类似于”Unhandled exception type xxxxx”。
UnChecked极度又叫做运营时充裕,由于尚未对应的try…catch处理该越发对象,所以Java运转条件将会停下,程序将脱离,也正是大家所说的Crash。那怎么不会加在try…catch呢?

  • 没辙将持有的代码都抬高try…catch

  • UnChecked至极平常都以相比严重的不行,大概说已经损坏了运维条件的。比如内部存款和储蓄器地址,就算大家try…catch住了,也无法肯定知道什么样处理该越发,才能保险程序接下去的运作是毋庸置疑的。

Uncaught极度会造成应用程序崩溃。那么当崩溃了,大家是或不是能够做些什么吗,就像是Application.RegisterLogCallback注册回调打字与印刷日志、上报服务器、弹窗提醒用户?Java提供了3个接口给大家,能够做到这么些,那正是UncaughtExceptionHandler,该接口含有一个纯虚函数:

public abstract void uncaughtException (Thread thread, Throwableex)

Uncaught格外发生时会终止线程,此时,系统便会公告UncaughtExceptionHandler,告诉它被停止的线程以及相应的尤其,然后便会调用uncaughtException函数。假设该handler没有被显式设置,则会调用对应线程组的默许handler。要是大家要捕获该尤其,必须兑现我们温馨的handler,并透过以下函数举行安装:

public static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler handler)

越发注意:数十次调用setDefaultUncaughtExceptionHandler设置handler,前面注册的会覆盖前边注册的,以最后一回为准。达成自定义的handler,只须要继承UncaughtExceptionHandler该接口,并促成uncaughtException方法即可。

static class MyCrashHandler implements UncaughtExceptionHandler{  

    @Override  

    public void uncaughtException(Thread thread, final Throwable throwable) {  

        // Deal this exception

    }

}

在其他线程中,都得以通过setDefaultUncaughtExceptionHandler来设置handler,但在Android应用程序中,全局的Application和Activity、Service都同属于UI主线程,线程名称默许为”main”。所以,在Application中应当为UI主线程添加UncaughtExceptionHandler,那样全方位程序中的Activity、瑟维斯中出现的UncaughtException事件都足以被处理。

捕获Exception之后,大家还亟需通晓崩溃堆栈的消息,那样有助于我们解析崩溃的缘由,查找代码的Bug。分外对象的printStackTrace方法用于打字与印刷很是的堆栈新闻,依照printStackTrace方法的输出结果,大家能够找到十三分的源流,并跟踪到相当联机接触的历程。

public static String getStackTraceInfo(final Throwable throwable) {

    String trace = "";    try {

        Writer writer = new StringWriter();

        PrintWriter pw = new PrintWriter(writer);

        throwable.printStackTrace(pw);

        trace = writer.toString();

        pw.close();

    } catch (Exception e) {        return "";

    }    return trace;

}

  • Android
    Native
    Crash:前边大家清楚能够编写和平运动用C/C++原生插件,除非C++使用try…catch捕获非常,不然一般会一直crash,通过捕获信号举行拍卖。
  • iOS
    格外捕获:

跟Android、Unity类似,iOS也提供NSSetUncaughtExceptionHandler 来做丰硕处理。

#import "CatchCrash.h"

   

@implementation CatchCrash

   

void uncaughtExceptionHandler(NSException *exception)

{

    // 异常的堆栈信息

    NSArray *stackArray = [exception callStackSymbols];

    // 出现异常的原因

    NSString *reason = [exception reason];

    // 异常名称

    NSString *name = [exception name];

    NSString *exceptionInfo = [NSString stringWithFormat:@"Exception reason:%@\nException name:%@\nException stack:%@",name, reason, stackArray];

    NSLog(@"%@", exceptionInfo);

       

    NSMutableArray *tmpArr = [NSMutableArray arrayWithArray:stackArray];

    [tmpArr insertObject:reason atIndex:0];

   

    [exceptionInfo writeToFile:[NSString stringWithFormat:@"%@/Documents/error.log",NSHomeDirectory()]  atomically:YES encoding:NSUTF8StringEncoding error:nil];

}

   

@end

只是内部存款和储蓄器访问错误、重复释放等颠倒是非引起崩溃就无法了,因为那种张冠李戴它抛出的是信号,所以还必供给尤其做信号处理。

  • windows
    crash:同样windows提供SetUnhandledExceptionFilter函数,设置最高拔尖的格外处理函数,当程序出现别的未处理的尤其,都会触发你设置的函数里,然后在十分处理函数中获取程序分外时的调用堆栈、内部存款和储蓄器新闻、线程音信等。

 

 

8.适配与合作

美高梅4688.com 45

 

8.1UI适配

美高梅4688.com 46

 

  • 锚点(UIAnchor、UIWidgetAnchor属性)

  • NGUI UIRoot统一设置缩放比例

  • UIStretch

 

8.2兼容

美高梅4688.com 47

 

  • shader包容:例如if语句有的机型协助倒霉,谷歌(Google)nexus 6在shader中使用了if就会crash
  • 字体兼容:android复杂的环境,有的手提式有线电话机厂商和rom会对字体进行优化,去掉android私下认可字体,即使不打包字体会不现实普通话字

 

9.调剂及开发工具

美高梅4688.com 48

9.二十十一日志及跟踪

美高梅4688.com 49

事实申明,打字与印刷日志(printf调节和测试法)是相当实用的格局。1个好用的日志调节和测试,必备以下多少个职能:

  • 日志面板/控制台,格式化输出

  • 洋洋洒洒级别(verbosity
    level):E景逸SUVROLacrosse、WAXC60N、INFO、DEBUG

  • 频道(channel):按效益等实行模块划分,如互连网频道只收到/呈现互连网模块的音讯,频道琼斯股票价格平均指数出使用枚举举行命名。

  • 日记同时会输出到日志文件

  • 日志上报

 

9.2调节用绘图工具

美高梅4688.com 50

调剂绘图用工具指开发及调节和测试期间为了可视化的绘图用工具,如腾讯斯诺克开发调节和测试时会使用VectrosityScripts可视化球桌的物理模型(实际碰撞线)帮忙调节。这类工具得以省去大批量时间及飞快定位难点。平时调节和测试用绘图工具包涵:

  • 支撑绘制基本图形,如直线、球体、点、坐标轴、包围盒等

  • 支撑自定义配置,如颜色、粒度(线的粗细/球体半径/点的轻重缓急)等

 

9.3玩耍内置菜单/作弊工具

美高梅4688.com 51

在付出调节和测试期间提供娱乐展开中的一些安顿选项及作弊工具,以有益调节和测试和升高效用。例如腾讯斯诺克游戏中提供:

  • 打闹内物理引擎参数调整菜系;

  • 修改球杆瞄准线长度/反射线数量、修改签到奖励领取天数等作弊工具

专注游戏内的具备支付调节和测试用的工具,都亟待经过编译宏开关,保险公布版本不会把工具代码包括进去

 

9.4Unity扩展

美高梅4688.com 52

Untiy引擎提供了丰盛强大的编辑器增加成效,基于Unity
艾德itor能够兑现充足多的意义。集团内部、外部都有那些的开源扩张可用

商家外部,如GitHub上的:

UnityEditor-MiniExtension

Unity-Resource-Checker

UnityEditorHelper

MissingReferencesUnity

Unity3D-ExtendedEditor

供销合作社里面:

TUTBeautyUnityUnityDependencyBy

 

 

10.门类运转

美高梅4688.com 53

 

  • 机关创设
-   版本号——主版本号.特性版本号.修正版本号.构建版本号


    -   \[构建版本号\]应用分发平台升级判断基准


-    自动构建


    -   Android

    -   iOS
        — XUPorter 

   

 集团里面接入SODA即可,建议搭建自身的构建机,开发时期每一天N
Build排队会死人的,其余也足以搭建本人的搭建创设平台

 

  • 计算报告
-   Tlog上报


    -   玩家转化关键步骤统计(重要)

    -   Ping统计上报

    -   游戏业务的统计上报(例如桌球球局相关的统计上报)


-    灯塔自定义上报

 

  • 营业模板
-   配置化

-   服务器动态下发

-   CDN拉取图片并缓存

 

美高梅4688.com 54

上线前的checklist

项目

要点

说明

指标

灯塔上报

1. 灯塔自带统计信息
2. 自定义信息上报

灯塔里面包含很多统计数据,需要检查是否ok

1. 版本/渠道分布
2. 使用频率统计
3. 留存统计(1天留存、3天留存、7天留存、14天留存)
4. 用户结构统计(有效用户、沉默用户、流失用户、回流用户、升级用户、新增用户)
5. 硬件统计(机型+版本、分辨率、操作系统、内存、cpu、gpu)
6. Crash统计(Crash版本、Crash硬件、Crash次数等)
等等

信鸽推送

   

能够针对单个玩家,所有玩家推送消息

米大师支付

   

正常支付

安全组件

1. TSS组件接入
2. 隐藏内部符号表:C++开发的代码使用strip编绎选项,抹除程序的符号
3. 关键数据加密,如影子变量+异或加密算法

根据安全中心提供的文档完成所有项

接入安全组件,并通过安全中心的验收

稳定性

crash率

用户crash率:发生CRASH的用户数/使用用户数
启动crash率:启动5S内发生crash用户数/使用用户数

低于3%

弱网络

 

断线重连考虑,缓存消息,重发机制等等

客户端的核心场景必须有断线重连机制,并在有网络抖动、延时、丢包的网络场景下,客户端需达到以下要求:
一. 不能出现以下现象:
1、游戏中不能出现收支不等、客户端卡死/崩溃等异常情况;
2、游戏核心功能(如登录、单局、支付等)不能有导致游戏无法正常进行的UI、交互问题;
3、不能有损害玩家利益或可被玩家额外获利的问题;
4、需要有合理的重连机制,避免每次重连都返回到登录界面。
二. 需要对延时的情况有相应的提示

兼容性

   

通过适配测试

游戏更新

1. 整包更新
2. 增量更新

 

特别说明:iOS送审版本支持连特定环境,与正式环境区别开,需要通过服务器开关控制

性能

内存、CPU、帧率、流量、安装包大小

 

【内存占用要求】
Android平台:在对应档次客户端最低配置以上,均需满足以下内存消耗指标(PSS):
1档机型指标:最高PSS<=300MB (PSS高于这个标准会影响28%用户的体验,约1800万)
2档机型指标:最高PSS<=200MB(PSS高于这个标准会影响45%用户的体验,约3000万)
3档机型指标:最高PSS<=150MB(PSS高于这个标准会影响27%用户的体验,约1800万)
iOS平台:在对应档次客户端最低配置以上,均需满足以下内存消耗指标(PSS):
1档机型指标:消耗内存(real mem)不大于250MB(高于这个标准会影响53%用户的体验,约1900万)
2档机型指标:消耗内存(real mem)不大于200MB(高于这个标准会影响47%用户的体验,约1700万)
【CPU占用要求】
Android平台:CPU占用(90%)小于60%
iOS平台:CPU占用(90%)小于80%
【帧率要求】
1档机型(CPU为四核1.4GHZ,RAM为2G)或以上机型:游戏核心玩法中,最小FPS应不小于25帧/秒
2档机型(CPU为两核1.1GHZ,RAM为768M)或以上机型:游戏核心玩法中,最小FPS应不小于25帧/秒
3档机型(CPU为1GHZ,RAM为768M)或以上机型:游戏核心玩法中,最小FPS应不小于18帧/秒
【流量消耗要求】
游戏核心玩法流量消耗情况(非一次性消耗)应满足以下条件:
1.对于分局的游戏场景,单局消耗流量不超过200KB
2.对于不分局游戏场景或流量与局时有关的场景,10分钟消耗流量不超过500KB

 

美高梅4688.com, 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注