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却可以实现那么长的剧情?
网友评论