jjgod / blog Random notes & thoughts by Jiang Jiang.

Archive for April 2010

阅读器的进度显示与估计

对电子书阅读器来说,提示当前阅读进度是一项很自然的功能,习惯用电脑的人都常看到进度条 (progress bar) 和滚动条 (scroll bar),如右图是 Textus 中使用的右侧滚动条。 然而在实际实现中,进度计算是一件伤脑筋的事情,比如 Textus 的实现其实很简单:在打开文件时读入整个文件,然后整个交给 Core Text 去排版,将排版后的结果分解为行 (CTLineRef) 记录下来,并将所有行总的高度设置为整个文本视图的高度,这样,每当滚动视图 (NSScrollView) 移动到某个位置时,重绘函数 (-drawRect:) 被调用到,我们根据该位置来判断应该绘制从第几行到第几行的内容,再调用 Core Text 把这些行画出来。 这么做看似很简单直接,结果也很容易保证正确,带来的问题是,每次用户修改设置 (比如调整字体大小、窗口尺寸) 时,就得把整个文件重新排版一遍,即使此时我们只需要看到当前一页的内容。为什么这种方法这么低效,我还一直使用它呢?因为这个实现严格依赖滚动视图给出的位置来判断当前阅读进度,所以总的高度估计必须非常精确,不然随便滚动一下就可能出现错位,而一次算给出整个高度的方法最准确,不容易出错。

Mac OS X 下与 SSD 相关的优化

最近刚入手一块 Intel X25-M G2 80G SSD,使用效果不错,于是整理了下面这些跟 SSD 有关的优化经验: 安装 因为 SSD 比较小,而有些数据又不是那么需要快速的访问,所以我保留了 MacBook Pro 里自带的 320G 7200 RPM 硬盘,做了如下改动: 买了一个光驱位硬盘托架,最有名,也是最贵的一种要 $99,但山寨版可以在淘宝找到,对于 Unibody 的机器来说,找 9.5mm 高的那种型号就行,比如 Fenvi 的,建议买 100 以内的。 把 MBP 拆开,SuperDrive 取下,把原来的硬盘取出,放入光驱位硬盘托架,把 SSD 接在原来的硬盘所接的 SATA 口,然后把硬盘托架安装回原来光驱的位置。这种搭配是为了保证用 SSD 做系统盘 (挂载在 / 上) 时系统能正确的让硬盘休眠。当然,如果你比较奢侈地买两块 SSD,也可以让他们组成 RAID0,这样性能就更夸张了。 给在 SSD 所在卷分区,只需要分一个区,安装系统。新的系统会把原来那块硬盘也列出来。这时修改 /etc/fstab,加入: /dev/disk1s2 /Users/jjgod/Downloads hfs rw 这个做法是把原来那块硬盘挂载在我自己这个用户的 Downloads [...]