V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  jox  ›  全部回复第 7 页 / 共 21 页
回复总数  406
1 ... 3  4  5  6  7  8  9  10  11  12 ... 21  
2014-12-06 18:04:10 +08:00
回复了 dz225 创建的主题 宽带症候群 优化了个英国 vpn,不相信自己了。。。
@dz225 L2TP速度还行啊,正常用足够了,电脑翻墙的话我一般使用ssh tunnel,这个gfw的态度也是睁一只眼闭一只眼,一直都没有封掉,速度也还行,openvpn很容易被封掉的,如果是自己租的服务器的话不建议用openvpn,我当时用了一阵子openvpn,一是老得换端口很麻烦,二是担心这样下去搞不好会将ip地址给封掉,那就一切都玩完了,就不用了
我用text kit算高度有的时候也会遇到高度稍微差一点导致文字显示不全的时候,但是没有你差得这么多啊,这个具体的原因我没有深入研究,不过我的解决办法是找到个合适的magic number做为padding,一般就是10points到20points之间,把textcontainerInset设成0,然后在layout manager算出来的高度基础上再加上padding,这样的画text view最下面的空白高度会随着数据发生一点点浮动,大概也就5points以内,不过基本不影响整体的效果,我想也不会有人在意这个的吧,你可以试试。
2014-12-05 23:22:17 +08:00
回复了 dz225 创建的主题 宽带症候群 优化了个英国 vpn,不相信自己了。。。
openvpn用几天就会被屏蔽,换个端口可以接着用,当时我嫌老换端口麻烦,就没用了,用的L2TP,也挺好,手机默认就支持,而且GFW似乎对L2TP的态度是睁一只眼闭一只眼,反正我用了很久都没事儿~不过只是我自己和几个朋友用,服务器也是放在国外爸妈家里的一台老台式机,不知道跟这个有没有关系。
gif跟位图无关,你需要读取gif的所有帧数(使用 Image IO),然后使用uiimage的那个生成动画的方法创建个uiimage,然后直接用uiimageview就能渲染gif了,这个是最简单的,也可以使用更复杂的办法,使用flipboard的开源的那段代码,输出位图也很简单,直接使用text kit排版然后使用off-screen render技术渲染,然后得到bitmap图片,然后赋给layer的contents属性,如果你看不懂我在说什么,那么你需要看Core Animation的文档,以及Drawing and Printing的文档,以及Core Graphics的文档,大概看看了解一下iOS的应用是怎样把数据转化成屏幕的像素的,可以使用哪些技术来draw(core graphics,open GL),calayer是怎么回事,Core Animation是怎样工作的,哪些工作由CPU完成,哪些工作由GPU完成,lots of documentations to read, my friend
还有你折腾text view的contentSize干啥,这个属性应该是不需要理会的,我用text kit的时候不用text view来渲染文字,为了追求性能,我是渲染完文字之后直接输出位图的,用text view的话不是很简单么,你设定text container的宽度,排版,然后query高度,这样你就得到了text view渲染一定数量文字需要的尺寸,如果后面还要往里面贴图,就用boundingRect。。。的那个方法找到图片的位置把图片贴进去或者画进去,如果是静态图片的画也可以直接赋给attachment的image,这样layout manager会自动帮你渲染图片。
。。。。。。

你忘记设置text view的textContainerInset了,这个默认上下各是8points,所以会有16的差距,你要把这个弄成UIEdgeZero,这样算出来的就对了,你算出来后把这个inset考虑进去。至于你说的有一两点point的差距是正常的,不可能每一行都放下同样数量的glyph,这个不用理会,你只需要按照你需要的尺寸设定宽度就行了,layout manger和text container配合排版的时候会考虑到你设定的宽度,最终排版完高度不就有了么?话说你算宽度干啥?你贴了太多东西了,我有点累了,没仔细看
2014-12-05 17:28:42 +08:00
回复了 jox 创建的主题 iDev 有没有办法提高 iOS 下 gif 的性能啊?
@Smartype flipboard的做法就是使用CADisplayLink的,他们的做法是在需要刷新的时候直接使用解压缩过的图片来设置layer的contents属性。所以可以提前强制解压,或者只在第一次渲染的时候解压缩,后续的渲染保证流畅。

如果使用UIImageVIew来渲染的话,使用UIImage的-(UIImage *)animatedImageWithImages:(NSArray *)images duration:(NSTimeInterval)duration
来创建gif,然后直接set UIImageVIew的image属性也可以渲染gif,我不清楚UIImageView是怎么实现的,但是这么做的话的确会导致卡顿,因为UIImageView的animationImages的属性是copy,所以我猜测内部实现是使用的CAKeyframeAnimation,CAKeyframeAnimation来实现gif的话就是要把每一帧都copy过去,Image I/O要想直接使用解压缩过的数据似乎得保留UIImage指针,这个应该很容易就能测试出来,copy的话就不是之前的指针了,于是就又解压缩了一次,这个是在主线程发生的,否则无法解释卡顿现象啊。
上面

[textStorage setAttributedString:]

这个应该是你得到的NSAttributedString,不是NSString,这是基于我写的程序里的代码改的,我改的时候忘记了。
static NSTextStorage *textStorage;
static NSTextContainer *textContainer;
static NSLayoutManager *layoutManager;;
static CGFloat contentWidth;
static dispatch_once_t oncePredicate;

UIViewController * __weak weakSelf = self;
dispatch_once(&oncePredicate, ^{
contentWidth = CGRectGetWidth(weakSelf.tableView.frame);
textStorage = [[NSTextStorage alloc] init];
layoutManager = [[NSLayoutManager alloc] init];
[textStorage addLayoutManager:layoutManager];
textContainer = [[NSTextContainer alloc] initWithSize:CGSizeMake(contentWidth, FLT_MAX)];
textContainer.lineFragmentPadding = 0;
[layoutManager addTextContainer:textContainer];
contentOrigin = CGPointZero;
});

[textStorage setAttributedString:@"the content"];
[layoutManager ensureLayoutForTextContainer:textContainer];
CGRect frame = [layoutManager usedRectForTextContainer:textContainer];
frame.size.width = contentWidth;

// frame should be the frame of the target text view, and you can calculate the height of the cell based on this
2014-12-05 16:25:14 +08:00
回复了 spacewander 创建的主题 程序员 你会拆分这样的函数么?
如果A,B,C只在dosomething里会用到,没必要拆分,在 不同的功能块前面使用注释区分也一样,性能上也有一点点优势,免去了函数调用的开销,如果dosomething很长,无所谓,现在的IDE都带代码折叠功能,不需要编辑的区块折叠起来就行

不过不需要拆分的情况不多见,一般函数之间都是互相调来调去的,都需要把重复的代码弄成个函数
2014-12-05 14:19:45 +08:00
回复了 whalegia 创建的主题 程序员 [ LeetCode] Next Permutation(又是我 TAT……已哭晕)
@proudzhu 我不使用leetcode,我一般都是需要什么算法的话直接去翻算法的资料,这个leetcode应该是为了方便应付找工作时候的“考试”,我暂时没有这种需求
2014-12-05 14:17:19 +08:00
回复了 whalegia 创建的主题 程序员 [ LeetCode] Next Permutation(又是我 TAT……已哭晕)
@proudzhu 我晕,我没去看这个问题,也没看那个python的代码,我以为lz说的是问题给的例子呢
2014-12-05 13:53:07 +08:00
回复了 whalegia 创建的主题 程序员 [ LeetCode] Next Permutation(又是我 TAT……已哭晕)
@proudzhu 他说是lexicographically next greater permutation of numbers,如果按照这个描述,1243应该得到结果1324,要么是描述有问题,要么是给的例子有问题。
2014-12-05 13:22:26 +08:00
回复了 whalegia 创建的主题 程序员 [ LeetCode] Next Permutation(又是我 TAT……已哭晕)
1243的下一个字典序是1324没错的,这道题描述的有问题,如果按照这道题的描述,例子1243应该得到结果1324.

算法:
1. 从右向左扫描,找到第一个i满足条件: num[i] > num[i - 1],如果找不到,那么当前序列就是最大序列,直接翻转得到结果
2. 从右向左扫描,找到第一个j满足条件:num[j] > num[i - 1],这个j一定存在,因为num[i]就大于num[i - 1]
3. num[j]和num[i - 1] 互换位置
4. 翻转从i到最后一个数字的序列得到结果

你给的那个python的算法自己都解释不清,他说sort right,结果也没sort right,我反正是没看懂。
另外你不需要自己做缓存,如果你使用nsurlsession的话会自动缓存图片数据,用image io的话会自动缓存解码过的图片数据到内存,你可以用nscache缓存解码过的图片对象,不必担心内存,nscache在内存不够的时候会自动释放内存,这样你只不过需要重新解码,不会重新下载图片,因为nsurlsession会缓存图片到硬盘上,只要应用不关,系统是不会删除你的缓存数据的
用tableview的话你需要提前计算每个cell的高度并缓存计算结果,方法很简单,数据到位之后触发的callback里用一组textkit对象进行排版,然后使用layoutmanager获取排版之后的文字frame,高度就有了,因为排版是lazy方式触发的,你需要强制让排版触发,使用layoutmanager的ensure。。开头的几个方法之一,就可以强制要求layoutmanager排版,记住textkit只是个排版引擎,所以这里渲染不会发生,要搞清楚这点,这里只有排版的开销,真正需要渲染的时候依然要进行排版,但是因为你已经计算好了渲染文字需要的尺寸,到时候直接修改textview的frame就行。

睡觉热醒了,手机不方便贴代码,你要不明白回头我拿电脑的时候可以贴示例
2014-12-04 23:30:48 +08:00
回复了 jox 创建的主题 iDev 哎, auto layout。。。。。
@hrx00747 我也不在代码里手动加载约束,太啰嗦了,我要么直接修改frame,要么就把约束IBOutlet出来再根据情况修改constant属性,有些布局在design time是不能够决定的,只能在代码里手动做调整,嘿,我研究了几天AutoLayout,算是整明白了,现在感觉AutoLayout确实很好用!
2014-12-04 23:27:48 +08:00
回复了 jox 创建的主题 iDev 有没有办法提高 iOS 下 gif 的性能啊?
@gluttony UIWebView不行,不可能每个tablecell里都加载个UIWebView,最开始我就用过web view,效果不满意,而且有一些问题绕不过去,其实只要修改每帧的尺寸即使一下载入好几十帧也不怎么占内存,但是想要丝般顺滑,必须要跳过重复解码的过程。flipboard的方法应该能够解决我的问题,我需要好好研究一下他们的源代码
2014-12-04 23:23:57 +08:00
回复了 jox 创建的主题 iDev 有没有办法提高 iOS 下 gif 的性能啊?
@vixvix 嘿,我也刚刚找到了这篇文章,我下载下来了源码看了一下,他们是使用的CADisplayLink,然后手动渲染layer的内容,这样就可以不必重复解码了,我还不太清楚CADisplayLink怎么用,这个应该是我需要的,不过同样非常感谢
2014-12-04 23:00:54 +08:00
回复了 jox 创建的主题 iDev 有没有办法提高 iOS 下 gif 的性能啊?
@matrix67 额,对,gif会导致cpu和gpu不停地工作,确实会费电。。。。我在考虑要不要也学别人只渲染第一帧意思意思得了。。。
1 ... 3  4  5  6  7  8  9  10  11  12 ... 21  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2413 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 18ms · UTC 15:57 · PVG 23:57 · LAX 07:57 · JFK 10:57
Developed with CodeLauncher
♥ Do have faith in what you're doing.