-
Flutter原理解析
Flutter核心原理架构Flutter架构分层设计如上图,从下到上依次为 Embedder、Engine、Framework。 Embedder: 操作系统适配层,实现渲染surface设置、线程设置等。 Engine: 实现Flutter渲染引擎、文字排版、事件处理、Dart运行时等功能,包括Skia图形绘制库、Dart VM、Text引擎等。其中Skia和Text为上层接口提供了调用底层渲染和排版的能力。Skia是Google开源的二维图形库,用于Chrome OS, Andoi...…
-
WebRTC GCC拥塞控制详解
webrtc版本: M74接收端主要实现: RemoteBitrateEstimatorAbsSendTime:基于abs-send-time的接收端带宽估计,默认方式,本文只描述该方式; RemoteBitrateEstimatorSingleStream:基于RTP时间戳的接收端带宽估计; InterArrival:到达时间滤波器,计算包簇(帧)之间的时间差; OveruseEstimator:卡尔曼滤波器,用于估算网络延迟变化(拥塞)的最优值; OveruseDetecto...…
-
WebRTC基于GCC的拥塞控制(下)-实现分析
前言从源代码实现角度对WebRTC的GCC算法进行分析。主要内容包括: RTCP RR的数据源、报文构造和接收,接收端基于数据包到达延迟的码率估计,发送端码率的计算以及生效于目标模块。拥塞控制是实时流媒体应用的重要服务质量保证。通过本文和文章[1][2],从数学基础、算法步骤到实现细节,对WebRTC的拥塞控制GCC算法有一个全面深入的理解,为进一步学习WebRTC奠定良好基础。1 GCC算法框架再学习本节内容基本上是文章[1]第1节的复习,目的是再次复习GCC算法的主要框架,梳理其算法流...…
-
WebRTC基于GCC的拥塞控制(上)-算法分析
前言实时流媒体应用的最大特点是实时性,而延迟是实时性的最大敌人。从媒体收发端来讲,媒体数据的处理速度是造成延迟的重要原因;而从传输角度来讲,网络拥塞则是造成延迟的最主要原因。网络拥塞可能造成数据包丢失,也可能造成数据传输时间变长,延迟增大。拥塞控制是实时流媒体应用质量保证(QoS)的重要手段之一,它在缓解网络拥堵、减小网络延迟、平滑数据传输等质量保证方面发挥重要作用。WebRTC通控制发送端数据发送码率来达到控制网络拥塞的目的,其采用谷歌提出的拥塞控制算法(Google Congestio...…
-
NSNotification详解
实现原理参考GNUStep源码,了解其中实现原理,对于addObserver:selector:name:object:会创建一个Observation对象,是搜索和执行响应的核心对象, 包含observer和sel,typedef struct Obs { id observer; /* Object to receive message. */ SEL selector; /* Method selector. */ struct Obs *next; /* Next i...…
-
iOS KVO详解
提出疑问首先抛出问题,KVO的原理有很多文章写过,大致原理是一个Test类,添加了观察者后,会动态生成NSKVONotifying_Test类,重写了set方法。但为什么当我们对这个对象调用class方法的时候依然返回的是Test类,为什么不是NSKVONotifying_Test? 我们能理解设计者是故意屏蔽内部实现,但是究竟是怎么做到的呢?同样问题,superclass方法,获取的应该是Test和NSObject,为什么是2个都是NSObject?Test *t = [Test new...…
-
Linux文件权限详解
查看文件权限:ls -l 在目录下列出文件列表和权限信息-rw-r--r-- 1 byron staff 89 8 11 10:47 OWNERS-rwxr-xr-x 1 byron staff 4034 8 11 10:47 ensure_gn_version.pydrwxr-xr-x 3 byron staff 96 8 11 10:47 linux64权限信息通用格式:-rwxr-xr-x number user group filesize ...…
-
iOS App签名原理
iOS 签名机制挺复杂,各种证书,Provisioning Profile,entitlements,CertificateSigningRequest,p12,AppID,概念一堆,也很容易出错,本文尝试从原理出发,一步步推出为什么会有这么多概念,希望能有助于理解 iOS App 签名的原理和流程。App签名1.0要实现这个需求很简单,最直接的方式,苹果官方生成一对公私钥,在 iOS 里内置一个公钥,私钥由苹果后台保存,我们传 App 上 AppStore 时,苹果后台用私钥对 APP ...…
-
音视频基础知识
码率:也叫比特率, Bits per second 每秒传输的数据量。 可以理解成吞吐量或带宽。 目的是用最低的比特率达到最少的失真###帧率:Frames per second 每秒显示帧数。常见编码标准:MPEG-4, 其中第10部分提出新的视频编码方案,即与另一个组织共同开发的H.264。第三部分提出AAC音频编码方案,旨在替代MP3。 第14部分提出MP4封装格式包括音频编码方案和视频编码方案。H.264:定义了三种帧,I帧 P帧 B帧1)I 帧:I帧即帧内编码帧、关键帧,可以理...…
-
iOS Crash 分析
关于Crash当app发生crash时,系统会生成crash report 存储在设备上,其中会描述app在何种情况下被系统终止,一般会包括完整的线程调用堆栈。包括以下2种report: Crash report:包含堆栈信息,被符号化之前是运行内容中的实际函数地址,需要将report与 .dSYM或 .app共同分析出内存中的实际地址映射的函数方法,从而便于定位问题。 Low Memory report:没有堆栈信息,由于低内存引发crash,下面会详细介绍符号化crash符号化常用...…
-
视频秒开优化方案
前置metadata:需要获取文件的metadata,解析出文件的编码,帧率等信息后才能开始边下边播,所以尽量让metadata或 MOOV box在靠近文件头部的位置,保证播放器尽快播放选择合适的缓冲策略:AVPlayer的 automaticallyWaitsToMinimizeStalling属性就是尽量多缓存一段时间,保证播放过程中减少卡顿使用HTTPDNS加快建连:获取最优的CDN节点地址,并每隔一段时间获取一次最佳CDN节点,准实时的保证使用最佳节点。提升CDN命中率:减少CD...…
-
网络优化策略
网络优化策略 NSCache缓存,Last-Modified, ETag DNS解析 数据压缩,protobuf, WebP 失败重发,缓存请求有网发送 弱网下设置不同超时时间NSCache缓存Get类似SQL查找,所以默认会缓存,Post是提交数据,类似UPDATE,所以不会缓存。Last-Modified:资源最后修改时间,来判断是否过期请求response中会包含该字段和时间,下次请求时加上if-Modified-since : xxxx, 如果资源无变化返回304 Not...…
-
各iOS版本适配概要
iOS9:App Thinning: 包括slicing, bitcode都是在不同设备上打包不同的app版本,iOS10:UIRefreshControl: 原来只是TableViewController的属性,现在增加成 UIScrollView的属性。可以脱离controller使用跳转到设置的方式:可以用 UIApplicationOpenSettingsURLStringUITableView和UICollectionView的 Pre-Feching 预加载和生命周期的优化,例...…
-
iOS 组件化方案选型
一、组件化概念1.1、项目状态各模块直接调用,耦合严重。业务模块间划分不清晰,相互引用,模块之间耦合度很大,非常难维护。所有模块代码都编写在一个项目中,测试某个模块或功能,需要编译运行整个项目,不能独立运行。1.2、解决方案所有的模块间的调用都会经过中间层中转(参考Router),但是发现增加这个中间层后,耦合还是存在的。中间层对被调用模块存在耦合,其他模块也需要耦合中间层才能发起调用。这样还是存在之前的相互耦合的问题,虽然可解决了统一调用的问题,而且本质上比之前更麻烦了。1.3、正确的组...…
-
iOS底层(8)- 性能优化
减少卡顿 尽量减少视图数量和层次 减少透明的视图 尽量避免出现离屏渲染离屏渲染如果要在显示屏上显示内容,我们至少需要一块与屏幕像素数据量一样大的frame buffer,作为像素数据存储区域,而这也是GPU存储渲染结果的地方。如果有时因为面临一些限制,无法把渲染结果直接写入frame buffer,而是先暂存在另外的内存区域,之后再写入frame buffer,那么这个过程被称之为离屏渲染。GPU离屏渲染:采用画家算法,把每一层依次输出到画布,如果父layer剪裁成圆角,容器子lay...…
-
iOS底层(7)- 内存管理
浅拷贝和深拷贝拷贝的最终目的是产生一个副本,修改副本不会对原对象产生影响。故到底是深拷贝还是浅拷贝要根据这个规则来判断。 [任意对象 copy] 产生一个不可变对象,如果原对象是不可变对象,那么就是浅拷贝,因为不可变对象本身就不能修改,所以没必要创新分配内存。原对象是可变对象,就是深拷贝。 [任意对象 mutableCopy] 产生一个可变对象,不论原对象是否是可变对象,都是深拷贝,因为要产生修改不影响原对象的副本,必须重新分配内存。定义属性时使用copy修饰词,目的是在赋值之后产生一...…
-
iOS底层(6)- runLoop & 多线程
runloop常见类型runloop 和线程一一对应,子线程默认不开启runloop,当第一次获取runloop时就会创建runloop。存在全局map中,key是线程,value是runlooprunloopModel结构体如下常见2种Mode: kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默认Mode,通常主线程是在这个Mode下运行 UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪...…
-
iOS底层(5)-Block
Block本质本质是一个OC对象,编译之后是一个结构体包含isa指针,block中封装了调用的函数和调用环境。调用环境值variables是block捕获的变量(如果block中访问了一些需要被捕获的变量,例如局部变量)block的变量捕获机制: 局部变量, auto临时变量会捕获到block内部,且用的值传递。static 会捕获,用的指针传递。 全局变量,不会捕获,block运行的时候会直接访问auto临时变量代表 autorelease的在一个作用域内的临时变量其中FuncPtr...…
-
iOS底层(4)-方法调用机制
消息发送objc_msgSend() 从cache缓存中查找方法,找到了直接调用 从class_rw_t方法列表中查找,找到了缓存到cache,再调用 从superClass 缓存中查找,找到了缓存到cache,再调用 从superClass class_rw_t方法列表中查找,找到了缓存到cache,再调用 递归父类查找,直到父类为空,执行下一步动态方法解析动态方法解析 若未动态解析过,则调用 resolveInstanceMethod: resolveClassMetho...…
-
iOS底层(3)-KVC & KVO
KVOPerson 类的对象p 注册监听。原理:注册监听后,系统利用runtime动态生成一个新的子类NSKVONotifying_Person对象,且将p->isa = NSKVONotifying_Person. 新的类重写set方法和class方法。在set方法中,先调用willChangeValueForKey, 然后赋值,最后didChangeValueForKey出发监听的方法。NSKVONotifying_Person ->superClass = PersonN...…