Interpreter JIT AOT

Interpreter JIT AOT是三种程序运行模式。需要明白一个大前提:CPU只能执行机器码指令。

首先给大家引入Interpreter和Compiler这两个概念。

Interpreter表示解释器,程序运行中通过对高级语言解释一行执行一行来实现运行(如JavaScript),亦或者将高级代码转变为性能更高的中间码再执行(如php的opcode)。JavaScript是非常典型的解释型语言,你修改一下本地html中的JavaScript,然后直接刷新浏览器就可以看到结果。因此解释器的第一个优点就是构造简单,你不需要掌握什么计算机原理就能写代码,写JavaScript的时候有个记事本就行,什么额外的环境都不需要安装,所以JavaScript是很多学校的入门语言;它的另一个优点就是代码与硬件平台无关,你写的代码可以在任何带解释器的平台上运行,浏览器依然是最好的例子。当然其不足之处就是因为每次运行都要解释,导致效率低下,无法实现cpu密集运算的应用。

Compiler表示编译器,把高级语言编译成可直接执行的机器码,因此其运行效率远高于解释器。编译器又分为两大类:JIT和AOT。

AOT(Ahead Of Time),叫作静态编译器,通过ahead这个单词可以辨别它是在程序运行前编译,直接生成机器码,运行的时候执行机器码即可,这样可以保证最大化效率。世界上性能最高的语言就是基于AOT的,对,我说的就是C和C++。AOT的缺点之一是如果要在多个硬件平台上运行(比如x86、x64、arm),那么需要在每个平台下重新进行编译才可以使用;另一个缺点是占用空间比较大,当然在这个动不动以T为单位存储的年代,这缺点根本不算什么了。因此AOT也是典型的空间换时间的手法。

JIT(Just In Time),叫作动态编译器,通过Just这个单词可以辨别它是在程序运行的过程中编译。话说前面有性能最强大的AOT了,还要这个干甚?你还记得一句广告词嘛?一次编译到处运行,对我说的就是JAVA。一个jar的helloworld能让你在手机、pc、服务器横行,你无须考虑运行平台的问题。它是通过在不同平台的jit虚拟机实现一边编译一边运行。JIT并不一定是执行一行编译一行,假设每行代码只执行一次,那么极有可能这种方式比解释器还慢- -#,因此产生了methodbased jit、trace based jit、region based jit这几种编译策略,来实现接近AOT的性能,由于篇幅有限不在这里细说。编译策略的存在往往意味着JIT会捆绑解释器一起使用,以保证没有编译的部分依然可以正常执行(比如methodbased jit只有同一个方法执行多次才会进行编译,否则交由解释器执行)。近似AOT的强大性能,和拥有强大可移植性就是JIT存在的意义。UNITY3D是非常有代表性的JIT产品。

提问:PHP为什么是最好的语言?

Unity Shader之Phong反射

我在漫反射这篇文章中提到过在同一个表面上光的强度都相同,这会导致一个问题出现,就是如果相邻的两个面法线差别较大,会使表面间的过度不连贯,如下图:

有个叫Bui Tuong Phong的越南人在1975年发表了一个叫Phong的反射模型,大大优化了漫反射的不足之处(可惜这位前辈在这一年英年早逝),该模型效果如下:

它是由这种方法构成:

环境光和漫反射光的计算在前面的文章中都说过了,这里讲一下镜面高光(specular highlight)的实现。

镜面高光:

各参数向量示意图

1.镜面高光Phong分布公式:

k表示光线强度,R表示在表面上的反射光方向向量,V表示视点向量,n表示Phong指数(自行定义大小)

k_{{\mathrm {spec}}}=\|R\|\|V\|\cos ^{n}\beta =({\hat {R}}\cdot {\hat {V}})^{n}

其中{\ hat {R}} _ {m} = 2({\ hat {L}} _ {m} \ cdot {\ hat {N}} {\ hat {N}} - {\ hat {L}} _ {米},Unity中有内置函数reflect实现。

2.镜面高光Blinn–Phong分布公式:

N表示表面法线,H表示视点向量和光线方向向量间的一半的向量,V表示视点向量,n表示Phong指数(自行定义大小)

k_{{\mathrm {spec}}}=\|N\|\|H\|\cos ^{n}\beta =({\hat {N}}\cdot {\hat {H}})^{n}

3.高斯分布(待补充)

4.Heidrich–Seidel各项异性(待补充)

 

实现:

在Debian和Ubuntu下安装Opengl开发环境

1.在命令行执行下面代码

2.安装clion
这是linux下非常好的c++编辑器,这个编辑器里面还可以安装glsl插件,非常棒。
https://www.jetbrains.com/clion/
下载解压缩后从控制台进入bin目录,然后执行:

3.新建clion项目

4.配置CMakelists.txt,把Opengl替换成你的项目名

5.将main.cpp的内容替换成下面的代码,然后编译。

在WIN10和VS2017下安装Opengl开发环境

在win下配置opengl通常需要glut和glew这两个库,从这里下载http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip

https://sourceforge.net/projects/glew/files/glew/2.0.0/glew-2.0.0-win32.zip/download

并解压。

将glut.dll、glut32.dll、glew.dll(win32)和glew32s.dll(win32)拷贝到c:\windows\system。

将glew.dll(x64)和glew32s.dll(x64)拷贝到c:\windows\syswow64。

将glut.lib、glut32.lib、glew.lib(win32)和glew32s.lib(win32)拷贝到C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.10.25017\lib\x86。

glew.lib(x64)和glew32s.lib(x64)拷贝到C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.10.25017\lib\x64。

将glut.h、eglew.h、glew.h、glxew.h和xglew.h拷贝到C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.10.25017\include\gl。gl目录需要手动创建。

新建win32控制台程序,然后

#include <Windows.h>

#include<gl\glew.h>

#include <gl\glut.h>

#pragma comment(lib, “glew32.lib”)

如果没有上面那行可能会报link2019的错误。glew.h必须在glut.h上面。

如果你需要运行Opengl编程指南第八版的例子,请下载freeglut:http://files.transmissionzero.co.uk/software/development/GLUT/freeglut-MSVC.zip。配置方式和上面一致,注意freeglut没有x86目录,默认目录下的dll和lib就是x86的。

大功告成!