ARTS 打卡 1

Algorithm

https://leetcode-cn.com/problems/qiu-12n-lcof/
求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
限制:1 <= n <= 10000

int sumNums(int n) {
    n && (n += sumNums(n - 1)); //也可以是(n-1) && (n += sumNums(n - 1));
    return n;
}

分析:

  • 题目中限制乘除操作,就不能使用(1+n)*n/2.0的公式了
  • 限制了控制语句和循环语句的使用,不能简单的遍历计算了
  • 那么下面想到的就是递归来遍历,但是需要一个结束条件
  • 利用 && 语法的短路特性,可以在 n == 0 的时候结束
  • 这个题主要考察基本语法的掌握情况

Review

SF Symbols | New Era in the iOS app symbols
讲 iOS13 上系统自带了很多图标,这些图标如何使用。
这些图标(就目前来讲)很少会在商业 App 中使用,一个是样式不一定符合 UI 要求,一个是系统兼容性。

不过文章里提到了 FaceTime 的图标,能且只能用在表示 FaceTime app 的场景。说不定某次需求,会使用某种系统图标呢


FaceTime图标

Tips

CAShapeLayer添加太多性能也会比较差

之前只是使用 CAShapeLayer 做一些动画,使用场景比较单一,最近在了解使用 CAShapeLayer 或者 Metal 绘制图形。

CAShapeLayer 是更省事的选择,可以直接将贝塞尔曲线渲染,也可以设置线的颜色,dash pattern等,很省事,但是也有很多局限,比如单个 ShapeLayer只能有一种线颜色和填充颜色,只能有一种 dash pattern

所以如果绘制一个图形,里面有多种颜色,或者绘制多个不同颜色的图形,就需要多个CAShapeLayer。于是就测试了一下每帧刷新1000个CAShapeLayer的FPS,最终解决在 iPhone11真机上是 20,考虑到实际APP还有很多复杂渲染逻辑,这个结果不太理想。

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, strong) CADisplayLink *link;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setupLayers];
    self.link = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateLayers)];
    self.link.preferredFramesPerSecond = 60;
    [self.link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
}

- (void)updateLayers {

    [self.view.layer.sublayers enumerateObjectsUsingBlock:^(__kindof CALayer * _Nonnull layer, NSUInteger idx, BOOL * _Nonnull stop) {
        if ([layer isKindOfClass:[CAShapeLayer class]]) {
            CAShapeLayer *shapeLayer = (CAShapeLayer *)layer;
            shapeLayer.fillColor = [self randomColor].CGColor;
        }
    }];
    
}

- (void)setupLayers {
    for (int i = 0; i < 500; i++) {

        CAShapeLayer *layer = [CAShapeLayer layer];
        layer.strokeColor = [UIColor redColor].CGColor;
        layer.fillColor = [self randomColor].CGColor;
        layer.path = [self generatePathWithIndex:i].CGPath;
        [self.view.layer addSublayer:layer];
    }
}

- (UIBezierPath *)generatePathWithIndex:(NSInteger)i {
    UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(10, 10, 500 - i/5.0, 500 - i/5.0)];
    path.lineWidth = 0.1;
    return path;
}

- (UIColor *)randomColor {
    return [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1];
}

@end

FPS

Share

Metal并行计算的学习笔记:
Metal 学习笔记

另外转发一篇别人写的好文:
为什么魂斗罗只有128KB却可以实现那么长的剧情?