彩神大发快3-彩神大发快3官方 - 彩神大发快3,彩神大发快3官方满足不同类型的客户,经验心得让客人享受无压力的娱乐空间及贴心服务。彩神大发快3,彩神大发快3官方以现场游戏荣登亚洲最受欢迎的互动娱乐网上平台。

聊聊移动端跨平台开发的各种技术

  • 时间:
  • 浏览:0

介绍

最近出先的 React Native 再次让跨平台移动端开发四种 话题火起来了,之后亲戚亲戚你们 以为在手机上可不都要像桌面那样通过 Web 技术来实现跨平台开发,却大多不可能 性能或功能疑问而放弃,不得不针对不同平台开发多个版本。

但这并没哟阻止亲戚亲戚你们 对跨平台开发技术的探索,毕竟谁我你会降低开发成本,一次编写就处处运行呢?除了 React Native,这几年还出先过有些其它解决方案,本文我不可能 对有有哪些方案进行技术分析,供感兴趣的读者参考。

为了方便讨论,我将它们分为了以下 4 大流派:

  • Web 流:也被称为 Hybrid 技术,它基于 Web 相关技术来实现界面及功能
  • 代码转换流:将某个语言转成 Objective-C、Java 或 C#,之后使用不同平台下的官方工具来开发
  • 编译流:将某个语言编译为二进制文件,生成动态库或打包成 apk/ipa/xap 文件
  • 虚拟机流:通过将某个语言的虚拟机移植到不同平台上来运行

Web 流

Web 流是亲戚亲戚你们 都比较了解的了,比如著名的 PhoneGap/Cordova,它将原生的接口封装后暴露给 JavaScript,可不都要运行在系统自带的 WebView 中,也可不都要自己内嵌一个 Chrome 内核 。

作为这几年争论的热点,网上不可能 有不多关于它的讨论了,这里我重点聊聊亲戚亲戚你们 最关心的性能疑问。

Web 流最常被吐槽的之后性能慢(这里指内嵌 HTML 的性能,不考虑网络加载时间),可为有哪些慢呢?常见的看法是认为「DOM 迅速」,然而从浏览器实现深层来看,觉得 DOM 之后将对文档操作的 API 暴露给了 JavaScript,而 JavaScript 的调用有有哪些 API 后就进入内控 的 C++ 实现了,这中间并没哟几个性能消耗,不多从理论上来说浏览器的 DOM 肯定比 Android 的「DOM」快,不可能 Android 的展现架构大每段功能是用 Java 写的,在实现相同功能的前提下,C++ 不大不可能 比 Java 慢(有些情況下 JIT 编译优化觉得 有不可能 做得更好,但那之后少数情況)。

不多从字面意思上看「DOM 迅速」的说法是错误的,四种 看法好的反义词很普遍,不可能 是不可能 大每段人对浏览器实现不了解,只知道浏览器有 DOM,不多不管有哪些疑问都里还可不可不可以 抱怨它了。

没哟疑问在哪呢?在我看来有三方面的疑问:

  • 早期浏览器实现比较差,没哟进行优化
  • CSS 过于繁杂,计算起来更耗时
  • DOM 提供的接口太有限,使得难以进行优化

第一个 疑问是最关键也是最难解决的,现在说到 Web 性能差主要说的是 Android 下比较差,在 iOS 下不可能 很流畅了,在 Android 4 之后的 WebView 甚至都没哟实现 GPU 加速,每次重绘整个页面,有动画的之后不卡才怪。

浏览器实现的优化可不都要等 Android 4.4 慢慢普及起来,不可能 4.4 之后就使用 Chrome 来渲染了。

而对于最新的浏览器来说,渲染慢的原困就主之后第兩个疑问:CSS 过于繁杂,不可能 从实现原理上看 Chrome 和 Android View 并没哟本质上的差别,但 CSS 太灵活功能不多了,不多计算成本很高,自然就迅速了。

那是也有可不都要通过繁杂 CSS 来解决?实际上还真大家没哟尝试了,比如 Famo.us,它最大的特色之后不我你会写 CSS,里还可不可不可以 使用固定的几种布局最好的法子,完整版靠 JavaScript 来写界面,不多它能有效解决写出低效的 CSS,从而提升性能。

而对于繁杂的界面及手机下常见的超长的 ListView 来说,第一个 疑问会更突出,不可能 DOM 是一个 很上层的 API,使得 JavaScript 无法做到像 Native 那样细粒度的控制内存及多线程 ,不多难以进行优化,则在硬件较差的机器上会比较明显。对于四种 疑问,亲戚亲戚你们 一年前之后尝试过嵌入原生组件的最好的法子来解决,不过四种 方案都要依赖应用端的支持,或许之后浏览器会自带几个优化后的 Web Components 组件,使用有有哪些组件就能很好解决性能疑问。

现阶段你类似于 个多多 疑问也有好解决,不多大家想干脆不需要 HTML/CSS,自己来画界面,比如 React canvas 直接画在 Canvas 上,但在我看来这之后现阶段解决每段疑问的最好的法子,在中间的章节我会完整版介绍自己画 UI 的各种疑问,这里说个历史吧,6 年前浏览器还没哟的之后,Bespin 就没哟干过,之后四种 项目被使用 DOM 的 ACE 取代了,目前包括 TextMirror 和 Atom 在内的主流编辑器也有直接使用 DOM,甚至 W3C 大家专门写了篇文章吐槽用 Canvas 做编辑器的种种缺点,不多使用 Canvas 要谨慎。

另外除了 Canvas,还大家以为 WebGL 快,就尝试绘制到 WebGL 上,比如 HTML-GL,但它目前的实现太偷懒了,简单来说之后先用 html2canvas 将 DOM 节点渲染成图片,之后将四种 图片作为贴图放满 WebGL 中,这等于将浏览器中用 C++ 写的东东在 JavaScript 里实现了一遍,渲染效率肯定反而迅速,但倒是能用 GLSL 做特效来忽悠人。

硬件加速不等同于「快」,不可能 果真硬件加速一定比软件快,那你该抽空类学计算机体系行态了

觉得 除了性能疑问,我认为在 Web 流更严重的疑问是功能缺失,比如 iOS 8 就新增 500+ API,而 Web 标准都要漫长的编写和评审过程,根本赶不上,即便是 Cordova 之后自己封装也忙不过来,不多为了更好地使用系统新功能,写 Native 代码是都要的。

代码转换流

前面提到写 Native 代码是都要的,但不同平台下的官方语言不一样,这会原困同样的逻辑要写两次以上,于是也大家想到了通过代码转换的最好的法子来减少工作量,比如将 Java 转成 Objective-C。

四种 最好的法子觉得 听起来也有很靠谱,但它却是成本和风险都最小的,不可能 代码转换后就可不都要用官方提供的各种工具了,和普通开发区别不大,之后不需要担心遇到各种诡异的疑问,不过都要注意生成的代码是不是可读,不可读的方案就别考虑了。

接下来看看目前趋于稳定的几种代码转换最好的法子。

将 Java 转成 Objective-C

j2objc 能将 Java 代码转成 Objective-C,据说 Google 内控 之后使用它来降低跨平台开发成本的,比如 Google Inbox 项目就号称通过它共用了 70% 的代码,效果很显著。

不可能 大家会觉得 奇怪,为甚 Google 要专门开发一个 帮助亲戚亲戚你们 写 Objective-C 的工具?还有媒体说 Google 做了件好事,觉得 吧,我觉得 Google 这算盘打得不错,不可能 基本上重要的应用也有一并开发 Android 和 iOS 版本,有了四种 工具就原困,我你会先开发 Android 版本,之后再开发 iOS 版本。。。

既然也有成功案例了,四种 方案觉得 值得尝试,之后关键是会 Java 的人多啊,可不都要通过它来快速移植代码到 Objective-C 中。

将 Objective-C 转成 Java

除了有 Java 转成 Objective-C,还有 Objective-C 转成 Java 的方案,那之后 MyAppConverter,比起前面的 j2objc,四种 工具更有野心,它还打算将 UI 每段也中含进来,从它已转换的列表中可不都要看了还有 UIKit、CoreGraphics 等组件,使得有些应用可不都要不改代码就能转成功,不过这点我不多看好,对于大每段应用来说不多现实。

不可能 目前是收费项目,我没哟尝试过,对技术细节之后了解,不多这里不做评价。

将 Java 转成 C#

Mono 提供了一个 将 Java 代码转成 C# 的工具 Sharpen,不过似乎用的人不多,Star 才 118,不多看起来不靠谱。

还有 JUniversal 四种 工具可不都要将 Java 转成 C#,但目前它并没哟发布公开版本,不多具体情況还待了解,它的一个 特色是自带了简单的跨平台库,中间包括文件解决、JSON、HTTP、OAuth 组件,可不都要基于它来开发可复用的业务逻辑。

比起转成 Objective-C 和 Java 的工具,转成 C# 的你类似于 个多多 工具看起来都非常不心智心智心智成熟期期 图片 期期 期期,估计是用 Windows Phone 的人少。

将 Haxe 转成其它语言

说到源码转换就不得不提 Haxe 四种 奇特的语言,它没哟自己的虚拟机或可执行文件编译器,不多里还可不可不可以 通过转成其它语言来运行,目前支持转成 Neko(字节码)、Javascript、Actionscript 3、PHP、C++、Java、C# 和 Python,尽管大家实现了转成 Swift 的支持,但还是非官方的,不多要想支持 iOS 开发目前里还可不可不可以 通过 Adobe AIR 来运行。

在游戏开发方面做得不错,有个跨平台的游戏引擎 OpenFL 的,最终可不都要使用 HTML5 Canvas、OpenGL 或 Flash 来进行绘制,OpenFL 的开发体验做得相当不错,同一行代码不都要修改就能编译出不同平台下的可执行文件,不可能 是通过转成 C++ 最好的法子进行编译的,不多在性能和反编译方面也有优势,可惜目前似乎不多足稳定,不然可不都要成为 Cocos2d-x 的有利竞品。

在 OpenFL 基础上还有个跨平台的 UI 组件 HaxeUI,但界面风格我觉得 怪怪的丑,也就里还可不可不可以 在游戏中用了。

不多目前来看 Haxe 做跨平台游戏开发或许可行,但 APP 开发就别指望了,而基于它来共用代码觉得 就更不靠谱了,不可能 熟悉它的开发者极少,反而增加成本。

XMLVM

除了前面提到的源码到源码的转换,还有 XMLVM 四种 与众不同的最好的法子,它首先将字节码转成四种 基于 XML 的中间格式,之后再通过 XSL 来生成不同语言,目前支持生成 C、Objective-C、JavaScript、C#、Python 和 Java。

觉得 基于一个 中间字节码可不都要方便支持多语言,然而它也原困生成代码不可读,不可能 不多语言中的语法糖会在字节码中被抹掉,这是不可逆的,以下是一个 简单示例生成的 Objective-C 代码,看起来就像汇编:

XMLVM_ENTER_METHOD("org.xmlvm.tutorial.ios.helloworld.portrait.HelloWorld", "didFinishLaunchingWithOptions", "?")XMLVMElem _r0;XMLVMElem _r1;XMLVMElem _r2;XMLVMElem _r3;XMLVMElem _r4;XMLVMElem _r5;XMLVMElem _r6;XMLVMElem _r7;_r5.o = me;_r6.o = n1;_r7.o = n2;_r4.i = 0;_r0.o = org_xmlvm_iphone_UIScreen_mainScreen__();XMLVM_CHECK_NPE(0)_r0.o = org_xmlvm_iphone_UIScreen_getApplicationFrame__(_r0.o);_r1.o = __NEW_org_xmlvm_iphone_UIWindow();XMLVM_CHECK_NPE(1)...

在我看来四种 方案相当不靠谱,万一生成的代码有疑问基本没哟修改,也没哟调试代码,不多不推荐。

小结

觉得 代码转换四种 最好的法子风险小,但我觉得 对于不多小 APP 来说共享不了几个代码,不可能 类似于 应用大多数围绕 UI 来开发的,大每段代码都和 UI 耦合,不多公共每段不多。

在目前的所有具体方案中,里还可不可不可以 j2objc 可不都要尝试,其它也有心智心智心智成熟期期 图片 期期 期期。

编译流

编译流比前面的代码转换更进一步,它直接将某个语言编译为普通平台下的二进制文件,四种 做法有明显的优缺点:

  • 优点
    • 可不都要重用有些实现很繁杂的代码,比如之后用 C++ 实现的游戏引擎,重写一遍成本太高
    • 编译后的代码反编译困难
    • 或许性能会好些(具体要看实现)
  • 缺点
    • 不可能 四种 工具四种 有 Bug 或性能疑问,定位和修改成本会很高
    • 编译后体积不小,尤其是不可能 要支持 ARMv8 和 x86 励志的话

接下来亲戚亲戚你们 通过区分不同语言来介绍四种 流派下的各种方案。

C++ 类

C++ 是最常见的选择,不可能 目前 Android、iOS 和 Windows Phone 都提供了 C++ 开发的支持,它通常有四种 做法:

  • 只用 C++ 实现非界面每段,这是官方比较推崇的方案,目前有不多应用是没哟做的,比如 Mailbox 和 Microsoft Office。
  • 使用 2D 图形库来自己绘制界面,四种 做法在桌面比较常见,不可能 不多界面也有个性化需求,但在移动端用得还不多。
  • 使用 OpenGL 来绘制界面,常见于游戏中。

使用 C++ 实现非界面每段比较常见,不多这里就不重复介绍了,除了能提升性能和共用代码,还大家使用四种 最好的法子来隐藏有些关键代码(比如密钥),不可能 你我没哟乎 要怎样构建之后的跨平台项目,可不都要参考 Dropbox 开源的 libmx3 项目,它还内嵌了 json 和 sqlite 库,并通过调用系统库来实现对简单 HTTP、EventLoop 及创建多线程 的支持。

而不可能 要用 C++ 实现界面每段,在 iOS 和 Windows Phone 下可不都要分别使用 C++ 的超集 Objective-C++ 和 C++/CX,不多还比较容易,但在 Android 下疑问就比较麻烦了,主要原困是 Android 的界面绝大每段是 Java 实现的,不多用 C++ 开发界面最大的挑战是要怎样支持 Android,这有四种 做法:通过 JNI 调用系统提供的 Java 最好的法子不可能 自己画 UI。

第四种 做法觉得 可行,但代码太冗余了比如一个 简单的函数调用都要写没哟多代码:

JNIEnv* env;jclass testClass = (*env)->FindClass(env, "com/your/package/name/Test"); 

// get ClassjmethodID constructor = (*env)->GetMethodID(env, cls, "", "()V");jobject testObject = (*env)->NewObject(env, testClass, constructor);methodID callFromCpp = (*env)->GetMethodID(env, testClass, "callFromCpp", "()V");

//get methodid(*env)->CallVoidMethod(env, testObject, callFromCpp);

那自己画 UI 是不是会更方便点?比如 JUCE 和 QT 之后自己画的,亲戚亲戚你们 来看看 QT 的效果:

看起来很不错是吧?不过在 Android 5 下就悲剧了,不多效果都没出来,比如按钮没哟涟漪效果,甚至边框都没哟,根本原困在于它是通过 Qt Quick Controls 的自定义样式来模拟的,而也有使用系统 UI 组件,之后它享受还可不可不可以 系统升级自动带来的界面优化,里还可不可不可以 自己再实现一遍,工作量不小。

反而不可能 最开始英语 英语 了了用的是 Android 原生组件也有哪些也有都要做,之后还能用新的 AppCompat 库来在 Android 5 以下实现 Material Design 效果。

最后四种 做法是使用 OpenGL 来绘制界面,不可能 EGL+OpenGL 四种 之后跨平台,不多基于它来实现会很方便,目前大多数跨平台游戏底层也有没哟做的。

既然可不都要基于 OpenGL 来开发跨平台游戏,是不是能用它来实现界面?当然是可行的,之后 Android 4 的界面之后基于 OpenGL 的,不过它并也有只用 OpenGL 的 API,那样是不现实的,不可能 OpenGL API 最初设计并也有为了画 2D 图形的,不多连画个圆形都没哟直接的最好的法子,之后 Android 4 中是通过 Skia 将路径转换为位置数组或纹理,之后再交给 OpenGL 渲染的。

然而要完整版实现一遍 Android 的 UI 架构工作量不小,以下是其中每段相关代码的代码量:

其中光是文字渲染就非常繁杂,不可能 你觉得 简单,那里还可不可不可以 说明你没看了四种 世界有多大,或许你知道中文有编码疑问、英语有连字符(hyphen)折行,但你是不是知道繁体中文有竖排版、阿拉伯文是从右到左的、日语有平假名注音(ルビ)、印度语有元音附标文字(abugida አቡጊዳ)……?

而相比之下不可能 每个平台单独开发界面,看似工作量不小,但目前在各个平台下也有有良好的官方支持,相关工具和文档都很完善,不多觉得 成本没没哟高,之后可不都要给用户和系统风格保持一致的良好体验,不多我认为对于大多数应用来说自己画 UI 是很不划算的。

不过也有特例,对于 UI 比较独特的应用来说,自己画也是有好处的,除了更灵活的控制,它还能使得不同平台下风格统一,这在桌面应用中很常见,比如 Windows 下我你会发现几乎每个必备软件的 UI 也有太一样,之后好多也有换肤功能,在四种 情況下很适合自己画 UI。