还在用 OpenGL? Metal 和 Vulkan 了解一下! 最近做一个移动端动效的项目需要用到 OpenGL。我们知道它基于 C 语言实现,拥有跨平台支持;但诞生于上世纪 90 年代的它,必然有历史局限性: 不支持预编译 Shader; 不支持多 CPU 线程; 不支持直接访问底层 GPU CommandBuffer; 所以,苹果 WWDC 2014 推出了新的图形渲染技术 Metal,并且从 iOS 12 开始将 OpenGL 相关 API 标记 2018-09-09 编程 iOS OpenGL Metal Vulkan SPIR-V 图形渲染
iOS 引用 C/C++ 项目:平台差异导致的代码移植 由于 Linux(包括 Android)在嵌入式和服务端的流行,很多 C/C++ 代码都是专为 Linux 而写;加上历史原因,很可能还是基于 GCC 编译; 而 iOS/MacOS 基于类 Unix 系统 BSD,并且从 2011 年的 OS X 10.7 开始,默认的 C++ Runtime 就从 GNU 的 libstdc++ 迁移到 LLVM 的 libc++,二者不完全二进制兼 2017-08-30 编程 iOS C++ 跨平台 Clang epoll kqueue pthread
iOS 引用 C/C++ 项目:交叉编译与 Objective-C++ 最近终于有幸参与公司的 iOS 项目,其中有个 C/C++ 写的库需要调用; 之前对 Android JNI/NDK 调用 C/C++ 还算熟悉,但 iOS 混编 C/C++ 却是初次接触,各种被虐.. 上个周末基本都在解决库的编译问题,爱人 Amble 也耐心帮我查资料、作分析,感动之余,决定把中途遇到的问题记录下来。 2017-06-06 编程 iOS Objective-C C++ 跨平台 CMake Clang
FileChannel 高速拷贝文件的秘密 最近在做性能优化,发现 Java NIO 中的 FileChannel 类的 transfer 相关方法,能显著提升文件拷贝速度(自测减少耗时 30-70% 左右)。 官方的说法是,利用了文件系统的缓存: This method is potentially much more efficient than a simple loop that reads from the source cha 2016-09-22 编程 Android Java Linux 操作系统 IO 内存管理
SQLite 并发读写问题 Android 中对 SQLiteDatabase 多线程并发读写时,很容易抛出以下异常: java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed. at android.database.sqlite.SQLiteConnectionPo 2016-09-07 编程 Android SQLite
JNI 引用问题梳理 最近项目中有个视频文件分块上传的模块,核心逻辑是 C/C++ 实现的,Android 上层调用自然又要写 JNI。 其中有个需求是 Native 层上传进度更新时需要回调 Java 代码,这里我用了 C++11 的 Lambda 表达式: std::function<void(unsigned)> cxx_progress_callback; if (jcallback) & 2015-11-19 编程 Android JNI C++ 跨平台
Java 内存分配与垃圾回收机制 程序计数器: 用于指示当前线程执行的指令行号,字节码解释器通过改变它的值选取下一条待执行的指令; 分支、循环、跳转、异常处理、线程恢复都需要依赖它; 它是线程私有的; 2015-07-16 编程 Java JVM
DexClassLoader 实现 Android 插件加载 Java 中的 ClassLoader:Java 中 ClassLoader 用于动态加载 Class 到 JVM,包含 BootstrapClassLoader(C++ 编写,用于加载系统核心类)、ExtClassLoader(用于加载 lib/ext/ 目录的扩展 API)、AppClassLoader(加载 CLASSPATH 目录下的类)。 双亲委托机制: 任何自定 2015-04-19 编程 Android Java
深入理解 Android:ActivityManagerService Linux 设置进程优先级函数:int setpriority(int which, int who, int prio); 参数 which 和 who 联合使用: which 为 PRIO_PROGRESS 时,who 代表进程; which 为 PRIO_PGROUP 时, who 代表进程组; which 为 PRIO_USER 时,who 代表 uid; 参数 prio 2015-04-14 编程 Android
深入理解 Android:PowerManagerService、BatteryService/BatteryStatsService PowerManagerService 简介: PowerManagerService 从 IPowerManager.Stub 类派生,并实现了 Watchdog.Monitor 和 LocalPowerManager 接口; 客户端使用 PowerManager 类,其内部通过代表 BinderProxy 端的 mService 成员变量与 PowerManagerService 进行 Bi 2015-04-07 编程 Android
深入理解 Android:PackageManagerService SystemServer 创建 PackageManagerService: 调用 PackageManagerService 的 main() 方法,得到 IPackageManager 对象; 调用 IPackageManager.isFirstBoot() 判断是否开机后第一次启动(Zygote 或 SystemServer 退出后,init 会再次启动它们); 调用 IPackageM 2015-04-05 编程 Android
深入理解 Android:Surface 系统 FrameBufferDevice: FrameBuffer 就是存储图像帧数据的缓冲区; FrameBufferDevice 是 Linux 平台的虚拟显示设备,为真实设备提供统一框架,这样应用层通过标准的 ioctl、mmap 系统调用就可以操作显示设备; FrameBuffer 中的缓冲区就是通过 mmap 把设备中的显存映射到用户空间的:在这块缓冲区写数据,就相当于在屏幕上绘制; 2015-04-03 编程 Android
深入理解 Android:Binder 通信机制 Native 层 Binder 通信:初始化 ProcessState: 单例模式,一个进程只能初始化一次; 构造函数初始化 mDriverFD 参数时,自动调用 open_driver(),打开 /dev/binder 设备,它是用于内核进程间通信的虚拟设备; 对 open_driver() 返回的 mDriverFD 对象,调用 nmap() 方法,为 Binder 分配内存用于接收数据 2015-03-31 编程 Android
深入理解 Android:线程、同步、消息 Linux 中的 epoll 机制: epoll 是 Linux 中高效的 IO 复用机制,显著提高大量并发连接下只有少数活跃时 CPU 的利用率; epoll 无需要遍历整个被监听的文件描述符集合,只需遍历被内核 IO 事件异步唤醒而加入 Ready 队列的文件描述符集合; epoll 不仅提供 select/poll 那种 IO 等待的水平触发(Level Triggered),还提供边缘 2015-03-28 编程 Android
深入理解 Android:系统初始化 系统初始化(init):加载并解析配置文件: 调用 parse_config() 解析 init.rc; init.rc 中包含一个个 section,调用 parse_new_section() 逐个解析; parse_new_section() 内部调用 parse_service() 和 parse_line_service(); 创建 zygote: zygote 被放在一个 2015-03-27 编程 Android