Geek – 夏清然的日志 https://www.qingran.net Xia Qingran Geek Blog Sun, 07 Aug 2016 09:50:33 +0000 en-US hourly 1 https://wordpress.org/?v=4.6.1 112893047 禁止Mac OS X spotlight对移动存储设备的索引 https://www.qingran.net/2013/09/%e7%a6%81%e6%ad%a2mac-os-x-spotlight%e5%af%b9%e7%a7%bb%e5%8a%a8%e5%ad%98%e5%82%a8%e8%ae%be%e5%a4%87%e7%9a%84%e7%b4%a2%e5%bc%95/ https://www.qingran.net/2013/09/%e7%a6%81%e6%ad%a2mac-os-x-spotlight%e5%af%b9%e7%a7%bb%e5%8a%a8%e5%ad%98%e5%82%a8%e8%ae%be%e5%a4%87%e7%9a%84%e7%b4%a2%e5%bc%95/#respond Fri, 06 Sep 2013 09:30:37 +0000 https://www.qingran.net/?p=1915 最近发现kindle的根目录下有一堆.开头的文件夹:


.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes

而且看个头都挺大的(几十兆),是Mac OS X的自带的spotlight的索引文件。

就查了下怎么禁止spotlight对一个移动设备进行索引(移动硬盘、手机、kindle等)。

很简单,在移动存储设备的根目录下建立 .metadata_never_index 文件。

Mac OS X下在终端,进入到移动硬盘根目录:

touch .metadata_never_index

Windows在命令行或者运行执行(J为盘符):

echo > J:\.metadata_never_index

]]>
https://www.qingran.net/2013/09/%e7%a6%81%e6%ad%a2mac-os-x-spotlight%e5%af%b9%e7%a7%bb%e5%8a%a8%e5%ad%98%e5%82%a8%e8%ae%be%e5%a4%87%e7%9a%84%e7%b4%a2%e5%bc%95/feed/ 0 1915
使用AutoHotkey修改windows 下触摸板改为“自然滚动” https://www.qingran.net/2013/08/%e4%bd%bf%e7%94%a8autohotkey%e4%bf%ae%e6%94%b9windows-%e4%b8%8b%e8%a7%a6%e6%91%b8%e6%9d%bf%e6%94%b9%e4%b8%ba%e8%87%aa%e7%84%b6%e6%bb%9a%e5%8a%a8/ https://www.qingran.net/2013/08/%e4%bd%bf%e7%94%a8autohotkey%e4%bf%ae%e6%94%b9windows-%e4%b8%8b%e8%a7%a6%e6%91%b8%e6%9d%bf%e6%94%b9%e4%b8%ba%e8%87%aa%e7%84%b6%e6%bb%9a%e5%8a%a8/#respond Tue, 27 Aug 2013 12:41:11 +0000 https://www.qingran.net/?p=1911 启动 里即可。]]> macbook使用习惯后,都喜欢了所谓的“触摸板自然滚动”,原因很简单,和iphone、ipad等触屏保持一致。

一直寻找windows下的解决方案,经过一段时间终于找到了AutoHotkey这个软件。

下载AutoHotkey http://www.autohotkey.com/,然后安装。

新建文件reverse-roll.ahk,输入内容:

#MaxHotkeysPerInterval 200

WheelUp::
Send {WheelDown}
Return

WheelDown::
Send {WheelUp}
Return

如果有报错说是MaxHotkeysPerInterval不够的话,继续加大第一行的数值。

然后右键点击这个文件,选compile script,生成exe文件,拖动到 开始-> 启动 里即可。

]]>
https://www.qingran.net/2013/08/%e4%bd%bf%e7%94%a8autohotkey%e4%bf%ae%e6%94%b9windows-%e4%b8%8b%e8%a7%a6%e6%91%b8%e6%9d%bf%e6%94%b9%e4%b8%ba%e8%87%aa%e7%84%b6%e6%bb%9a%e5%8a%a8/feed/ 0 1911
不越狱,不破解,给kindle paperwhite增加字体 https://www.qingran.net/2013/08/%e4%b8%8d%e8%b6%8a%e7%8b%b1%ef%bc%8c%e4%b8%8d%e7%a0%b4%e8%a7%a3%ef%bc%8c%e7%bb%99kindle-paperwhite%e5%a2%9e%e5%8a%a0%e5%ad%97%e4%bd%93/ https://www.qingran.net/2013/08/%e4%b8%8d%e8%b6%8a%e7%8b%b1%ef%bc%8c%e4%b8%8d%e7%a0%b4%e8%a7%a3%ef%bc%8c%e7%bb%99kindle-paperwhite%e5%a2%9e%e5%8a%a0%e5%ad%97%e4%bd%93/#respond Thu, 15 Aug 2013 15:43:09 +0000 https://www.qingran.net/?p=1885 不越狱,不破解,给kindle paperwhite增加字体

插上USB连接kindle,进入kindle设备根目录。

创建一个空文件USE_ALT_FONTS。

$ touch USE_ALT_FONTS

创建文件夹fonts

$ mkdir fonts

拷贝字体文件到fonts目录里,字体文件名可以用UTF-8编码的中文,比如方正中雅宋:

http://fonts.mobanwang.com/fangzheng/200908/5052.html

 

结束!重启kindle,进入设置,打开菜单,选重启!

 

]]>
https://www.qingran.net/2013/08/%e4%b8%8d%e8%b6%8a%e7%8b%b1%ef%bc%8c%e4%b8%8d%e7%a0%b4%e8%a7%a3%ef%bc%8c%e7%bb%99kindle-paperwhite%e5%a2%9e%e5%8a%a0%e5%ad%97%e4%bd%93/feed/ 0 1885
2011年款Macbook Pro 15寸笔记本升级SSD和内存图文说明 https://www.qingran.net/2011/11/2011%e5%b9%b4%e6%ac%bemacbook-pro-15%e5%af%b8%e7%ac%94%e8%ae%b0%e6%9c%ac%e5%8d%87%e7%ba%a7ssd%e5%92%8c%e5%86%85%e5%ad%98%e5%9b%be%e6%96%87%e8%af%b4%e6%98%8e/ https://www.qingran.net/2011/11/2011%e5%b9%b4%e6%ac%bemacbook-pro-15%e5%af%b8%e7%ac%94%e8%ae%b0%e6%9c%ac%e5%8d%87%e7%ba%a7ssd%e5%92%8c%e5%86%85%e5%ad%98%e5%9b%be%e6%96%87%e8%af%b4%e6%98%8e/#comments Sun, 13 Nov 2011 10:47:43 +0000 https://www.qingran.net/?p=1679  

ZoomQuiet一直追着我要这个文档,今儿又在buzz上说了一下,今天周末加班搞定这个欠账吧。

拆装这些东西已经有很多经验,单纯一个流水账应付周总之用。

首先准备材料,SSD和内存购自amazon.com,使用buytong.com美国代购运回国内,代购的费用是RMB 50元左右,包含包装、EMS和保价费。

SSD使用的是Corsair Force Series GT 120GB,支持SATA III接口,读写速度标称是555MB/s和515MB/s,nb的是IOPS号称85K,这是我买这款的关键,amazon链接

内存使用的是目前笔记本里最高等级的Kingston HyperX DDR3-1600MHz内存,amazon链接

就是他们:


同时购买了一个硬盘架和USB光驱盒,用于放第二块儿硬盘和拆下来的光驱,taobao链接

方案是把原机配的硬盘放置于光驱位,因为我这个2011年早期的macbook pro光驱位只支持SATA II,看其中的link speed字段:

释放身上静电,整理好桌面,开始拆机之旅。

  1. 底部螺丝卸掉,先以对角线方向松螺丝,揭掉底盖露出机器内部:
  2. 松开电池卡扣,停止电池向主板供电,卸掉原有内存:
  3. 装上新内存,到此内存升级完毕:
  4. 拆原有硬盘,四角四个螺丝拧掉,很容易拆下原有硬盘:
  5. 新硬盘按上很容易
  6. 拆掉光驱,仔细看看周围阻挡的排线和螺丝,松之:
  7. ,

  8. 把硬盘上到硬盘盒子上,同时光驱上有一个卡扣需要拆下装到硬盘盒上:
  9. 同时硬盘盒外侧有两处对两个螺丝的固定有一定的阻碍,需要用一个小锉刀简单处理一下,并且金属屑绝对不能带入机器内部,然后安排好排线,上紧螺丝,这是最麻烦的一步,当时忘记进行图片记录了,细心一些很容易搞定:
  10. 最后检查一下:所有的螺丝是否上齐,插上所有的排线(尤其不要忘记电池的排线),清理灰尘,清理排线走向,完工!

我在新ssd上重新安装lion,开机按option,进入原有硬盘的recovery disk,然后step by step的进行lion的安装。因为是网络下载安装,进行了两天两夜,好在这个下载支持断点续传,晚上忙完回家开始下载,早上关掉上班。第二天继续。安装完成后开机只需要5s左右,一圈半“菊花”,应用程序都是秒开。

这第二台自购笔记本用了半年很爽,做工一流,升级的高分辨率雾面屏很好,此次升级后再也没什么可折腾的,安心使用到淘汰。

]]>
https://www.qingran.net/2011/11/2011%e5%b9%b4%e6%ac%bemacbook-pro-15%e5%af%b8%e7%ac%94%e8%ae%b0%e6%9c%ac%e5%8d%87%e7%ba%a7ssd%e5%92%8c%e5%86%85%e5%ad%98%e5%9b%be%e6%96%87%e8%af%b4%e6%98%8e/feed/ 2 1679
使用GPU加速H.264编码分析 https://www.qingran.net/2011/07/%e4%bd%bf%e7%94%a8gpu%e5%8a%a0%e9%80%9fh-264%e7%bc%96%e7%a0%81%e5%88%86%e6%9e%90/ https://www.qingran.net/2011/07/%e4%bd%bf%e7%94%a8gpu%e5%8a%a0%e9%80%9fh-264%e7%bc%96%e7%a0%81%e5%88%86%e6%9e%90/#comments Wed, 13 Jul 2011 22:48:46 +0000 https://www.qingran.net/?p=1215 继前面的“GPGPU”和“CUDA和OpenCL”的简介后,接下来分析一个具体的使用案例:是否可以用GPU搭建一个高性能的H.264编解码服务器?

设想一个简单的需求:

  1. 把其他编码的视频转换为指定码率的H.264;
  2. 在转换过程中做一些简单的处理(例如增删水印、字幕的处理、声音的处理等);
  3. 需要封装成指定的一种container格式,比如mp4或mkv。

 

ffmpeg完成此项工作的大概过程是:

  1. 识别文件格式,打开视频文件容器,得到video_stream;
  2. 使用libavcodec把video_stream解码成原始的frame数据;
  3. 在frame的基础上做“需求2”的处理;
  4. 编码成H.264格式;
  5. 存放到指定格式的容器中(mp4或者mkv)。

“过程1”应该是一个轻量操作,且对于现有视频格式速度应该很快(播放器看片的时候不可能先等上几秒分析一把格式再开始播放吧?)。

“过程2”需要把原有的视频编码解码并转为ffmpeg内部使用的格式,速度会比上第一步慢不少,但是应该也是可以接受的。当然在码率比较高的情况下也会非常缓慢(在Pentium4时代的机器上看1080p的高清视频很卡)。

“过程3”是需要对每一帧进行处理,那么这步是可高度并行化的应该可以放到GPU进行。

“过程4”一定是最慢的一个环节:H.264需要将图像分割成很多个宏块, 然后利用视频帧图像的帧内和帧间的相关性, 采用帧内预测或帧间预测的编码模式, 对各个宏块进行压缩。然后形成帧,组成为码流。整个过程复杂,但宏块儿的处理是可以高度并行化的操作,应该可以放到GPU进行。

“过程5”和“过程1”类似。

所以如果想用GPU加速以上的过程,那么把“过程4”和“过程2”的密集计算从CPU上转到GPU上,应该是可能的发力点。

如果要设计这个系统,软件自底层到上层有几点需要考虑:

  1. 如果显卡可以指定,应该是Nvidia。在Linux下有完善的开发运行环境,且同时支持CUDA和OpenCL;
  2. 如果选定Nvidia显卡,那么根据前文的分析,使用CUDA是更好的GPU计算架构。并且应该使用最新的CUDA 4.0版本,因为在多GPU上能更方便的开发,并且GPU直接访问内存方面也做出了改进(CUDA 4.0的新特性详细见这里)。
  3. 在决定了以上基础设施后,为了提高单机的处理能力程序应该用何种架构来编写?单进程多线程还是多进程单线程?

关键在于在程序里如何更好的调用CUDA:

  1. 单进程多线程方式
    • 每个线程进行一个视频的转换,每个线程在其线程内部直接使用CUDA;
    • 有单独的CUDA线程,其他线程当需要时通知此线程进行运算;
  2. 多进程单线程
    • 每个进程进行一个视频的转换,在其进程内部各自独立的使用CUDA;
    • 有单独的GPU进程,其他进程当需要进行GPU运算的时IPC通知此进程进行;

在我看来,2-1的方式是最简单直接的,可以直接基于ffmpeg来实现,只需单把可并行化的部分从CPU移到GPU。但是CUDA 4.0是否支持这样做?这样做效率是否最高?

硬件配置上也有以下的问题:

  1. 是否需要在一个Server上配置多块儿GPU?虽说CUDA 4.0已经声称对此有很好的支持,但是其是否能利用好?另外受限于硬件瓶颈的一些限制(CPU计算能力、内存速度、总线速度),配置几块儿GPU比较合适?
  2. 如果使用ffmpeg,那么在一台拥有16核的服务器上,理论可以同时启动16个ffmpeg进程(单线程运行)。加入GPU运算后单个视频处理速度的提高是一定的,但是否还有这么大的并行能力?以及单位时间段内的处理能力是否提升?
  3. 加入GPU后硬件成本的增加是否值得?与单独使用CPU的相比单位成本是否更低?选用哪款Nvidia显卡的性价比最高?
  4. 如何看GPU的load average和top?

最后这件事情最难的一点在于:需要对CUDA、ffmpeg、H.264、硬件都有相当深入的了解才能做好这样的一个系统

]]>
https://www.qingran.net/2011/07/%e4%bd%bf%e7%94%a8gpu%e5%8a%a0%e9%80%9fh-264%e7%bc%96%e7%a0%81%e5%88%86%e6%9e%90/feed/ 2 1215
CUDA和OpenCL https://www.qingran.net/2011/07/cuda%e5%92%8copencl/ https://www.qingran.net/2011/07/cuda%e5%92%8copencl/#comments Wed, 13 Jul 2011 20:25:11 +0000 https://www.qingran.net/?p=1213 接前文“GPGPU”。

虽然我们可以使用已有的图形API来调用GPU,但是通过前文的分析,这个过程冗长且复杂。严重违反了程序员的优雅、和lazy原则。需要去学习图形学的一些知识,了解texture、shader等图形学专用概念,而且需要学习CGSL或者HLSL等shader着色语言。而且还要熟悉OpenGL和DirectX等图形学API,这一箩筐的知识没有一个一年半载是搞不定的。而且这样的方式不符合正常程序的编写习惯,所以难以优化。

最为3D程序员着想的Nvidia终于在07年搞出 CUDA ,这个架构的编程基于C 语言来进行,程序员只需要熟习CUDA的内存布局、线程层级,就能完成 CUDA 程序的开发,彻底跟那一箩筐图形学知识脱了干系,这个世界清静了。。。

CUDA 的推出是革命性的,而且OpenCL和M$的DirectX Computer GPGPU API 都基本上是采用了 CUDA 的架构和编程模型,可以说熟习 CUDA是OpenCL 的快速入门之道(Apple你肿了么?最新的mac为啥都用A卡了?)。CUDA的架构图(取自这里):

自下往上CUDA架构由四部分组成:

  1. 显卡内部的GPU的并行计算引擎;
  2. OS内核态的硬件支持,包括初始化,配置等;
  3. 用户级的驱动程序,为开发者提供的设备级的API接口;
  4. PTX指令集架构(ISA)的并行计算内核和功能.

对于开发者来说,CUDA提供了以下内容:

  • Libraries:高层次的为CUDA专门优化的BLAS, FFT等公用函数;
  • C Runtime:CUDA C语言运行库提供了支持在GPU上执行标准C语言语法喝函数,并允许其他高级语言如Fortran,Java和Python的调用;
  • Tools:NVIDIA C Compiler (nvcc),  CUDA Debugger (cudagdb),  CUDA Visual Profiler (cudaprof)

 

CUDA对OpenCL和其他编程语言的支持

由上图可知,Nvidia的OpenCL是基于CUDA Driver构建起来的,如果我们使用OpenCL那么就根据其规范编写类C语言的OpenCL内核,CUDA的Driver会接受这些计算请求并翻译给GPU运行当使用的设备级的编程接口。MS在Nvidia上的Direct Computer也是基于此,如果使用DirectX,那么需要用HLSL.编写DirectX的computer shaders,然后调CUDA Driver.

同时CUDA C Runtime的存在使我们方便的使用其他高级语言进行CUDA程序的编写,我目前常用Python就有PyCUDA的包装。

下面的内容都以直接使用CUDA的标准kernels并调用CUDA Driver API进行,这也是最直接的方法。

 

 

运算方式
CUDA支持大量的线程级并行(Thread Level Parallel),因为在GPU硬件中动态地创建、调度和执行这些线程是非常轻量的(而在CPU中,这些操作都是重量级的)。CUDA编程模型可以看作是将GPU做为协处理器的系统,CPU来控制程序整体的逻辑和调度,GPU来运行一些能够被高度线程化的数据并行部分。

CUDA程序包括串行计算部分和并行计算部分,并行计算部分称为Kernels,内核是一个可以在GPU执行的并行代码段。理想情况下,运行于CPU上的串行代码的只是清理上个内核函数,并启动下一个内核函数。

CUDA Kernels只对ANSI C进行了很小的扩展,以实现线程按照两个层次进行组织、共享存储器和栅栏同步。这些关键特性使得CUDA拥有了两个层次的并行:线程级并行实现的细粒度数据并行,和任务级并行实现的粗粒度并行。关于CUDA的线程模型需要单独拉出来说了(我看了半天文档确实没看明白,线程模型可能是CUDA最关键的一个部分,需要买块儿Geforce GTX 5xx的显卡做一个实际实验环境啊~)

 

内存操作

在 CUDA 中,GPU 不能直接存取主内存,只能存取显卡上的显存。因此,需要将数据从主内存先复制到显卡内存中,进行运算后,再将结果从显存中复制到主内存中。这些 复制的动作会受限于 PCI Express 的速度。使用 PCI Express x16 时,PCI Express 1.0 可以提供双向各 4GB/s 的带宽,而 PCI Express 2.0 则可提供 8GB/s 的带宽。当然这都是理论值。

但刚刚发布的CUDA 4.0对内存地址映射有了更好的支持:任意在CPU的malloc/new的内存,都可以通过调用cudaHostRegister注册给GPU,同样也有cudaHostUnregister来取消这个注册,而不需要cudaMemcpy。PCI-E本身就支持把一个host地址映射到device端,且DirectX和OpenGL均用这种方式来处理texture大数据。另外这个特性更方便我们编写代码:可以把一个大的CPU程序一点一点地改成GPU程序,并一步一步对比验证结果。以前这件事情需要前后都插入不少cudaMalloc和cudaMemcpy等代码,繁琐而且容易出错。

基于CUDA的复杂线程模型,内存管理的细节应该也是相当复杂,以后专文说吧。

 

执行方式

线程模型和内存管理没整懂,runtime时怎么做的就更不明白了,专文说把。

 

]]>
https://www.qingran.net/2011/07/cuda%e5%92%8copencl/feed/ 4 1213
GPGPU简介 https://www.qingran.net/2011/07/gpgpu%e7%ae%80%e4%bb%8b/ Wed, 13 Jul 2011 05:09:23 +0000 https://www.qingran.net/?p=1209 过去的一周时间研究了一下GPU做通用计算以及CUDA和OpenCL,下面会分几篇文章总结最近的成果。

图形处理单元( GPU)简称显卡是现在计算机中除CPU体系之外最复杂的一个系统。近几年来随着游戏工业的大规模发展,GPU的运算性能的增长大大超过了摩尔定律。不仅仅提高了计算机图形处理的速度和质量而且给我们提供了nb的计算平台。


GPU有两个显著的特点:

1,运算单元极多带来大并行处理能力,GPU的运算单元数量远多于CPU。例如现在民用的中端显卡Geforce GTX 570有480个CUDA cores,拥有1405 GigaFLOPS单精度浮点数运算能力。

如上图所示,CPU的大量的晶体管被cache和控制电路占用(控制指令和分支预测等操作),而ALU占用的只是一小部分。与之相反的是GPU做为专用运算器其控制电路极其简单,而且对Cache需求较小,所以大部分的晶体管用于组成各类专用运算单元和长流水线。

2,GPU拥有更快速的显存、大的显存位宽和大的显存带宽,Geforce GTX 570一般拥有1GB以上GDDR5的显存,位宽为320bit,显存频率为950MHz,且拥有152GB/s 的显存带宽。

GPU和CPU的带宽对比:

基于以上的两个特点,GPU计算优势有:

  1. 并行性。源自图形处理需要对多条绘制流水线的支持,所以GPU拥有了非常大的并行处理能力;
  2. 高密集计算。高频率、大位宽的显存 + 高速PCIe总线;
  3. 长流水线。一般来说目前显卡的流水线都有数百个指令阶段(而CPU一般只有几十个),所以GPU做为流式数据并行处理机有明显的优势。

总结一句:GPU时针对向量计算优化的并行数据处理机。

GPU编程上也有一些特殊的地方,从原理上说我们不借助CUDA或者OpenCL就能直接使用DirectX或者OpenGL直接进行GPU运算,我们可以从一个图形开发者的角度去思考如何来做。

1,纹理 == 数组

一维数组是CPU最基本的数据表达形式,同时基于此进行的偏移量计算构成了CPU编程的数据表达形式。

而对于GPU,最基本的数据排列方式是二维数组,在图形开发中,数组被做做为纹理(texture)送入GPU后进行处理。在CPU中的数组索引在GPU中改为了纹理坐标,有了纹理坐标就可以访问纹理中的每个数据,同时还必须确定坐标原点的位置。

GPU内部的额运算均是浮点数为运算,同时GPU是以一个四元组为单位进行计算的,这个四元组包括RGB三原色 + Alpha通道。

 

2,shader == kernels

传统CPU指令是以顺序、循环执行为主,例如计算1M个成员的数组的平方的结果:

for (int i=0;  i<1000000; i++)
output[i] = input[i] * input[i]

这个运算有一个非常重要的特点:那就是输入和输出的每个数组元数,它们之间是相互独立的。不管是输入的数组,还是输出结果的数组,对于同一个数组内的其他各个元素是相互独立的,我们可以不按顺序从最后一个算到第一个,或在中间任意位置选一个先算,它得到的最终结果是不变的。如果我们有一个数组运算器,或者我们有1M个CPU的话,我们便可以同一时间把整个数组一次给算出来,这样就根本不需要一个外部的循环。这就是SIMD(single instruction multiple data)。

同样的计算在OpenCL里是这样编写kernels:

const char *KernelSource = "\n" \
"__kernel void square( \n" \
" __global float* input, \n" \
" __global float* output, \n" \
" const unsigned int count) \n" \
"{ \n" \
" int i = get_global_id(0); \n" \
" output[i] = input[i] * input[i]; \n" \
"} \n" \
"\n";

可以看到,在GPU里,两个数组的相乘如此简单的一句话就搞定所有。在这里运算的GPU可编程模块,叫做片段管线(fragment pipeline),它是由多个并行处理单元组成的。在硬件和驱动逻辑中,每个数据项会被自动分配到不同的渲染线管线中去处理,到底是如何分配,则是没法编程控制的。从概念观点上看,所有对每个数据顶的运算工作都是相互独立的,也就是说不同片段在通过管线被处理的过程中,是不相互影响的。片段管线就像是一个数组处理器,它有能力一次处理一张纹理大小的数据。虽然在内部运算过程中,数据会被分割开来然后分配到不同的片段处理器中去,但是我们没办法控制片段被处理的先后顺序,我们所能知道的就是“地址”,也就是保存运算最终结果的那张纹理的纹理坐标。我们可能想像为所有工作都是并行的,没有任何的数据相互依赖性。

3,渲染 == 运算
我们准备好了纹理,写好了着色器去处理纹理,接下来我们所要做的最后一件事是告诉GPU让起来使用shader对纹理进行渲染。也就是说通过渲染一个带有纹理的四边形,我们便可以触发着色器进行运算。最后把结果存入目标纹理中。

所以整个的过程如下:

  1. 把数据通过CPU组织绘制到纹理上(CPU运算)
  2. 使用shaders处理纹理中的数据(GPU运算)
  3. 进行渲染,结果绘制到目标纹理(GPU运算)
  4. 获得目标纹理数据,CPU处理得到结果(CPU运算)

BTW,前一段时间同事老李做的骨骼动画的VTF优化(Vertex Texture Fetch)就是采用此思路。

有了上面的这些准备后,再看CUDA和OpenCL就会容易理解很多。接下来说说这些

]]>
1209
如何写一个为SSD优化的数据库? https://www.qingran.net/2011/07/%e5%a6%82%e4%bd%95%e5%86%99%e4%b8%80%e4%b8%aa%e4%b8%bassd%e4%bc%98%e5%8c%96%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%ef%bc%9f/ https://www.qingran.net/2011/07/%e5%a6%82%e4%bd%95%e5%86%99%e4%b8%80%e4%b8%aa%e4%b8%bassd%e4%bc%98%e5%8c%96%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%ef%bc%9f/#respond Mon, 04 Jul 2011 18:53:31 +0000 https://www.qingran.net/?p=1145 SSD应该是近几年来硬件技术最nb的革命,困扰计算机性能的最短木板--磁盘IO终于有了巨大的突破。而且SSD在未来的几年中会快速普及(我还琢磨着给我笔记本换SSD)。

前一段cm同学也想做一个MVCC支持的k-v数据库 ,现有的数据库都是根据几年前的硬件水平(小内存、无NUMA、机械磁盘)进行的设计的,不可能针对SSD专门优化,SSD上的MySQL性能提升应该是只用了SSD IOPS超高这一个特性。在SSD未来几年应该能广泛普及的前提下,针对SSD的数据库优化是必须的。集中查了查资料,聊聊想法,有不对的地方欢迎各位补充。

先简要的介绍一下SSD的特点。SSD没有传统机械硬盘的机械寻道时间而带来的延迟,所以IOPS性能可以达到10, 000甚至是100, 000(而15K的SAS一般在100左右),所以能提供相对于机械硬盘100+倍的的小文件读取性能。而且在连续读取方面也能带来3倍左右的性能提升。

SSD最小的写入单元是4KB的一个page,写入空白位置时是按照4KB的单位写入。但是“改写”操作是需要进行一个额外的“擦除”操作,擦除则是按照block进行(一般来说一个block是128个pages即512KB)。也就是说向一个空白区域,那么直接按照4KB对齐写入;但是如果是向已经有数据的一个区域写入新数据,那么操作过程是:整个block读入缓存 -> 修改数据 -> 擦除原有block -> 写入整个block。这个过程常称作erase-before-write,显然SSD重写已有数据区域的代价非常高。

因为SSD的erase-before-write,所以对一个区域不停的“改写”操作不仅仅带来巨大的写入延迟,也会大大减少flash的寿命。所以设计了一套均衡算法来保证其内部的每个区域都被均衡使用,简称wear leveling。wear leveling是通过SSD内部的FTL实现(Flash Translation Layer,相当于磁盘控制器,主要功能是把flash的物理地址转换为OS需要的LBA地址)。具体的方式是:首先在SSD内部分为两个block pool,一个是free block pool,一个是data block pool。顾名思义一个是尚未使用的block集合和一个已经使用的block集合。由此很容易想到的一个优化策略是当要改写一定数据时,将数据合并为block,然后直接从free block pool里取出一个无数据的区域直接写入,原有的data block pool标记为 “可擦除”,同时新使用的block进入data block pool。“可擦除”的block定期执行擦除并放入free block pool。这其实就是最常用的deferred garbage collection策略,这样做的好处是:0,写入速度较快延迟小,延迟回收而非即时擦除;1,不会反复写入同一个flash物理区域,减少物理磨损。

新的SSD TRIM技术采用了另外的一种回收策略。OS直接告诉SSD控制器:一个block的数据可以立即delete。此时SSD做的操作是把整个block读入缓存,并重置所有数据,最后回写。同时把这个块儿加入free block pool中。这样做的好处首先是把数据的控制权从OS交给了SSD FTL,FTL可以做出若干优化策略执行此事;提前把将来要进行的GC操作提前完成,避免因为没有free block pool时临时执行GC带来的延时;同时由于这些block的数据迟早要擦除,所以对SSD的寿命无影响。

同时erase-before-write还带来了一个写入放大效应,最差的情况可能是只需要改1个page以内的数据,但是却需要对1整个block进行重写。虽说上面提到的wear leveling方法会减少写入放大发生的概率,但是一但发生free block pool耗尽,需要去即时擦除data block pool的数据时,那么wear leveling就会失效,基于此SSD盘在使用重保持一个相对大的空闲空间会使其性能变化相对较小。同时随机的小文件写入的性能在某种情况下会比连续大文件写入性能下降很多,因为随机的写带来随机的擦除,从而加大写放大效应发生的概率。

同时不要忘记SSD一般会有一个64MB甚至是128MB的memory cache的存在,所以在write-back使用条件下,猜测SSD自身应该有能力去合并多次小文件写入并入一个或几个block内,并结合wear leveling做出更优化的操作。

总结一下SSD的特点:

  1. SSD有写入磨损问题,寿命有一定的影响;
  2. 最小写入单位为4KB的page,擦除的时按block进行(通常为128pages);
  3. 重写数据时由于写放大效应的存在随机写入可能会比顺序写入带来的损耗更大;
  4. 带TRIM的wear leveling理论上能大大减少随机写入的写放大效应发生的概率;
  5. 使用上尽量保持一个相对大的空闲空间;
  6. 随机小文件读取性能强大,能达到1w甚至5w IOPS,基本是现在机械硬盘的100倍+;
  7. 连续读取性能是机械硬盘的3倍左右,能达到400MB/s的吞吐能力;
  8. 读性能的延迟远低于写(传统机械硬盘读写延迟差别不大);
  9. 在空白区域的随机写和顺序写性能可能差别不大。

下面来聊聊数据库的IO特点。数据库主要分成三大块儿:最终数据文件、索引、日志。最终数据文件的读取和写入在多数场景下是大量的随机读写;索引的建立、更新和读取是随机读写;日志文件是连续读写。

先说日志文件,为了迎合传统物理硬盘连续读写性能相对优秀的特性,日志文件是采用了顺序日志记录的方式,因为需要在事务提交的时候快速响应,顺序读写减少了磁盘重新寻道的时间。只需要在日志提交时把log buffer中的数据依次写入磁盘,所以传统的数据库日志最精确的描述应该是:在连续扇区的多次小文件写入。同时索引和数据文件的update操作的随机性导致了随机写入情况的发生概率很高。全表扫描和索引文件的创建毫无疑问是一个连续大文件读写的过程。

目前想到的针对SSD特点进行优化的数据库应该有以下几点:

  1. 修改日志的顺序写入方式,因为固定目录顺序日志文件的反复写入带来很大的SSD磨损,稳定是第一;
  2. 是否考虑根据SSD的特点采用新的日志方式(我还没想好)?
  3. SSD随机读性能卓越,可以在代码层不考虑cache,直接读取源数据文件,减少同步cache的开销;
  4. 以往数据库为了尽量减少小文件的随机读而采用的一些优化方式是否可以取消?
  5. 4KB page的对齐原则;
  6. 写入数据时尽可能按照一个block的大小(512KB)去组织数据;
  7. 索引和数据文件的update操作是否可以考虑在程序内部按照block进行重组织,改多次小文件写入为一个或几个block的连续写入;

上面的第7条可能是一个过渡设计。另一个杯具是以上这些都是根据文档的纸上谈兵,到现在我还没用过SSD 🙁 ,希望以后有机会也搞一个6w的FusionIO PCIE SSD玩玩。

最后感谢万能的wikipedia,没有它的帮助不可能这么快完成这些资料的查找,主要参考以下文章:

http://en.wikipedia.org/wiki/SSD

http://en.wikipedia.org/wiki/Wear_leveling

http://en.wikipedia.org/wiki/TRIM

]]>
https://www.qingran.net/2011/07/%e5%a6%82%e4%bd%95%e5%86%99%e4%b8%80%e4%b8%aa%e4%b8%bassd%e4%bc%98%e5%8c%96%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%ef%bc%9f/feed/ 0 1145
iphone升级iOS 1604错误解决 https://www.qingran.net/2011/03/iphone%e5%8d%87%e7%ba%a7ios-1604%e9%94%99%e8%af%af%e8%a7%a3%e5%86%b3/ https://www.qingran.net/2011/03/iphone%e5%8d%87%e7%ba%a7ios-1604%e9%94%99%e8%af%af%e8%a7%a3%e5%86%b3/#comments Fri, 11 Mar 2011 16:10:30 +0000 https://www.qingran.net/?p=1066 今天在公司给我iphone4升级到最新的iOS 4.3,尝试n多次一直是1604的报错。

关掉了卡巴斯基杀毒,换了台机器,换了数据线,居然还是报这个错。

神奇了难道让我手机变板砖?!

仔细Google了一番,原来在于windows XP下3个服务要打开,分别是:

  • Messenger
  • Terminal Services
  • Telnet

去控制面板 -> 管理工具 -> 服务 里手动开启这三个服务即可。

没有深究为啥iOS升级需要这三个windows服务。而且报错如此不明,apple官方帮助页也没有提示。

 

]]>
https://www.qingran.net/2011/03/iphone%e5%8d%87%e7%ba%a7ios-1604%e9%94%99%e8%af%af%e8%a7%a3%e5%86%b3/feed/ 1 1066
ipad2预测 https://www.qingran.net/2011/03/ipad2%e9%a2%84%e6%b5%8b/ https://www.qingran.net/2011/03/ipad2%e9%a2%84%e6%b5%8b/#respond Wed, 02 Mar 2011 10:28:38 +0000 https://www.qingran.net/?p=1054 在前一段预测了iphone5的改进,赶在ipad2发布前几个小时,也预测一下:

改变:

  • CPU升级到A4 1.5GHz,单核
  • GPU升级到PowerVR 545
  • 加入摄像头,很有可能是前置
  • 内存升级到512MB
  • 重量会减轻
  • 会有支持CDMA2000的3G版

不变:

  • 屏幕尺寸和分辨率
  • 基本外形

 

几个小时后见分晓!

]]>
https://www.qingran.net/2011/03/ipad2%e9%a2%84%e6%b5%8b/feed/ 0 1054
[转]热门3D游戏视觉效果名词简介 https://www.qingran.net/2011/02/%e8%bd%ac%e7%83%ad%e9%97%a83d%e6%b8%b8%e6%88%8f%e8%a7%86%e8%a7%89%e6%95%88%e6%9e%9c%e5%90%8d%e8%af%8d%e7%ae%80%e4%bb%8b/ https://www.qingran.net/2011/02/%e8%bd%ac%e7%83%ad%e9%97%a83d%e6%b8%b8%e6%88%8f%e8%a7%86%e8%a7%89%e6%95%88%e6%9e%9c%e5%90%8d%e8%af%8d%e7%ae%80%e4%bb%8b/#respond Fri, 18 Feb 2011 18:25:18 +0000 https://www.qingran.net/?p=920 一部又一部的游戏大作降临,每个游戏都声称要给玩家“真实”的体验。当然既然叫做游戏就不可能是真实的,但游戏制作商们都在不断想办法使游戏更加接近现实,使用各种3D效果去模拟现实中的种种现象。可能还有不少玩家朋友对这些视觉效果名词还不大了解,于是有了本文。本文就是用简单的语言,简要地介绍目前应用在游戏中的一些比较热门的视觉效果。

主要名词:
#1 –
动态模糊(Motion Blur
#2 –
景深(Depth Of Field
#3 –
软阴影(Soft Shadow
#4 –
高动态光照(High Dynamic Range
#5 – 凹凸
贴图技术
#6 – 法线贴图
#7 – 视差贴图

#8 –
次表面散射(SubSurface Scattering
#9 –
体积云/雾(Volumetric Clouds/Fog
#10 –
体积光(Volumetric Light
#11 – SpeedTree
#12 –
延迟渲染(Deferred Rendering

一、动态模糊(Motion Blur

3D游戏玩家会问这么个问题:为什么每秒24帧的速度对于电影来说已经足以获得很流畅的视觉效果,而对于电脑游戏来说却非常不流畅?原因很简单,摄像机在工作的时候并非一帧一帧绝对静止地拍摄,它所摄下的每一帧图像已经包含了1/24秒以内的所有视觉信息,包括物体在这1/24秒内的位移。如果在看电影的时候按下暂停键,我们得所到的并不是一幅清晰的静止画面,而是一张模糊的图像。


传统的电脑3D图像做不到这一点,游戏里的每一帧就是一幅静止画面,如果你在运动的过程中抓一张图片下来,得到的肯定是一幅清晰的静态图。所以,动态模糊技术的目的就在于增强快速移动场景的真实感,这一技术并不是在两帧之间插入更多的位移信息,而是将当前帧同前一帧混合在一起所获得的一种效果。

《极品飞车:卡本峡谷》采用的动态模糊,但效果不好,表现太夸张,时间长很容易让人感到不适:


《孤岛危机》的动态模糊改善了很多,表现效果也好了很多,据称是得益于DX10引入了几何渲染器:


二、景深(Depth Of Field

有摄影基础的朋友一定都熟悉“景深”这个词。如果非要解释这个词的话就是“在摄影机镜头或其他成像器前,沿着能够取得清晰图像的成像器轴线所测定的物体距离范围”。说得再简单一些,就是距离不同的景物,呈现出有些地方清楚有些地方模糊的效果。这种效果能够更加突出需要反应的焦点,让画面的主题更加鲜明。

我们观察下面的两张图片,就能非常明显的看出景深的效果。在第一张图片中,手持长棍的忍者是清楚的,后面的景物时模糊的。而在第二张图片中,焦点移到了后面的景物上,前景的忍者反而变成了模糊的效果了。这样的效果更符合人肉眼对自然环境观察的结果,也就因此令玩家的感受更真实:


《使命召唤4》使用的景深效果:


FPS游戏中景深效果往往用在枪械的瞄具上。在游戏中使用机械瞄具的时候,人的注意力必然高度集中,准心以外的区域都模糊。

《孤岛危机》中景深效果大放异彩:


三、软阴影(Soft Shadow

从字面上直译过来就是“软阴影”,不过叫“柔和阴影”似乎更合适。我们知道生活中很多阴影的过渡都是有渐变,而软阴影的作用就是要模拟这种效果,在阴影周边制造虚化的效果。软阴影本身并不是指一种技术,而是指通过采用某种技术达到的效果。

在说软阴影前先说说阴影的生成方法。一般在游戏中采用的阴影生成方法有两种:Shadow Mapping(阴影映射)和Shadow Volumes(体积阴影)。

Shadow Mapping(阴影映射)是一种图像空间的技术,它是在以光源位置作为视点的情况下渲染整个场景的深度信息,然后再使用这些深度信息去决定场景的哪一部分是处于阴影之中。它有锯齿并且依赖z-缓冲技术。由于可以在不减少帧率的情况下达到真实感光照和阴影效果,编辑器允许在场景中放置任意数目的静态光源,它会为每个面预计算光流量(light flow)和静态阴影,因此现代商业3D游戏中多数都会使用到阴影映射。阴影映射效果的一个影响因素是Shadow Map Size,如果size(尺寸)小,会导致阴影边缘模糊不清、闪烁、出现大型锯齿。增大size能提高阴影质量,但帧速会受到影响。

Shadow Map Size太小(上图),增大Size之后(下图)


对于在阴影映射下实现软阴影,通常是在阴影边界进行高精度超级采样的方法,如虚幻3引擎就是进行16X的超级采样,这就是软阴影消耗系统资源大的原因。


《生化冲击》使用阴影映射,表现出色:



《西部狂野》的Shadow Map Size高达2048*2048,生成的阴影效果非常好,当然对硬件要求也高:



《尘埃》的Shadow Map Size更是前所未有地达到了4096*4096,阴影柔化效果也很到位,它的硬件要求大家也是清楚的:



《孤岛危机》的阴影效果当然是顶级的了,除了使用阴影映射,还使用了大量高级技术(如高精度采样、屏幕空间环境光遮蔽等):


Shadow Volumes(体积阴影)是一种基于几何形体的技术,它需要几何体在一定方向的灯光下的轮廓去产生一个封闭的容积,然后通过光线的投射就可以决定场景的阴影部分(常常使用模板缓冲去模拟光线的投射)。这项技术是像素精确的,不会产生任何的锯齿现象,但是与其他的技术一样,它也有缺点。最主要的两个问题一是极度依赖几何形体,二是需要非常高的填充率。同时,体积阴影也相当依赖CPU,视觉效果方面是产生的阴影比较“硬”。
目前使用体积阴影的游戏不多,《DOOM3》和《F.E.A.R.》就是典型,在游戏中仔细观察你会发现它们的阴影和其他游戏的明显不同:



F.E.A.R.》是第一个采用了软阴影的游戏,它的软阴影实现方法是在光源在自身附近进行自我复制,产生多个不同亮度的阴影再混合起来,这种软阴影效果似乎不怎么理想,边缘看起来有层状感,系统资源开销也大:


四、高动态光照(High Dynamic Range

很多人对HDR的第一感觉就是“太亮了、好刺眼、受不了”。其实HDR并不是像许多玩家理解的那样就是简单的“高亮”,不是让画面有更大的亮度或是对比度。大家都知道,当人从黑暗的地方走到阳光下时,我们的眼睛会不由自主的眯起来,那是因为在黑暗的地方,人为了更好的分辨物体,瞳孔张开很大,以便吸收光线;而突然到了光亮处瞳孔来不及收缩,视网膜上的视神经无法承受如此多的光线,人自然会眯上眼睛阻止大量光线冲击视神经。

我们的眼睛非常敏感,而电脑就不具备这种功能,因此就通过HDR技术在一瞬间将光线渲染得非常亮,然后亮度逐渐降低。所以,HDR的最终效果应该是亮处的效果是鲜亮的,而黑暗处你也可以清晰的分辨物体的轮廓,位置和深度,而不是以前的一团黑。动态、趋近真实的物理环境是HDR的特效表现原则:

高亮的部分仍保持了相当丰富的细节


HDR
并不仅仅是反射的光强度要高。在游戏中,如果你盯着一个面向阳光直射的物体,物体表面会出现丰富的光反射;如果盯着不放,物体表面的泛光会渐渐淡出,还原出更多的细节。HDR特效是变化的,因此称做高动态光照。

HDR是分种类的,一般按可精度分为:Int16(整数)、FP16(浮点)、FP32等等,数字越大精度越高,运算量当然也越大。其中Int格式的HDRSM2.0下即可实现(如半条命2:失落的海岸线、第一章、第二章),FP格式要SM3.0或以上才能实现(目前有HDR的游戏基本都是FP格式),在DX10HDR的精度已经提升到FP128

说到HDR不得不提另外一个特效:BLOOMBLOOM也能实现和HDR类似的效果,但BLOOM的是静态的,HDR是动态渐变的,BLOOM在细节表现、明暗对比不如HDR,这是BLOOMHDR的重要区别。实现HDR效果的系统资源开销也比BLOOM大。

3Dmark06中绚丽的HDR效果:


《无限试驾》的HDR效果我是比较认同的:



《彩虹6号:维加斯》、《生化冲击》的都不错:



《孤岛危机》的HDR使用已经非常成熟:



游戏中贴图是2D的,如果在游戏中换个角度看的话,很容易就会发现墙面没有任何立体感,砖纹看上去非常假!为了让2D贴图看上去也有3D立体效果,就诞生了多种贴图技术,比如凹凸贴图、法线贴图、位移贴图、视察映射贴图等。

五、凹凸贴图(Bump Mapping

凹凸贴图技术简单说起来是一种在3D场景中模拟粗糙表面的技术,将带有深度变化的凹凸材质贴图赋予3D物体,经过光线渲染处理后,这个物体的表面就会呈现出凹凸不平的感觉,而无需改变物体的几何结构或增加额外的点面。例如,把一张碎石的贴图赋予一个平面,经过处理后这个平面就会变成一片铺满碎石、高低不平的荒原。当然,使用凹凸贴图产生的凹凸效果其光影的方向角度是不会改变的,而且不可能产生物理上的起伏效果。

凹凸贴图在今天看来已经是老的不能再老的一种技术了,虽然能够获得凹凸的效果,但是凹凸的程度非常受限制,基本上只能做出一些简单的浮雕效果来。这种技术通常用在一些观察视角变化很小的情况上,例如地面,墙壁,远处的一些模型等等,如果角度稍微一大,你就会发现那些凹坑其实是根本不存在的:


六、法线贴图(Normal Mapping

法线贴图技术通过计算高细节度模型的法线信息并将其保存在一张高压缩比(3DC/DC5)的法线贴图之中,然后将这张法线贴图贴用于低细节模型上代替原型的多边形曲面的光照计算,从而等到一个低多边形、高细节的3D模型。这样做就能在保证模型细节的情况下,大幅度降低场景的多边形数目。法线贴图目前已经广泛应用于3D游戏中。

视觉效果达到1亿多边形的场景,通过线框显示发现只用了50万多边形。(虚幻3引擎场景)


法线贴图在《孤岛危机》里的应用,立体感表现得非常好:


七、视差贴图(Parallax Mapping

视差贴图技术我们其实应该称之为视差遮蔽贴图技术,因为在这一技术中,会对纹理的坐标做变换,一些凸出的纹理会遮蔽到其他的纹理,这样就会看起来具备更好的凹凸的感觉了。视差贴图技术的实现原理,其实和法线贴图是一样的,都是根据法线贴图进行的处理。视差贴图比法线贴图提供更好的视觉效果,而且跟法线贴图有同一个目的:在保证模型细节的情况下,大幅度降低场景的多边形数目。

S.T.A.L.K.E.R.》中的视差贴图效果,砖块和石板上的凹痕表现十分生动:


《孤岛危机》中使用的视差消隐贴图,堪称目前Bump mapping技术的极致!逼真的鹅卵石让人留下深刻的印象!:


八、次表面散射(SubSurface Scattering,简称3S

目前使用次表面散射效果的游戏极少,似乎就只有《孤岛危机》。它主要用于模拟不完全透明材质内部表现出的一种真实光影特效。当灯光照射到玻璃或清澈的液体表面时,灯光会穿透这些介质,3S效果可用来模拟灯光进入介质内部后发生的散射。

《孤岛危机》中树叶的透光性:


3S的另一个重要用处在于表现光源照射下的人物皮肤,换句话说,要想表现真实的皮肤材质,3S效果必不可少。目前的许多游戏在人物皮肤的渲染上就因为缺乏3S效果而显得塑料化、橡胶化。

F.E.A.R.》人物缺乏3S效果,塑胶感较大:



CryEngine 2
使用3S效果生成的人物脸部:


《孤岛危机》的人物脸部效果非常出色:



照片级的CG图,同样采用了3S,效果惊人!:


九、体积云/体积雾(Volumetric Clouds/Fog

简单地说,在游戏中的体积云就是使用图像引擎来模拟真实云雾半透明、无规则的表现效果。

在早期游戏中,实现云雾烟火效果的方式常常使用贴图的方法。CS中可以很清楚的看到这一点。将烟雾品质改为“低”时,CS中烟雾的表现如同灰白色的墙壁一般。采用云雾烟火贴图的游戏经常会降低透过云雾贴图之后远景效果,甚至替换远景贴图,仔细观察就会发现,而体积云则不会。

CS的烟雾弹效果,可以看到层状的材质:


《使命召唤4》在关闭烟雾柔化后,也表现出同样效果:


事实上,体积云本身的定义就比较模糊,欧美业界的观点是:通过3D引擎实时生成的、能够随时间流逝而自动改变的、能够和物力引擎互动产生变化的(比如飞机飞过云雾散开),才能称为体积云/体积雾。

《孤岛危机》中采用的就是体积云效果:


《冲突世界》也大量使用了体积云:


《生化冲击》在DX10才能开启体积云效果:


十、体积光(Volumetric Light
先来看下面一个现实世界的光线图,在3D图形中要实现这种效果就是体积光(Volumetric Light)。目前的游戏都是在DX10下才有体积光效果,看来是得益于DX10的渲染架构的改进,使体积光这种高级特效得以更容易地在游戏中实现。


《冲突世界》的招牌DX10效果-体积光:



《孤岛危机》作为DX10的招牌游戏当然少不了体积光效果:


CryEngine 2演示视频,可以注意到,当主角经过时,枪支会被透射的光线照耀到:


《孤岛惊魂》《半条命2:失落的海岸线》的光束效果似乎比较生硬、呆板,光照强度一成不变,也不会留下恰当的阴影,显然是预先安排好的,并非真正的体积光效果:


十一、SpeedTree

SpeedTree是一个专门的植被引擎。其技术最大的特征就是可以在使用极少多边形的情况下创造出高度逼真的树木和植物,并且可以调整风速效果,使得这些植物随着风的吹动而真实地摇动。游戏开发者就可以直接在特定地形上生成整个森林,无需将树一棵一棵地设置在相应地点上,大大提高了工作效率。并且通过SpeedTree的代码优化技术,画面上数量繁多的枝叶不会对画面帧数造成太大影响。

虚幻3引擎整合了SpeedTree技术,虚幻3引擎制作的游戏都可以用SpeedTree技术快速生成大量高品质的植被:


《上古卷轴4》用SpeedTree创造了一个神奇的世界:


《冲突世界》也使用了SpeedTree技术:


十二、延迟渲染(Deferred Rendering

延迟渲染技术可以说是未来游戏的发展趋势,其原理是先把全景多边形物体的信息比如位置、法线面、各种贴图渲染到G-Buffer(缓冲区)内,延迟打光步骤。

延迟渲染可以避免在渲染过程中出现无效渲染(渲染器在运算过程中做了某些无用功)的现象和提高出现大量复杂、耗时的像素渲染时的工作效率。

延迟渲染可以创建大量的点光源以及产生真实的光照结果,提高画面的真实度;也可以避免对不可见的点进行光照,节省了资源。不过,延迟渲染并不是很适合DX9,在目前的硬件上必须以牺牲MSAA(多重取样抗锯齿)为代价(使用了延迟渲染的《S.T.A.L.K.E.R.》、《幽灵行动:尖峰战士》都无法支持多重取样抗锯齿),而在新的DX10硬件上则没有问题 。最新版本的UE3引擎已经为DX10做了优化,MSAA已经完全没有问题(《战争机器》PC版在DX10下即可开启抗锯齿),但是之前面世的几个采用UE3的游戏都是基于老版本的UE3开发,所以对MSAA的支持还存在各种问题。对于目前的几个UE3引擎游戏,它们并未使用延迟渲染技术。

目前使用了延迟渲染技术的游戏有《S.T.A.L.K.E.R.》、《幽灵行动:尖峰战士》系列。


]]>
https://www.qingran.net/2011/02/%e8%bd%ac%e7%83%ad%e9%97%a83d%e6%b8%b8%e6%88%8f%e8%a7%86%e8%a7%89%e6%95%88%e6%9e%9c%e5%90%8d%e8%af%8d%e7%ae%80%e4%bb%8b/feed/ 0 920
iphone5硬件更新预测 https://www.qingran.net/2011/01/iphone5%e7%a1%ac%e4%bb%b6%e6%9b%b4%e6%96%b0%e9%a2%84%e6%b5%8b/ https://www.qingran.net/2011/01/iphone5%e7%a1%ac%e4%bb%b6%e6%9b%b4%e6%96%b0%e9%a2%84%e6%b5%8b/#comments Thu, 27 Jan 2011 08:45:18 +0000 https://www.qingran.net/?p=858 iphone4虽然用着很爽,但是iphone5也呼之欲出了,下面也学学章鱼哥,预测一下其硬件改变:

[保持不变]

屏幕分辨率仍是960*640

和iphone4一样的不锈钢外框和天线布局

三轴陀螺仪

[常规更新]

双核1GHz主频CPU,基于ARM Cortex A9

GPU升级成PowerVR SGX543

后置摄像头800万像素

后盖和前盖的玻璃应该会改变一点

电池加大到1500mAH

[扩展更新]

能流畅播放1080p的H.264视频

能录制1080p的视频

拥有HDMI接口

取消”home”键,通过IOS 4.3的手势支持

整体手机接口可能会学习MBP的做法,外壳整体切削,然后用螺丝或者从底部装入

[幻想更新]

“双卡双待”,WCDMA和CDMA 2000均支持

内建某种RFID支持

]]>
https://www.qingran.net/2011/01/iphone5%e7%a1%ac%e4%bb%b6%e6%9b%b4%e6%96%b0%e9%a2%84%e6%b5%8b/feed/ 1 858
[转]极客观察:利用人性弱点的互联网服务 https://www.qingran.net/2010/12/%e8%bd%ac%e6%9e%81%e5%ae%a2%e8%a7%82%e5%af%9f%ef%bc%9a%e5%88%a9%e7%94%a8%e4%ba%ba%e6%80%a7%e5%bc%b1%e7%82%b9%e7%9a%84%e4%ba%92%e8%81%94%e7%bd%91%e6%9c%8d%e5%8a%a1/ https://www.qingran.net/2010/12/%e8%bd%ac%e6%9e%81%e5%ae%a2%e8%a7%82%e5%af%9f%ef%bc%9a%e5%88%a9%e7%94%a8%e4%ba%ba%e6%80%a7%e5%bc%b1%e7%82%b9%e7%9a%84%e4%ba%92%e8%81%94%e7%bd%91%e6%9c%8d%e5%8a%a1/#respond Tue, 28 Dec 2010 09:47:05 +0000 https://www.qingran.net/?p=759 转载自“极客公园”  http:// www.geekpark.net/entity/view/90382

一个伟大的产品发明离不开对人性的深刻探索。你可能不知道到底为什么某个产品让你着迷,你也可能不知道为什么一些公司总能制造出你想要的产品。来让我们看看这些公司到底用什么东西吸引着你。

极客观察本期的话题是:利用人性弱点的互联网服务,我们将会从“贪婪”、“色欲”、“虚荣”、“窥视”、“懒惰”等角度来间隙各种互联网产品如何利用人性的弱点来推广、前进。

第一部分:贪婪。

在人类社会发展的长河中,贪婪也推动了这个社会的进步。有关销售的网站都巧妙的利用这人性的弱点,在某种意义上来说,贪婪是推动销售的中坚力量。从总体来说,无论是团购,点购,秒杀,还是抽奖,该类网站统一的制胜法宝就是价格极其低廉,巧妙的运用了低价这一特点,充分的激发人类贪婪的本性,一次次心甘情愿的点击购买。贪婪也让这个社会的大量资源被无情的给浪费了。

1、团购

以时下最为火爆的团购网站举例来说,超低价格的诱惑是它最具吸引力的地方。以低至三折甚至一折的价格能享受原本昂贵的产品或服务,这恰恰击中了人性贪婪的弱点。使很多没有消费需求的网友盲目的参与了团购。

团购网站都巧妙的设定了消费时限,迫使消费者怀有“今天不买明天就错过的心态”,参与了越来越多的团购,让人们在不知不觉中花费得更多。

结果,贪图便宜的心态就导致了很多人在大量团购之后感到很焦虑,因为当初购买了太多的团购卷,又没有找到特别合适机会去使用,而且已经临近有效期。于是便疲惫的奔波于各类商铺中,体验着那些同样也打了折扣的产品和服务。

2、点购

最近非常流行一种新型的购物形式:点购。

用户可以按照一定价格购买竞拍权利(一般为1-2元),每次竞拍将使该产品价格增加0.01元,并且同时增加20秒竞拍时间。当竞拍倒计时归0时,当时的领先者即最后出价的用户便赢得该竞拍,最终用户以非常低廉的价格买走该产品。

这种类型的网站以非常低的成交价格吸引着众多用户。例如,价值5000元的 iPhone 4 手机竟以200元的价格成交,如此低廉的价格,激发了用户贪婪一面。使得很多用户不计金钱和时间成本的无限制投入,为网站创造了大把大把的利润。

赢得产品的人变得更加贪婪,想去赢得更多的产品。没有赢得产品的人因为已经投入了很多金钱和时间,不得不再次投入让收支平衡。这种恶性循环正是贪婪的魔力。

3、秒杀

同样很多网站也非常流行一种叫ʻ秒杀ʼ的购物形式。

所谓“秒杀”,就是网络卖家发布一些限量的超低价格商品只能在有限的时间内购买。这恰恰激发了人们无限的贪婪欲望。由于商品价格低廉,往往一上架就被抢购一空,有时甚至只用一两秒钟。

“秒杀”从无到有、从有到强不过三个月时间。这种购物形式同样的会吸引很多人购买本不需要的产品,并且真正优惠的精品提供量都很少,很难抢到。这就没有满足广大客户的贪婪需求,使得类似这种活动很难再次激发出人们的购买欲望,所以这种购物形式正在走向落末。

4、抽奖

虽然秒杀越来越不给力,但是ʻ抽奖ʼ这种非常普通的行销手段却长盛不衰。

特别是大量的出现在团购网站上的各类抽奖活动。形形色色的网站都推出过类似“0元购IPad”等活动,甚至于去抽奖“一套房”。这里也是利用人们贪婪的心里,去让客户注册,购买。并且与此同时获得大量的用户资料,之后在对其进行大量的团购宣传,重新满足他们贪婪的欲望。就像人人都想中彩票,但是不知自己浪费了时间以及进入了下一个贪婪陷阱。

5、下载

我们身边或自己或许都有这么一种习惯,如果宽带是包月的话,就不舍得浪费每一秒钟,无时无刻的在下载根本不需要的内容。

比如一个用户想下载一本书,后来发现自己下载了上千本书,到最后估计一本书也没看成。但是这种贪婪的心态给他们带来了满足感。这样就造成了大量的用户半夜挂机下载一堆将来有可能会用到的文件,从而推动了下载软件的发展和移动硬盘的发展。

6、存储空间

这是一个非常有意思的现象。当您可以推荐你的朋友来增加自己网络硬盘的容量的时候,大多数人只是追求最大容量而不顾自己的实际需求。这些商家都利用了用户“想要更多”的贪婪心理,让用户主动的为自己宣传。用户的需求是可以被满足的,但是用户的贪婪的渴求是难以被真正满足的。

第二部分:色欲。

色欲是人类发展繁殖的基础和动力,同样也是网站发展壮大秘密法宝。从目前来看,厂家利用美女对那些饥渴的玩家进行心理上的刺激。其实色欲不应当只有美女这一种形式,所谓食色性也,或许我们今后更多会看到由帅哥组成的营销手段,更或者是美食。

1、美女社区

美女人人爱看,美女多的地方,人气自然也就旺。于是,一个以遍布美女为标榜的社区类网站——美空网,在没有任何宣传的情况下,不到半年流量就超过了百万大关。很多兄弟们在美色的诱惑下登陆查看美空中的美女,并且非常积极的传播给身边的朋友。

这个网站恰到好处挑选出了精品美女,不仅有图片还有视频,充分满足了各位仁兄的欲望。从而推动这个网站的发展,而且是几何级数的增长。

这就是美女的魅力,这就是色欲的强大。

2、美女ID

在网站推广里,“美女ID”起着极其重要的作用。

几乎现在各个社区网站或者SNS网站,充斥这各种美女ID,从头像到相册,从诱惑发言到激情日记。全方位的激活大众色欲需求,激活网站流量的增长。其实我们或多或少的是因为某个美女ID从而注册某个网站或服务,在注册之后会发现更多的美女ID向你扑来。最近有一个好玩的现象就是在社交网站经常有美女ID要加为你的好友,你在不忍心之余就遭受了大量的垃圾广告。这就是色欲惹的祸。

3、胸

社区通常举办各种活动来吸引用户的参与。例如,猫扑网站之前举办的“美胸大赛”,吸引了众多眼球。各种各样的有关美女的帖子也为社区填“色”不少。

4、美女玩家

很多游戏也以色欲作为出发点,推广自己的产品。首当其冲的就是某款游戏给“美女玩家”发工资。美女玩家只有通过严格的审核才能通过,每个月都能收到游戏公司发的红包。这样的举措极大的鼓励和吸引了大量的美女玩家来玩这些游戏,正是大量的美女陪伴左右,在此同时也吸引了广大群众参与进来。色欲这个欲望满足了双方的情感。从而让游戏发展壮大火爆起来。

5、美女工会

更有甚者,看出了厂家利用色欲来吸引玩家的手段后,自行组织了“美女工会”,就像是经纪人公司一样。这种美女工会不仅吸引了各个游戏厂家争先恐后邀约他们入住自己的游戏,同时工会也创造出了自己的生存价值。

不只是厂家可以利用色欲这种人性的弱点,群众也可以团结起来,形成强大的组织来满足各个方面的需求。

第三部分:虚荣。

人生的价值就是获得别人的肯定,过分的追求不合理的或者虚假的表扬就是虚荣。虚荣心是人类一种普通的心理状态。虚荣使一个人上瘾,同时也极易容易影响他人,这就是虚荣强大的力量。现在众多网站都注意到了这一点,下大力气在体现用户价值上面做足了文章。

1、等级制度

使用QQ的用户都知道,如果你的QQ上有多个太阳,这证明了你的QQ资深身份。用户不得不长期的定时的使用产品来证明自己的高人一等的身份。腾讯巧妙的利用这种等级制度满足了大家虚荣的渴求,导致长时间的活跃用户在线,并让腾讯获利无穷。用户之间互相攀比导致更多的人追求更高的等级,也影响了周围的人。

这也是把游戏的等级部分延伸到游戏外。现在有更多的网站加入进来,人人也开始的自己的等级划分,各种消费的金银虚拟卡等等,无一例外的利用了人们虚荣的弱点,迫使人们做出了原本不愿意做的事情来证明自己的强大。

2、号码抢占

抢占各种资源也是虚荣的一种表现。不惜代价的搞到并维持漂亮的QQ号码,例如,现在身边有些朋友每个月迫不得已支付10元来保持住自己7位的QQ靓号,并且使用了越长时间的东西就越难以放弃,这都是因为当初的虚荣。更有甚者,当初为了证明自己多么厉害,竟然花费上百元点亮各种QQ标示。这就是腾讯利用虚荣这一人性的弱点演奏出来的一首首好曲。

3、位置服务

原本LBS是很无聊的,但是正因为加入了各种勋章,虚拟称号之后就变得火热起来。这同样满足了人类的虚荣的心里,用户为了各种徽章和称号,自愿去自己原本不想去的地方去Checkin(签到)。同样因为是虚荣,用户会向周围的朋友宣传自己的成就导致更多的人加入进来。这就是虚荣强大之处,需要别人的认可才能满足自己的虚荣。

用户通常都有持续登录Foursquar、Gowalla以及Facebook地理服务的心理需求,并不是因为想要告诉朋友他们在哪,而是为了保护自己在某一地盘上的领主地位不被他人取代。同时,对于那些没有成为领主的用户,他们也会努力去从现任的领主手中夺取这一称号。如果你因为经常忘记check-in而让自己没有机会成为你所在的办公室或者咖啡馆的领主,沮丧感将随之而来。

4、微博

微博也非常巧妙的利用了虚荣。用户可以炫耀自己的粉丝数量,这就激发起互相攀比自己的粉丝数量。同时网站也提供一项服务“分配粉丝”,这就是在新用户刚刚注册时候分配一些用户给他们,这就给网站提供了另外一条吸金途径。

用户会特别注意自己的发送内容的转发数量,转发的越多越能满足他们内在虚荣的需求。这就迫使用户提供更多的高质量的内容去吸引自己的粉丝转发自己的内容,从而进行了一个良性循环。

第四部分:窥视。

强大的好奇心引发了各种各样的窥视行为,了解别人成为窥视的最大动力,同时窥视成为了社交网站中最强驱动力。

1、博客

博客天生就是用来被人窥视的,以方便可以来展现自己的风采,以及可以让想要了解你的人提供一种渠道。这就导致了很多人因为想去窥视某些人的博客从而使用某种服务。并且用户可以利用各种各样的博客信息去推测,例如,你可以通过观察你女朋友的博客,去了解到谁经常浏览她的博客,又有可能和谁建立了比较亲密的关系等。因为满足了窥视这种心里需求,使得人人网,开心网等众多社交网站发展迅速。

2、隐身

正是因为网站提供了详细的信息,使得可以从这些信息中挖掘出很多有价值的信息。比如谁看了这个照片,谁在这个月内浏览你的博客过多少次等。这就使得有些人不愿意留下自己的痕迹去窥视别人,从而隐身这项功能就诞生了。它可以充分的满足人们窥视的心里,让他们安心的去看自己想看的内容从而不留下任何痕迹。

3、名人博客/微博

名人博客的快速发展必须充分满足群众对于窥视他们的渴望。

名博经常会爆一些小料来让更多的人去关注他们的博客,粉丝们也想了解名人的私生活,会经常去看名人的博客,窥探他们的生活。

第五部分:懒惰。

懒懒定律:凡是优秀的用户体验,必定是满足人性懒惰的。

懒惰是社会发展的根本动力。正是因为懒惰,汽车代替了步行,计算器代替了算盘,电子邮件代替了传统邮件。现在有越来越多的服务都专门向懒人提供,况且懒惰是人类的天性,人人都是懒人。人人都需要可以让其可以懒惰的服务。

1、快捷键

一个拥有大量可以快捷键的产品总是受人欢迎的。

比如Google的各个产品都是用统一的快捷键,你可以快速高效的完成任务,懒惰的你可以尽量减少手臂的移动。大量的快捷键也可以让操作变得更加流畅,手可以呆在一个区域内去完成尽可能多的任务。耳熟能详的快捷键有复制,黏贴,撤销等。

2、网购

男人袜是一个网站给懒惰的男人设计的网购网站。很多男人都不在乎穿怎样的袜子,因为袜子一般不会露出来。也很少专门为了袜子去商场,最终可能很长一段时间都穿着有两个窟窿的袜子。

“男人袜”用极其简单的步骤满足了这帮懒惰的人的需求。这个网站甚至不用注册,直接使用支付宝支付一年的袜子费用,然后每三个月收到三双袜子。这样就非常完美的解决了“穿洞袜”的问题,中间的过程也极其简单。人类懒惰的本性让不懒惰的人找到了商业契机。

3、简单

当遇到新的事物的时候,大多数人都以懒惰为借口拒绝学习。但是苹果公司对这点把握的极其出色,它制造出了很多学习门槛极低的设备,这让这些懒人得到了充分的满足。这种极其简单的产品或者服务现在越来越受到人们的欢迎,比如说,最简单的文件共享网站Ge.tt,只需点击四下鼠标就可以把自己的文件共享给别人了。

Twitter为何流行?两个字:简单。简单是表象,隐藏的是懒惰。140字,不是限制,是自由。只能输入文字?很好,我本就这么懒。懒对于用户体验来说,就如五弦琴的第六弦,看不见但却至关重要。

]]>
https://www.qingran.net/2010/12/%e8%bd%ac%e6%9e%81%e5%ae%a2%e8%a7%82%e5%af%9f%ef%bc%9a%e5%88%a9%e7%94%a8%e4%ba%ba%e6%80%a7%e5%bc%b1%e7%82%b9%e7%9a%84%e4%ba%92%e8%81%94%e7%bd%91%e6%9c%8d%e5%8a%a1/feed/ 0 759
完美的校园招聘 https://www.qingran.net/2010/11/%e5%ae%8c%e7%be%8e%e7%9a%84%e6%a0%a1%e5%9b%ad%e6%8b%9b%e8%81%98/ https://www.qingran.net/2010/11/%e5%ae%8c%e7%be%8e%e7%9a%84%e6%a0%a1%e5%9b%ad%e6%8b%9b%e8%81%98/#comments Thu, 11 Nov 2010 16:39:01 +0000 https://www.qingran.net/?p=698 从10月份开始公司在做今年的校园招聘,由于我所在的项目组程序还有编制,所以就从人力资源的同事哪里了解到了校园招聘的一些情况。

这个事情的整个过程是公司企业文化的一个生动体现:大家都很努力的去做好自己分内的事情,这个努力绝对不是口头上的,是完完全全落实在行动上的;并且非常重视细节,在各个地方实施的都很有可圈可点之处。

主管程序招聘人力资源同事的专业性和敬业精神尤其值得肯定。在校园招聘开始之前一个月就要求各个部门分别出10道题,最后他汇总成今年的笔试题。在几个主要城市宣讲和笔试之后,人力资源的同事又对笔试题和简历进行了初步的筛选。并且根据学生的特点分成了:3D引擎,客户端,服务器端和互联网开发。

今天上午又召集了所有工作室的程序负责人,以及引擎中心的boss,以及主管技术的大boss一起看卷子挑简历。

从看答题的情况和简历看,今年的应届生出色的太多了,要是没有人员限制真是想全部拿下。

而我组的预算限制我们只能要2个人。这样简历中是否有大公司的实习经历;做过的项目情况;基础题目的正确率,以及我关注的自由发挥的题目就成为了选择的重要依据。

挑了一上午,看了100+的笔试题和面试题,最终挑了大概6个人,准备进行面试。

最后感叹一句,计算机软件真是火箭行业,现在的应届生的能力已经远超当年的我。。。

革命尚未成功,同志尚需努力。

]]>
https://www.qingran.net/2010/11/%e5%ae%8c%e7%be%8e%e7%9a%84%e6%a0%a1%e5%9b%ad%e6%8b%9b%e8%81%98/feed/ 4 698
米国的工程师确实nb! https://www.qingran.net/2010/08/%e7%b1%b3%e5%9b%bd%e7%9a%84%e5%b7%a5%e7%a8%8b%e5%b8%88%e7%a1%ae%e5%ae%9enb%ef%bc%81/ https://www.qingran.net/2010/08/%e7%b1%b3%e5%9b%bd%e7%9a%84%e5%b7%a5%e7%a8%8b%e5%b8%88%e7%a1%ae%e5%ae%9enb%ef%bc%81/#comments Fri, 13 Aug 2010 16:55:10 +0000 https://www.qingran.net/?p=587 今天面试了一个在任天堂中国分舵做Wii 3D引擎开发的哥们,首先这哥们非常不错,终于找到合适的兄弟了。

中午一起吃饭的时候聊到他工作中接触到的美国工程师,他说Wii的体感手柄系统是由硅谷的一个5人团队搞定的:包括外形设计;硬件电路设计;编程lib库等一干。

kao,鬼子确实厉害!!!

]]>
https://www.qingran.net/2010/08/%e7%b1%b3%e5%9b%bd%e7%9a%84%e5%b7%a5%e7%a8%8b%e5%b8%88%e7%a1%ae%e5%ae%9enb%ef%bc%81/feed/ 1 587
FreeBSD 8.1 发布 https://www.qingran.net/2010/07/freebsd-8-1-%e5%8f%91%e5%b8%83/ https://www.qingran.net/2010/07/freebsd-8-1-%e5%8f%91%e5%b8%83/#respond Sat, 24 Jul 2010 14:26:55 +0000 https://www.qingran.net/?p=561 FreeBSD.org发布了最新的FreeBSD 8.1.版本,主要的改进在fs和对新CPU的支持,具体如下:

  • 加入zfsloader;
  • zpool升级到14版本;
  • UFS和ZFS支持NFSv4 ACL,并且添加入到cp(1), find(1), getfacl(1), mv(1), 和 setfacl(1);
  • 添加对Sun UltraSPARC IV/IV+和 SPARC64 V的CPU支持
  • 对IBM PowerPC G5加入SMP支持
  • BIND升级到9.6.2-P2
  • sendmail升级到8.14.4
  • OpenSSH升级到5.4p1
  • GNOME 2.30.1, KDE 4.4.5

详细的release announcement详见 http://www.freebsd.org/releases/8.1R/announce.html

从日本的Mirror下载ISO可以到100KB/s +,ftp://ftp.jp.freebsd.org/pub/FreeBSD/

]]>
https://www.qingran.net/2010/07/freebsd-8-1-%e5%8f%91%e5%b8%83/feed/ 0 561
游戏开发中的坐标系 https://www.qingran.net/2010/07/%e6%b8%b8%e6%88%8f%e5%bc%80%e5%8f%91%e4%b8%ad%e7%9a%84%e5%9d%90%e6%a0%87%e7%b3%bb/ https://www.qingran.net/2010/07/%e6%b8%b8%e6%88%8f%e5%bc%80%e5%8f%91%e4%b8%ad%e7%9a%84%e5%9d%90%e6%a0%87%e7%b3%bb/#respond Tue, 20 Jul 2010 16:04:25 +0000 https://www.qingran.net/?p=527 游戏和图形开发中常用的坐标系有:世界坐标系、物体坐标系、摄像机坐标系、惯性坐标系、嵌套坐标系。

先说一下数学上的空间直角3维坐标系。

空间直角坐标系
解析几何为了沟通空间图形与数的研究,需要建立空间的点与有序数组之间的联系,为此我们通过引进空间直角坐标系来实现。
过定点O,作三条互相垂直的数轴,它们都以O为原点且一般具有相同的长度单位。这三条轴分别叫做x轴(横轴)、y轴(纵轴)、z轴(竖轴),统称坐标轴。通常把x轴和y轴配置在水平面上,而z轴则是铅垂线。

右手坐标系:当它们的正方向要符合右手规则,即以右手握住z轴,当右手的四指从正向x轴以π/2角度转向正向y轴时,大拇指的指向就是z轴的正向,这样的三条坐标轴就组成了一个空间直角坐标系,点O叫做坐标原点。

左手坐标系:当它们的正方向要符合左手规则,即以左手握住z轴,当右手的四指从正向x轴以π/2角度转向正向y轴时,大拇指的指向就 是z轴的正向,这样的三条坐标轴就组成了一个空间直角坐标系,点O叫做坐标原点。

图示如下

另外一个简单的判断方法:在空间直角坐标系中,让右手拇指指向x轴的正方向,食指指向y轴的正方向,如果中指能指向z轴的正方向,则称这个坐标系为右手直角坐标系.同理左手直角坐标系。

DirectX中使用的是“左手坐标系”,M$ XNA是使用的“右手坐标系”,OpenGL使用的是“右手坐标系”,大多数数学运算中也使用的“右手坐标系”。

看来M$一向的另类,自己的两套东西坐标系都正好相反。

世界坐标系
世界坐标系是描述其它坐标系所需要的参考框架,只能用世界坐标系描述其他坐标系的位置,不能用更大的,外部的坐标系来描述世界坐标系。关于世界坐标系的的典型问题都是关于初始位置和环境的,如:

  1. 每个物体的位置和方向。
  2. 摄像机的位置和方向。
  3. 世界的每一点的地形是什么
  4. 各物体从哪里来,到哪里去。

物体坐标系
物体坐标系是和特定物体相关的坐标系。每个物体都有它们独立的坐标系。 在物体坐标系中可能会遇到的问题:

  1. 周围有需要互相作用的物体吗?(我要攻击它吗?)
  2. 哪个方向,在我前面吗?我左边一点?(我应该射击还是转身就跑)

摄像机坐标系
摄像机坐标系是和观察者密切相关的坐标系。是一种特殊的“物体”坐标系。 问题:

  1. 3D空间中的给定点在摄像机前方吗?
  2. 3D空间中的给定点在屏幕上还是超出了边界?
  3. 某个物体是否在屏幕上?部分还是全部在?
  4. 两个物体谁在前面?(可见性检测,深度排序)

惯性坐标系
惯性坐标系是为了简化世界坐标系到物体坐标系的转换。从物体坐标系到惯性坐标系只需旋转,从惯性坐标系到世界坐标系只需平移。
嵌套坐标系
嵌套坐标系同样为了简化物体在世界坐标系中位置,如一个物体坐标系嵌套一个头部坐标系,则头部坐标系可以只与物体坐标系联系,简化操作。

]]>
https://www.qingran.net/2010/07/%e6%b8%b8%e6%88%8f%e5%bc%80%e5%8f%91%e4%b8%ad%e7%9a%84%e5%9d%90%e6%a0%87%e7%b3%bb/feed/ 0 527
伴晚百望山自行车溜圈 https://www.qingran.net/2010/07/%e4%bc%b4%e6%99%9a%e7%99%be%e6%9c%9b%e5%b1%b1%e8%87%aa%e8%a1%8c%e8%bd%a6%e6%ba%9c%e5%9c%88/ https://www.qingran.net/2010/07/%e4%bc%b4%e6%99%9a%e7%99%be%e6%9c%9b%e5%b1%b1%e8%87%aa%e8%a1%8c%e8%bd%a6%e6%ba%9c%e5%9c%88/#respond Sun, 18 Jul 2010 13:41:50 +0000 https://www.qingran.net/?p=518 本来周末应该出去骑车的,本来想着一早去妙峰山。表也定好了,早上8点也准时醒来了,不过发现外面太阳貌似很毒,而家里微风吹的很爽,于是乎就继续睡过去了。

这一下到中午起来,结果外面更热了,就更不想出去了,就这样一直磨蹭到下午5点半,看着太阳落山了,就推车下楼。

离天黑还有3个小时左右,也就只能去百望山了,从国防大学里进入防火道,然后一路向上,记录了一下时间,现在貌似要6min,比我过去的最快时间3min之内差了不少。车胎刚刚换过感觉爬坡的时候抓地力很强。另外车子有一个地方在爬坡奋力踩踏的时候总有异响,可能骑一段会消失吧。

稍事休息,然后去天摩沟看了看,06年暑期因为雨水大,天摩沟底就形成了一条小溪,还有小鱼。想着今年雨水比06年大了这么多,而且昨天刚刚下过,沟底应该有一条小溪形成吧。去看了之后很遗憾,沟底非常潮湿,有好几个大水坑,但还没见到有溪水形成。

然后开始下山,现在的胆子小了不少,整个身体的协调性也差了,所以不敢放的那么快,最高速度才37KM/h,跟过去在同样路段最快的50KM/h又差距不少。老了老了,唉,不要追求速度了,安全第一了。

总体来看,山地车经过上周的清洗和调整,好骑了不少。下坡的时候非常颠簸,所以一直是站立在车上,因为震动太大。想着啥时候能换个软尾山地车?又是烧钱的事,打住打住。

]]>
https://www.qingran.net/2010/07/%e4%bc%b4%e6%99%9a%e7%99%be%e6%9c%9b%e5%b1%b1%e8%87%aa%e8%a1%8c%e8%bd%a6%e6%ba%9c%e5%9c%88/feed/ 0 518
Apache2 KeepAlive详解 + subversion优化 https://www.qingran.net/2010/07/apache2-keepalive%e8%af%a6%e8%a7%a3/ https://www.qingran.net/2010/07/apache2-keepalive%e8%af%a6%e8%a7%a3/#comments Thu, 08 Jul 2010 17:23:03 +0000 https://www.qingran.net/?p=502 由于现在subversion的数据有10GB之多,并且一次checkout会有10w个文件之多,所以这两天看如何优化一下我们的subversion,其中一个点就是apache2的keep alive参数。

Apache Keep-Alive扩展源自自HTTP/1.0和HTTP/1.1标准的的持久链接特性。提供了相对长效的HTTP链接方式,用以在同一个TCP连接中进行多次HTTP请求。KeepAlive设置出现在Apache 1.2版本以后。

对于HTTP/1.0的客户端来说,仅当客户端指定使用的时候才会使用持久链接连接。此外,仅当能够预先知道传输的内容长度时,才会与HTTP/1.0的客户端建立持久链接连接。而对于HTTP/1.1的客户端来说,如果没有进行特殊指定,持久将是默认的连接方式。如果客户端进行了请求,将使用数据分块以解决在持久链接里发送未知长度内容的问题。

KeepAliveTimeout的设置说明:
Apache在关闭持久连接前等待下一个请求的秒数。一旦收到一个请求,超时值将会被设置为Timeout指令指定的秒数。
对于高负荷服务器来说,KeepAliveTimeout值较大会导致一些性能方面的问题:超时值越大,与空闲客户端保持连接的进程就越多。

MaxKeepAliveRequests的设置说明:
MaxKeepAliveRequests指令限制了当启用KeepAlive时,每个连接允许的请求数量。如果将此值设为”0″,将不限制请求的数目。我们建议最好将此值设为一个比较大的值,以确保最优的服务器性能。

通过Apache的设置说明,我们明白在对于一个包含许多图片、css、js的静态内容网页, 客户端会在瞬间发出多个HTTP请求,此时多次建立TCP连接会大大降低响应速度且耗费服务器端资源。 此时通过持续连接,可以允许用户在一个TCP连接中发出多个HTTP请求, 减少TCP连接建立次数,提高响应速度。我们可以通过access log统计出连续HTTP请求出现的次数、间隔时间、访问量, 以确定 MaxKeepAliveRequests 和 KeepAliveTimeout 的值。 KeepAliveTimeout 太小发挥不了持续连接的作用;太大了,该断开连接迟迟的在等待,不仅浪费TCP连接数,而且系统中的apache2的进程数目会因此不断增加,使得系统负载升高。

哪么什么决定着我们是不是要开启KeepAlive的因素就很简单了:就是用户一个页面请求中是否会引发向同一个apache2服务器发出多个HTTP的请求。

但是当你的服务器只是在处理动态网页请求时,由于用户很少会瞬间请求多个动态网页(一般都是打开页面之后阅读好半天才点下一页),此时打开KeepAlive无异于浪费TCP连接数。所以此时应该把KeepAlive off之。

而对于提供静态文件服务,例如图片或静态文件服务,如果一用户需要同时从这个服务上得到数个甚至数十个文件,那么KeepAlive不仅仅能减少TCP的链接请求,更能节省apache2的进程资源。
而对于subversion,由于是一个HTTP同步一个文件,所以特别需要KeepAlive的支持,以下是我的配置:

KeepAlive on
KeepAliveTimeout 5
MaxKeepAliveRequests 0
MaxRequestsPerChild 1000
]]>
https://www.qingran.net/2010/07/apache2-keepalive%e8%af%a6%e8%a7%a3/feed/ 2 502
解决evince中文乱码 https://www.qingran.net/2010/07/%e8%a7%a3%e5%86%b3evince%e4%b8%ad%e6%96%87%e4%b9%b1%e7%a0%81/ https://www.qingran.net/2010/07/%e8%a7%a3%e5%86%b3evince%e4%b8%ad%e6%96%87%e4%b9%b1%e7%a0%81/#respond Tue, 06 Jul 2010 06:12:22 +0000 https://www.qingran.net/?p=492 evince打开中文pdf的时候经常是乱码,今天实在忍不了了,google了一翻,其实解决方案很简单:

sudo apt-get install poppler-data
]]>
https://www.qingran.net/2010/07/%e8%a7%a3%e5%86%b3evince%e4%b8%ad%e6%96%87%e4%b9%b1%e7%a0%81/feed/ 0 492