Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Paddle Lite特性全解读,多硬件支持、轻量化部署等亮点频现

Paddle Lite特性全解读,多硬件支持、轻量化部署等亮点频现

作者头像
用户1386409
发布于 2019-09-27 11:57:21
发布于 2019-09-27 11:57:21
91500
代码可运行
举报
文章被收录于专栏:PaddlePaddlePaddlePaddle
运行总次数:0
代码可运行

本文主要由 9 月 21 日在百度科技园举办的 AI 快车道 Paddle Lite 专场的演讲材料整理而成,分别介绍了 Paddle Lite 的性能特性、使用方法、架构设计等,并且提供了完整的使用案例,可供开发者迅速开展应用。

在技术革新的浪潮下,智能硬件结合人工智能越来越广地进入了我们的生活。小到智能手机、手表,大到智能交通系统、工业自动检测平台等,无不渗透了人工智能的威力。此外,为人工智能深度学习定制的硬件近年来也有井喷之势。人工智能在多种服务平台,多种硬件下得到了越来越多的应用。这里的应用一般指的是深度学习模型在实际场景中的推理计算。虽然硬件的快速发展带来了计算性能的提升,但多样化的硬件平台也给应用开发带来了挑战。同时,对深度学习任务而言,实际应用中的算力和内存的限制仍然显得非常苛刻。

针对多平台多硬件的场景,飞桨(PaddlePaddle)在今年 8 月份升级发布了 Paddle Lite 推理引擎。它支持多种硬件、多种平台,还具备轻量化部署、高性能实现等重要特性。

百度在深度学习推理引擎领域耕耘多年,在 2017 年开始,公司内部就有多个自研推理引擎并各有所长,比如有的主打手机端部署,有的则侧重支持多硬件多平台。2019 年,随着飞桨整体生态的构建,我们将这些推理引擎的技术积累进行了整合,将 Paddle Mobile 品牌升级为 Paddle Lite,旨在支持更广泛硬件平台,在架构和性能上集众家之长,并融入了对硬件和平台支持的最新的思考。8月份我们发布了 Paddle Lite 的 Beta 版本,并于 9 月 22 日发布了 RC 版本。Paddle Lite 是一个开源项目,其所有项目代码在 Github 上维护:

  • 仓库地址:https://github.com/PaddlePaddle/Paddle-Lite
  • 最新文档地址:https://paddlepaddle.github.io/Paddle-Lite

1. 特性&能力

Paddle Lite 支持如下特性:①多硬件平台支持;②轻量化部署;③高性能实现;④量化计算支持。下面我们一一介绍。

1.1. 多硬件平台支持

目前支持如下 7 种硬件:

  • ARM CPU V7、V8
  • Mali GPU, Adreno GPU, Metal GPU
  • Huawei NPU
  • FPGA

Paddle Lite 自上而下支持两个层次的多平台支持,一个是上层的多种训练平台支持,除了飞桨训练出的原生模型,还可以通过 X2Paddle 工具将 Caffe, TensorFlow, ONNX 等第三方平台的模型转化为 PaddlePaddle 的模型格式,从而加载进 Paddle Lite 部署。X2Paddle 的使用方法非常简单,参考上面命令便可完成相应模型的转化。Paddle Lite 官方测试验证过的模型列表如下。

除了多种训练平台这个层次外,在底层,Paddle Lite 也支持服务器端和移动端两种平台的预测部署。

1.2. 轻量级部署

完善的多硬件平台支持必须至少有如下支持,比如完整的各类硬件后端支持,多份硬件相关算子的实现,计算图详尽的分析和优化能力。这些能力的支持必然带来最终部署库的体积膨胀,难以轻量化部署。

Paddle Lite 针对这个问题,在架构上做了相应的设计:

在具体架构上,由模型加载执行的顺序,严格拆分为分析和执行两个阶段。分析阶段有完整的计算图分析优化的能力(比如算子融合,内存优化等),由于策略较多,体积较大;执行阶段只包含相关算子,功能简单,但体积很小。

在体积敏感的场景下,Paddle Lite 可以选择轻量化部署方案,即可以只部署执行阶段,而复杂的分析优化则封装到了离线工具中。当然,在体积不敏感的场景下,比如服务器端推理,Paddle Lite 也支持两个阶段合并在一起部署,以支持一些预测前需要针对具体硬件和上下文信息调整动态图优化的能力。

Paddle Lite 核心库(ARM V8)是 1.4M,在主流实现中较有优势。

1.3. 高性能实现

Paddle Lite 的实现也是比较有优势的,比如在端侧推理非常主流的硬件 ARM CPU 上,MobileNet V1 的性能如上,也是比较有优势的。

1.4. 量化计算支持

量化计算是神经网络计算的趋势。神经网络有信息冗余的特点,即使使用低精度计算也能保证效果,基于这个优点,各硬件平台都通过量化计算来提供更快,功耗体积更有优势的硬件。Paddle Lite 在这方面也有很好的支持。

基于 PaddleSlim 的量化训练出的模型,结合 Paddle Lite 的 Int8 量化预测能力,可以得到很有竞争力的 Int8 量化性能:

PaddleSlim 项目地址:

https://github.com/PaddlePaddle/FluidDoc/tree/develop/doc/fluid/advanced_usage/paddle_slim

2. 通用的硬件平台支持架构设计

Paddle Lite 在架构的设计中,重点考虑了相对广泛的多硬件平台支持的能力。首先在 Kernel 层,一种算法可以为多个硬件或者实现方法注册多个实现。

比如上图,Operator1 代表的算法有三种硬件,6 种实现。在具体的硬件平台上,可能会同时存在多种硬件可用,比如在安卓手机上,除了 ARM CPU 之外,可能还有 Mali GPU 可用,这时就需要混合调度多种硬件的 Kernel,中间涉及的跨设备拷贝,不同的数据排布等自动转化会比较复杂。为了较完备地支持这些场景,Paddle Lite 在架构中集成了 TypeSystem 的设计思路,将架构上支持任意硬件、任意量化精度、任意数据排布的 Kernel 实现的混合调度转化为类型推导的过程。

具体地,每个 Kernel 在注册时,会同时注册其自身,以及输入输出的类型信息,比如一个矩阵乘的 Kernel 会有如下注册逻辑。

其输入是一个 ARM 上的 Tensor type。

一个复杂的多种不同 Kernel 的调度转为计算图中类型推导和对应做类型转换(type cast)的过程,比如下图,两个 Kernel 有不同类型的形参 a, b(红色和蓝色各代表一种类型)。

在第一步类型推导后,我们发现类型不匹配的点(红色叉处)。

Paddle Lite 的图分析优化模块(MIR)会自动插入相应种类的 typecast kernel 完成类型的转化,从而完成不同计算的混合调度。

除了调度之外,为了支持相对广泛的硬件,Paddle Lite 需要对硬件进行合理的抽象,抽象不能过浅,否则框架会与具体的硬件耦合,影响更多硬件的扩展;抽象也不能过高,否则不同硬件的必要支持能力会被削弱。

Paddle Lite 在 Kernel 层和 MIR(图分析优化模块)均引入了适度的硬件支持,以支持硬件的针对优化,但通过通用的高层 API 来避免框架与具体硬件耦合。要扩展新的硬件,只需要扩展 Kernel 层(编写对应的 Kernel)和 MIR 层(编写对应的 IR Pass)便可轻松实现。

3. 应用案例

3.1. 使用方法

Paddle Lite 的使用有如下几个步骤:

(1) 获取 PaddlePaddle 模型

  • 用 PaddlePaddle 训练
  • 可选通过 PaddleSlim 做模型压缩
  • 或用 X2Paddle 转换 TF 等第三方模型

(2) model_optimize_tool 优化模型

(3) 编写预测代码,集成到服务中

  • C++ 接口
  • Java 接口

获取模型的方法以下几种:

  • 参考 PaddlePaddle 文档训练新的模型
  • 直接使用 Paddle/models 标准模型库中提供的模型
  • X2Paddle 模型转换工具转化第三方模型
  • PaddleSlim 模型压缩工具集二次压缩 PaddlePaddle 模型

之后是使用模型压缩工具优化模型,使用方法可以参考如下命令,完整教程可以参考文档。

地址:

https://paddlepaddle.github.io/Paddle-Lite/develop/model_optimize_tool/

使用代码大体如下:

3.2. 实验一:手机端 Demo

Paddle Lite 官方提供了 AndroidiOS 的演示性 Demo,可以帮助用户快速的集成和验证模型的性能和效果。

Paddle-Lite-Demo 地址:https://github.com/PaddlePaddle/Paddle-Lite-Demo

3.2.1. 试验设备

  • iOS 用户需要 MacOS 系统,安装 xcode10.1(或以上版本),并登录 iCloud 账户
  • Android 用户可以使用 MacOS,Ubuntu 或 Centos 系统,安装 Android Studio3.4
  • iPhone 手机需要登录 iCloud 账户
  • Android 手机需要打开手机的「调试模式」并开启「USB 安装」
  • 配置 MacOS 或 Ubuntu 系统的开发环境。具体请参考:https://github.io/Paddle-Lite/develop/source_compile/

3.2.2. 预测库编译

手机端 Demo 采用的是无第三方依赖的「tiny_publish」模式。

具体编译参数可以参考:

https://paddlepaddle.github.io/Paddle-Lite/develop/source_compile/#%E4%BA%8C%E7%BC%96%E8%AF%91paddlelite

  • 下载代码库:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone https://github.com/PaddlePaddle/Paddle-Lite.git cd Paddle-Lite git checkout v2.0.0-rc
  • Android tiny_publish 编译(gcc,armv8):
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./lite/tools/build.sh --arm_os=android --arm_abi=armv8 \--arm_lang=gcc --android_stl=c++_static tiny_publish
  • iOS tiny_publish 编译(armv8, ios64):
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./lite/tools/build.sh --arm_os=ios64 --arm_abi=armv8 ios

3.2.3. 模型转换

为了满足手机端轻量化部署的需求,我们会在离线阶段进行模型结构的分析和优化,并将优化后的模型序列化到 Naive Buffer 的格式,从而减少部署包的体积,并实现无第三方依赖。因此在手机端上部署之前我们需要通过离线优化工具「model_optimize_tool」进行模型的转换。

  • 源码编译:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./lite/tools/build.sh build_optimize_tool

编译完成后,离线优化工具位于

「build.model_optimize_tool/lite/api/model_optimize_tool」

  • 下载编译好的执行文件:

地址:https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.0.0-rc/model_optimize_tool.gz

  • 模型转换

详情请参考:https://paddlepaddle.github.io/Paddle-Lite/develop/model_optimize_tool/

3.2.4. APP 集成开发

首先下载 Paddle-Lite-Demo 仓库。在仓库中包含 3 个项目:

  • PaddleLite-android-demo:Android Demo,包含了目标识别和目标检测
  • ios-classification_demo:iOS Demo,用于目标识别
  • ios-detection_demo:iOS Demo,用于目标检测;

对于 Android 用户,使用 Android Studio 打开 Paddle-Lite-android-demo,插入手机,在 Android studio 上可以编译并在手机上安装对应的 APP,可以在手机上直接打开使用;

对于 iOS 用户,使用 xCode 打开 ios-classification_demo 或者 ios-detection_demo,在 xcode 中选择插入的真机(iphone),点击编译运行即可在手机上安装对应的 APP,用户可以直接在手机上体验视频流的目标识别和检测。

用户可以替换 Demo 中的预测库到最新的版本或者更换 Demo 中的模型为自己训练的模型,具体操作请参考文档。

3.3. 实验二:基于 FPGA 的蔬菜识别应用

3.3.1. 百度大脑 EdgeBoard 嵌入式 AI 解决方案介绍

EdgeBoard 是基于 FPGA 打造的嵌入式 AI 解决方案及基于此方案实现的系列硬件,与 AI Studio/EasyDL 等模型定制平台深度打通,具有高性能、高通用、低成本、易开发等四大优点,适用于开发验证、产品集成、科研教学、项目落地等应用方向,以及安防监控、工业质检、医疗诊断、农作物生长监控、无人驾驶、无人零售等应用场景,本小节主要使用 EdgeBoard 深度学习计算卡进行案例打造。

Edgeboard 可以支持多种数据源输入,可以支持 Float 模型和 INT8 量化模型,可以支持 CPU+FPGA OP 混合调度,可以支持自动融合 OP,FPGA 流水操作。

Edgeboard 使用流程包含:模型获取、接入数据源、部署模型、结果输出等四个步骤,就是个简单的应用开发,不具备深度学习的基础的同学也能很容易上手。

3.3.2. 蔬菜识别模型训练

本课程采用了百度 Ai Studio 的公开蔬菜识别项目,首先我们训练一个 Float 模型,并在 AI Studio 平台上使用 GPU 评估下效果。

项目地址:

https://aistudio.baidu.com/aistudio/projectdetail/131380

为了进一步提高识别速度和效率,Edgeboard 会在运行时进行动态量化,这样会有一定的精度损失。我们会基于此模型在 AI Studio 上进行 INT8 量化训练,训练一个 INT8 的模型,来弥补精度损失。

3.3.3. 模型的布署与测试

(1)Paddle Lite 支持 Fpga 硬件原理

Paddle Lite 完整支持从 Mobile 到 Server 多种硬件,这主要得益于对不同硬件的统一抽象,不同的硬件提供统一的接口给上层框架,形成了硬件的可插拔,极大方便了底层硬件的扩展与支持。Fpga 作为 Paddle Lite 的 Backends 之一,将自身硬件相关的 kernel、驱动及内核进行了包装并向 Paddle Lite 提供了统一的 op 调用接口,使得 Paddle Lite 能很方便的集成 Fpga 的计算能力。同时通过 Paddle Lite 上层框架对模型的优化能力,包括各种 op 融合、计算剪枝、存储复用、量化融合的优化 pass, 以及 kernel 的最优调度、混合布署等功能,进一步实现了模型加速。

(2)EdgeBoard 模型布署

利用 Paddle Lite 在 EdgeBoard 上进行模型布署很简单,只需将 include 下头文件包含到调用 Paddle Lite 的代码文件中,将静态库文件与工程文件联编成可执行程序,替换模型即可运行。训练模型效果对比:

3.3.4. 实验总结

本课程利用 Paddle Lite 推理引擎在 EdgeBoard 计算卡上布署 Inceptionv4 蔬菜识别模型,实现了边缘端智能识别蔬菜品类的功能,可用于多种场景。整个应用借助 Paddle Lite 的上层框架优化能力与 Fpga 的底层计算加速能力,每秒可识别 30 帧,真正实现实时高效的蔬菜识别。

本课程具有极高的拓展性,由于 Paddle Lite 可以和 PaddlePaddle 模型无缝对接,加上 EdgeBoard 计算卡的软件可持续迭代、op 持续更新等特点,在模型支持上的数量上和速度上均会有很大优势,如本文所用模型也可以更换的分类模型或检测模型。

4. Paddle Lite 项目未来计划

Paddle Lite 未来计划如下,10 月发布正式版,每个月一个版本高效迭代:

  • 框架能力和功能加强,如平台支持扩展,易用性完善,加密,显存优化等
  • 硬件支持范围持续扩大,新硬件评测支持能力提升
  • 整体性能优化,量化部署方案完善和模型覆盖范围增加
  • 文档持续优化:更多的 demo,示例代码,可读性加强
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PaddlePaddle 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS开发系列——Storyboard
到目前为止我们还没有解释我们的程序是如何显示默认视图界面的。做过WinForm程序的朋友都知道每个Window窗口界面都有一个设计器(对应一个设计文件),其实在IOS中也可以通过设计工具设计界面不用编写代码,这个工具就是Interface Builder。用Interface Builder编辑的文件在iOS5之前是一个“.xib”文件,从IOS5开始进行了改进,使用“.storyboard”文件进行设计。其实在上面我们已经看到这个文件,这里重点说明一下Storyboard文件的使用。
Kris大鲨
2018/05/05
3.6K2
iOS开发系列——Storyboard
【IOS开发基础系列】Storyboard专题
        如果你的 app 有大量的窗口,故事板能帮你减少许多用于从一个窗口转到另一个窗口的导航代码。与每个viewcontroller一个单独的 nib 文件不同,你的 app 只需用一个故事板文件(其中可以包含所有的viewcontroller 以及它们之间的关系)即可。
江中散人_Jun
2023/10/16
2.1K0
【IOS开发基础系列】Storyboard专题
【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)
创建一个 HelloWorld 项目, 在这个 IOS 项目中有四个目录 : 如下图;
韩曙亮
2023/03/27
5.4K0
【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)
iOS中storyboard故事板使用Segue跳转界面、传值
在iOS的开发过程中,不可避免的要设计界面,在android中有xml设置界面和直接使用java代码设置界面控件两种方式,在之前的ios开发中也是类似的有xib文件设置界面及用代码直接设置控件两种方法,但后来又出了一种方式,就是storyboard故事板子,其实storyboard和xib文件很像,最大的不同之处在于一个xib文件对应一个ViewController视图控制器,而storyboard对应多个,基本一个应用只需要一个storyboard就可以了,不再需要为每个控制器创建一个xib文件,从这点上来说,还是很方便的,在storyboard中查看各个界面的跳转也很方便,但之前一直使用xib进行开发,对storyboard的使用不太熟悉,今天好好学习了一下其中的界面跳转和传值,用到了Segue这个东西,这里借着例子说明一下。
Cloudox
2021/11/23
1.8K0
iOS中storyboard故事板使用Segue跳转界面、传值
iOS 9 Storyboard 教程(二上)介绍Segue静态单元格(static cell)
Add Player 最终的设计看上去像下面这样:#接第一部分: 原帖地址 简书地址
hrscy
2018/08/30
3.8K0
iOS 9 Storyboard 教程(二上)介绍Segue静态单元格(static cell)
《iOS UI 开发捷径 利用 Interface Builder 高效、优雅地开发 UI》 读书笔记第1章 Interface Bundle 概要第2章 使用 Interface Builder第3
第1章 Interface Bundle 概要 ---- Bundle 一种标准化的层次结构,保存了可执行代码及代码所需要的资源。 nib Next Interface Builder Interface Builder 的优点 开发和维护效率高 减少大量的 UI 代码和“胶水代码” 适配变得十分简单 IB 也可以做一些非 UI 的事情 利用 IB 学习控件可以达到事半功倍的效果 Interface Builder 的缺点 IB 的执行效率没有纯代码高 使用 IB 开发的过程中容易出现一些小问题 有一定的学
iOSDevLog
2018/05/17
2.7K0
​使用Swift和Xcode开发iOS应用的详细教程
iOS应用开发是一项充满创意和挑战的工作,而Swift作为苹果公司推崇的编程语言,Xcode则是官方提供的集成开发环境。在本篇博客中,我们将一步步地介绍如何使用Swift和Xcode创建一个简单的iOS应用。我们将涵盖项目的创建、界面设计、Swift代码编写以及应用的运行。让我们开始这个令人兴奋的开发之旅!
Echo_Wish
2023/12/19
2.1K0
iOS 关于Interface Building 的一些小技巧
## 1. UIStackView StackView 是iOS9以后才有的,主要解决了组件排列布局复杂的问题,高效快速。
星宇大前端
2020/02/13
2K0
ios入门之界面基础
学习移动app开发,我们常常从讲解基本的控件开始,如UILabel、UISearchBar、UIButton、UITextField等等。在实现一个简单的ios 应用之前,我们首先来看ios开发中一些基本的概念。 视图控制器(View Controllers) 视图控制器是MVC(Modl-View-Controller)模式的逻辑部分。按照字面意思,这个控制器能够控制某个视图。 UIViewController 苹果极力推崇MVC这种开发模式,并且帮我们实现了一个叫做UIViewController的控制
xiangzhihong
2018/02/06
1.9K0
ios入门之界面基础
一步一步,开始上手Mac 开发(一)
通过本文,你可以创建你的第一个Mac Application,编译并指定版本号,而且经过练习,你应该掌握:
代码行者
2018/08/23
4.2K1
一步一步,开始上手Mac 开发(一)
重回iOS应用开发
虽然第一个项目还是2014年那会做的,但同事们都知道我有过iOS项目的经验,公司客户有了iOS版本的需求,自然会想到我来参与这个项目,但具体充当什么角色,我自然是拿不准的,期望来主导,但能力经验又有差距,很微妙的感觉;比方我现在是在架构师的位置上,但在iOS的技能上,却没有充当架构师的能力,如何平衡现实和期望,着实让人纠结的一种状态,重新捡起来,以稍微高一些的视角去定位,还是比之前有了更多的收获 ,尽管由于项目人力配备不齐,正式的iOS开发只有两个,最后可能还是会参与到开发工作中,那就两者都兼顾吧。
呱牛笔记
2023/05/02
4930
重回iOS应用开发
iOS14开发-入门知识
iOS 是由苹果公司开发的移动操作系统 。苹果公司最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统(最初叫 iPhone runs OS X)。该系统最初是设计给 iPhone 使用的(所以后来曾命名为 iPhone OS),之后陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上(所以在 WWDC 2010 上最终宣布更名为 iOS)。
YungFan
2021/01/18
3.3K0
【iOS 开发】基本 UI 控件详解 (UIButton | UITextField | UITextView | UISwitch)
博客地址 : http://blog.csdn.net/shulianghan/article/details/50051499 ;
韩曙亮
2023/03/27
7.4K0
【iOS 开发】基本 UI 控件详解 (UIButton | UITextField | UITextView | UISwitch)
【 iOS 应用开发 】 UIKit 控件 ( 代码生成控件 | UIView 属性方法 | Storyboard | Bundle | Property List | 动画 | 图片内存优化 )
项目创建流程 : ① 选择 Create a new Xcode project , ② 创建 Single View Application 项目 , ③ 设置项目信息 , ④ 设置代码路径并创建 ;
韩曙亮
2023/03/27
4.4K0
【 iOS 应用开发 】 UIKit 控件 ( 代码生成控件 | UIView 属性方法 | Storyboard | Bundle | Property List | 动画 | 图片内存优化 )
【 iOS 应用开发 】 UIKit 控件 ( UIView 属性 | storyboard 设置 | 模拟器 | 拖线关联 | tag | 软键盘操作 | 颜色值 | 代码生成控件 | 动画设置 )
LaunchScreen.storyboard 界面 : 该界面不是用于展示应用程序的界面 ;
韩曙亮
2023/03/27
5.3K0
【 iOS 应用开发 】 UIKit 控件 ( UIView 属性 | storyboard 设置 | 模拟器 | 拖线关联 | tag | 软键盘操作 | 颜色值 | 代码生成控件 | 动画设置 )
Xcode:处理故事板的更好方式 享受Interface Builder的提示和技巧
Apple在Xcode 8中对Interface Builder进行了很大的改进。使用大小类变得更加直观,缩放故事板的能力非常方便,Interface Builder中的完整预览功能非常棒。对于那些对使用Interface Builder犹豫不决的人来说,这可能会成为一个交易破坏者。
iOSDevLog
2018/12/28
1.7K0
【IOS开发基础系列】Navigation页面导航专题
        对于父级VC与子级VC分别有navigationController的情况,即不是使用push方式加载子VC,而是通过AddChildViewController的方式添加的场景,则父级导航条会覆盖在子级导航条上面,所以需要在载入时把父级导航条做隐藏处理:
江中散人_Jun
2023/10/16
7230
【IOS开发基础系列】Navigation页面导航专题
iOS各种调试技巧豪华套餐
前言 最近博主临近毕业季,为了完美的写一篇毕业论文,真是:“锄禾日当午,汗滴禾下土”<—— 这句诗跟毕业我写毕业论文没任何一毛钱关系,我就是突然想吟湿了。不过博主作为网络工程专业的好青年,曾经的愿望和理想就是在下水道干出一番轰轰烈烈的大事业,没错是就是下水道,我们的征途在下水道!!不过大家别误会,我不是忍者龟的脑残粉!听我继续说!我想的是等我在各大排水系统各大下水道功成名就的时候,我就可以指着一个井盖对我的孙子说:“诺 那个下面的通信光缆是爷爷我接的!!” 我满脸自豪地接受着这孙子的敬仰!但是啊,曾经的愿
王大锤
2018/05/17
2K0
OS X 上使用.NET开发应用程序
MonoMac是面向Mac OSX API的C#绑定,其API设计主要受到了MonoTouch的启发,后者可以基于Mono开发原生的iOS应用程序。MonoMac套件的目标之一,也是发布独立的 .app应用程序,让最终用户摆脱对Mono的依赖。MonoTouch的成功则是一个良好的基础,于是Mono开始将Cocoa API使用C#和.NET世界中的模式与惯例用法表现出来,并提供开发人员整套Cocoa应用程序的开发工具。 Mono之父Miguel de Icaza表示,.NET从一开始便设计成为一个易于互操作
张善友
2018/01/19
1.6K0
OS X 上使用.NET开发应用程序
【IOS开发基础系列】UISearch专题
        UISearchBar是由两个subView组成的,一个是UISearchBarBackGround,另一个是UITextField.
江中散人_Jun
2023/10/16
8700
【IOS开发基础系列】UISearch专题
推荐阅读
相关推荐
iOS开发系列——Storyboard
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验