图形学笔记-光照

开篇 计算机图形学(Computer Graphics)是一种使用数学算法将二维或三维图形转换为计算机显示器的栅格形式的科学 本文为学习图形学过程中,使用iOS平台开发语言模拟图像渲染和变化的笔记 系列往期 图形学笔记-渲染 图形学笔记-变换 物体显色 自然光是由多种不同波长的光组成的,通过凸透镜等工具折射反射后,会呈现出不同波长的光,表现为不同的颜色,例如彩虹形成的七种颜色就是自然光折射呈七种不同波长的光线进入肉眼后看到的。由于不同物质会吸收不同波长的光,反射其不能吸收的光,反射的可见光就被会被当做该物体的颜色。打个比方,使用RGB颜色系统,自然光可以认为是白色,其表示为 lightColor = RGB(1, 1, 1) 一个看起来是红色的物体,自然光在入射到...
Click to read more ...

图形学笔记-变换

开篇 计算机图形学(Computer Graphics)是一种使用数学算法将二维或三维图形转换为计算机显示器的栅格形式的科学 本文为学习图形学过程中,使用iOS平台开发语言模拟图像渲染和变化的笔记 系列往期 图形学笔记-渲染 欧拉角 欧拉角表示三维空间中可以任意旋转的3个值,分别是俯仰角(Pitch)、偏航角(Yaw)和滚转角(Roll),可以认为是物体基于自身坐标系分别沿着X轴、Y轴和Z轴做旋转的变换 变换矩阵 向量AB旋转β角度到了AB'的位置,可以得到 B'.x = |AB| * cos(α+β) = |AB| * (cosα*cosβ - sinα*sinβ) = B.x * cosβ - B.y * sinβ B'.y = |AB| * sin(α+β)...
Click to read more ...

图形学笔记-渲染

开篇 计算机图形学(Computer Graphics)是一种使用数学算法将二维或三维图形转换为计算机显示器的栅格形式的科学 本文为学习图形学过程中,使用iOS平台开发语言模拟图像渲染和变化的笔记 像素渲染 将像素展示到屏幕上需要借助CoreGraphics的接口,假设需要渲染width * height的图像,需要先分配色彩空间为ARGB的位图 #define BYTES_PER_RGB 4 typedef struct SDLBitmapContext { CGSize size; uint32_t *buffer; CGContextRef cgContext; CGColorSpaceRef colorSpace; } SDLBi...
Click to read more ...

iOS中的内嵌汇编

写一篇在iOS上使用汇编的文章的想法在脑袋里面停留了很久了,但是迟迟没有动手。虽然早前在做启动耗时优化的工作中,也做过通过拦截objc_msgSend并插入汇编指令来统计方法调用耗时的工作,但也只仅此而已。刚好最近的时间项目在做安全加固,需要写更多的汇编来提高安全性(文章内汇编使用指令集为ARM64),也就有了本文 内嵌汇编格式 __asm__ [关键词]( 指令 : [输出操作数列表] : [输入操作数列表] : [被污染的寄存器列表] ); 比如函数中存在a、b、c三个变量,要实现a = b + c这句代码,汇编代码如下: __asm__ volatile( "mov x0, %[b]\n" "mov x1, %[c]\n"...
Click to read more ...

Combine和SwiftUI

尽管今年的WWDC已经落幕,但在过去的一个多月时间,苹果给iOS开发者带来了许多惊喜,其中堪称最重量级的当属SwiftUI和Combine两大新框架 在更早之前,由于缺少系统层的声明式UI语言,在iOS系统上的UI开发对于开发者而言,并不友善,而从iOS13开始,开发者们终于可以摆脱落后的布局系统,拥抱更简洁高效的开发新时代。与SwiftUI配套发布的响应式编程框架Combine提供了更优美的开发方式,这也意味着Swift真正成为了iOS开发者们必须学习的语言。本文基于Swift5.1版本,介绍SwiftUI是如何通过结合Combine完成数据绑定 SwiftUI 首先来个例子,假如我们要实现上图的登陆界面,按照以往使用UIKit进行开发,那么我们需要: 创建一个UIT...
Click to read more ...

OOM与内存

微视的crash log会夹带应用剩余内存信息上报给服务器,希望借此协助诊断崩溃是否由OOM引发。多数情况下,OOM不直接导致crash,而是以SIGSEGV的信号错误,其操作逻辑更像是内存无法分配,却依然访问这个无效地址: int *ptr = malloc(sizeof(int *)); *ptr = 0x100; // crash by access invalid memory 下面是一个只保留了主线程调用栈的crash log(屏蔽部分敏感信息后): Handler: Signal Handler Hardware Model: iPhone8,2 Process: microvision [2581] Path: /var/containers/Bundle/...
Click to read more ...

记一次重构

技术重构 重构是软件开发过程中不断对软件代码进行打散重组,提高代码稳定性和可读性的处理手段之一。对【技术重构】进行关键信息提炼可以得到思维导图: 本文以微视最近一次音乐播放功能的重构为例回顾重构过程 重构步骤 业务梳理 微视4.8版本增加了音乐榜单功能,在更早之前的版本拥有音乐播放的界面只有音乐聚合页,相较于音乐聚合页同时只有一首歌曲需要控制播放,音乐榜单页存在切歌、榜单切换的场景,逻辑处置起来要棘手的多。另外由于音乐播放应该是一个通用能力,在重构前控制器需要维护AVPlayer的各种状态,代码格式如下: - (void)observeValueForKeyPath: (NSString *)keyPath ofObject: ...
Click to read more ...