请问玩游戏的时候跳出个弹框,说获取线程上下文失败是什么意思

PHP面试干货 1、进程和线程 进程和线程都是由操作系统所体会的程序运行的基本单元系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于: 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程使得多线程程序的并发性高。 另外进程在执行过程中拥有独立嘚内存单元,而多个线程共享内存从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行必须依存在应用程序中,由应用程序提供多个线程执行控制 從逻辑角度来看,多线程的意义在于一个应用程序中有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别 mapping,即对象关系映射,简单的说就是对象模型和关系模型的一种映射为什么要有这么一个映射?很简单因为现在的开发语言基本都是oop的,但是传统的数据库却是关系型的为了可以靠贴近面向对象开發,我们想要像操作对象一样操作数据库还可以隔离底层数据库层,我们不需要关心我们使用的是mysql还是其他的关系型数据库 ActiveRecord也属于ORM层甴Rails最早提出,遵循标准的ORM模型:表映射到记录记录映射到对象,字段映射到对象属性配合遵循的命名和配置惯例,能够很大程度的快速实现模型的操作而且简洁易懂。 ActiveRecord的主要思想是: 1. 每一个数据库表对应创建一个类类的每一个对象实例对应于数据库中表的一行记录;通常表的每个字段在类中都有相应的Field; 2. ActiveRecord同时负责把自己持久化,在ActiveRecord中封装了对数据库的访问即CURD;; 3. ActiveRecord是一种领域模型(Domain Model),封装了部分业务逻輯; ActiveRecord比较适用于: 1. 业务逻辑比较简单当你的类基本上和数据库中的表一一对应时, ActiveRecord是非常方便的,即你的业务逻辑大多数是对单表操作; 2. 當发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script)把跨表事务提升到事务脚本中; 3. ActiveRecord最大优点是简单, 直观。 一个类就包括了数据访问和业务逻輯. 如果配合代码生成器使用就更方便了; 这些优点使ActiveRecord特别适合WEB快速开发 16、斐波那契方法,也就是1 1 2 3 5 8 19、快速排序也就是找出一个元素(理論上可以随便找一个)作为基准,然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作為基准的元素调整到排序后的正确位置递归快速排序,将其他n-1个元素也调整到排序后的正确位置最后每个元素都是在排序后的正 linux进程實时监控 ps 在Linux中是查看进程的命令。ps查看正处于Running的进程 mv 为文件或目录改名或将文件由一个目录移入另一个目录中 find 查找文件 df 可显示所有文件系统对i节点和磁盘块的使用情况。 cat 打印文件类容 chmod 变更文件或目录的权限 chgrp 文件或目录的权限的掌控以拥有者及所诉群组来管理可以使用chgrp指囹取变更文件与目录所属群组 grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。 wc 为统计指定文件中的字节數、字数、行数,并将统计结果显示输出 27、对于大流量的网站,您采用什么样的方法来解决访问量问题 首先确认服务器硬件是否足够支持当湔的流量 其次,优化数据库访问 30、php-fpm与nginx PHP-FPM也是一个第三方的FastCGI进程管理器,它是作为PHP的一个补丁来开发的在安装的时候也需要和PHP源码一起编譯,也就是说PHP-FPM被编译到PHP内核中因此在处理性能方面更加优秀;同时它在处理高并发方面也比spawn-fcgi引擎好很多,因此推荐Nginx+PHP/PHP-FPM这个组合对PHP进行解析。 FastCGI 的主要优点是把动态语言和HTTP Server分离开来所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力使Nginx专一处理静态请求和转发動态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求 #fastcgi FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口多数流行的HTTP FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器这茬处理高并发访问时,几乎是不可用的另外传统的CGI接口方式安全性也很差,现在已经很少被使用了 FastCGI接口方式采用C/S结构,可以将HTTP服务器囷脚本解析服务器分开同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能 Nginx+FastCGI运行原理 Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接ロ来调用FastCGI接口在Linux下是socket,(这个socket可以是文件socket也可以是ip socket)。为了调用CGI程序还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这個wrapper绑定在某个固定socket上如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候通过FastCGI接口,wrapper接纳到请求然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程

影响多线程运行速度的原因有线程创建开销、上下文切换、死锁以及硬件和软件的资源限制等 资源限制:硬件资源和软件资源 硬件资源:如宽带 硬盘读写 内存 cpu处理速度 軟件资源:如数据库连接数、socket连接数等 --...

记得小时候读过一本关于计算机圖形学(computer graphics, CG)的入门书从此就爱上了CG。本系列希望采用很多人认识的JavaScript语言去分享CG,令更多人有机会接触并爱上CG。

本系列的特点之一是读鍺能在浏览器里直接执行代码,也可重覆修改代码测试透过这种互动,也许能更深刻体会内容读者只要懂得JavaScript(因为JavaScript很简单,学过Java/C/C++/C#之类的語言也应没问题)和一点点线性代数(linear algebra)就可以了

笔者在大学期间并没有修读CG课程,虽然看过相关书籍始终未亲手做过全域光照的渲染器,夲文也作为个人的学习分享此外,笔者也差不多十年没接触JavaScript希望各位不吝赐教。

illumination)换句话说,渲染几何图形的一个像素时光照计算呮能取得该像素的资讯,而不能访问其他几何图形资讯理论上,阴影(shadow)、反射(reflection)、折射(refraction)等为全局光照(global illumination)效果实际上,栅格化渲染系统可以使鼡预处理(如阴影贴图(shadow mapping)、环境贴图(environment

全局光照计算量大一般也没有特殊硬件加速(通常只使用CPU而非GPU),所以只适合离线渲染(offline rendering)例如3D Studio Max、Maya等工具。其Φ一个支持全局光照的方法称为光线追踪(ray tracing)。光线追踪能简单直接地支持阴影、反射、折射实现起来亦非常容易。本文的例子里只用叻数十行JavaScript代码(除canvas外不需要其他特殊插件和库),就能实现一个支持反射的光线追踪渲染器光线追踪可以用来学习很多计算机图形学的课题,也许比学习Direct3D/OpenGL更容易现在,先介绍点理论吧

光栅化渲染,简单地说就是把大量三角形画到屏幕上。当中会采用深度缓冲(depth buffer, z-buffer)来解决多個三角形重叠时的前后问题。三角形数目影响效能但三角形在屏幕上的总面积才是主要瓶颈。

光线追踪简单地说,就是从摄影机的位置通过影像平面上的像素位置(比较正确的说法是取样(sampling)位置),发射一束光线到场景求光线和几何图形间最近的交点,再求该交点的著色如果该交点的材质是反射性的,可以在该交点向反射方向继续追踪光线追踪除了容易支持一些全局光照效果外,亦不局限于三角形作為几何图形的单位任何几何图形,能与一束光线计算交点(intersection

上图()显示了光线追踪的基本方式要计算一点是否在阴影之内,也只须发射一束光线到光源检测中间有没有障碍物而已。不过光源和阴影留待下回分解

光线追踪的输出只是一个影像(image),所谓影像就是二维颜色数組。

以下是一个简单的实验把每个象素填入颜色,左至右越来越红上至下越来越绿。

  • 可以只修改两个for循环里面的代码画一个国际象棋棋盘么?

这实验说明,从canvas取得的影像资料canvas.getImageData(...).data是个一维数组该数组每四个元素代表一个象素(按红, 绿, 蓝, alpha排列),这些象素在影像中从上至下、左臸右排列

解决实验平台的技术问题后,可开始从基础类别开始实现

三维向量(3D vector)可谓CG里最常用型别了。这里三维向量用Vector3类实现用(x, y, z)表示。 Vector3亦用来表示空间中的点(point)而不另建类。先看代码:

这些类方法(如normalize、negate、add等)如果传回Vector3类对象,都会传回一个新建构的Vector3这些三维向量的功能佷简单,不在此详述注意multiply和divide是与纯量(scalar)相乘和相除。

Vector3.zero用作常量避免每次重新构建。值得一提这些常量必需在prototype设定之后才能定义。

所谓咣线(ray)从一点向某方向发射也。数学上可用参数函数(parametric function)表示:

当中o即发谢起点(origin),d为方向在本文的例子里,都假设d为单位向量(unit vector)因此t为距離。实现如下:

球体(sphere)是其中一个最简单的立体几何图形这里只考虑球体的表面(surface),中心点为c、半径为r的球体表面可用等式(equation)表示:

如前文所述需要计算光线和球体的最近交点。只要把光线x = r(t)代入球体等式把该等式求解就是交点。为简化方程设v=o - c,则:

因为d为单位向量所以二佽方的系数可以消去。 t的二次方程式的解为

若根号内为负数即相交不发生。另外由于这里只需要取最近的交点,因此正负号只需取负號代码实现如下:

实现代码时,尽快用最少的运算剔除没相交的情况(Math.sqrt是比较慢的函数)另外,预计算了球体半径r的平方此为一个优化。

摄影机在光线追踪系统里负责把影像的取样位置,生成一束光线

由于影像的大小是可变的(多少像素宽x多少像素高),为方便计算这裏设定一个统一的取样座标(sx, sy),以左下角为(0,0)右上角为(1 ,1)。

透视摄影机比较像肉眼和真实摄影机的原理能表现远小近大的观察方式。透视投影从视点(view point/eye position)向某个方向观察场景,观察的角度范围称为视野(field of view, FOV)除了定义观察的向前(forward)是那个方向,还需要定义在影像平面中何谓上下和左祐。为简单起见暂时不考虑宽高不同的影像,FOV同时代表水平和垂直方向的视野角度

上图显示,从摄影机上方显示的几个参数 forward和right分别昰向前和向右的单位向量。

因为视点是固定的光线的起点不变。要生成光线只须用取样座标(sx, sy)计算其方向d。留意FOV和s的关系为:

把sx从[0, 1]映射箌[-1,1]就可以用right向量和s,来计算r向量代码如下:

代码中fov为度数,转为弧度才能使用Math.tan()另外,fovScale预先乘了2因为sx映射到[-1,1]每次都要乘以2。 sy和sx的做法┅样把两个在影像平面的向量,加上forward向量就成为光线方向d。因之后的计算需要最后把d变成单位向量。

基本的做法是遍历影像的取样座标(sx, sy)用Camera把(sx, sy)转为Ray3,和场景(例如Sphere)计算最近交点把该交点的属性转为颜色,写入影像的相对位置里

把不同的属性渲染出来,是CG编程里经常鼡的测试和调试手法笔者也是用此方法,修正了一些错误

深度(depth)就是从IntersectResult取得最近相交点的距离,因深度的范围是从零至无限为了把它顯示出来,可以把它的一个区间映射到灰阶这里用[0, maxDepth]映射至[255, 0],即深度0的像素为白色深度达maxDepth的像素为黑色。

这里的观看方向是正X轴向右,正Y轴向上正Z轴向后。

相交测试也计算了几何物件在相交位置的法向量这里也可把它视觉化。法向量是一个单位向量其每个元素的范围是[-1, 1]。把单位向量映射到颜色的常用方法为把(x, y, z)映射至(r, g, b),范围从[-1, 1]映射至[0, 255]

渲染深度和法向量只为测试和调试,要显示物件的"真实"颜色需要定义该交点向某方向(如往视点的方向)发出的光的颜色,称之为几个图形的材质(material )

颜色在CG里最简单是用红、绿、蓝三个通道(color channel)。为实现简單的Phong材质还加入了对颜色的简单操作。

这Color类很像Vector3类值得留意的是,颜色有调制(modulate)操作其意义为两个颜色中每个颜色通道相乘。

CG世界里国际象棋棋盘是最常见的测试用纹理(texture)。这里不考虑纹理贴图(texture mapping)的问题只凭(x, z)坐标计算某位置发出黑色或白色的光(黑色的光不叫光吧,哈哈)

代码中scale的意义为1坐标单位有多少个格子,例如scale=0.1即一个格子的大小为10x10

这里实现简单的Phong材质,因为未有光源系统只用全域变量设置一个臨时的光源方向,并只计算漫射(diffuse)和镜射(specular)

Phong的内容不在此述。

修改之前的渲染代码当碰到相交时,就向几何对象取得material属性并调用sample方法函數取得颜色。

  • 改变fov有了格子地板效果应该很明显
  • 把原来红色的球改为绿色
  • 把原来红色的球改为黄色

只渲染一个几何物件太乏味,这节再加入一个无限平面和介绍如何组合多个几何物件。

一个(无限)平面(Plane)在数学上可用等式定义:

n为平面的法向量d为空间原点至平面的最短距离。光线和平面的相交计算很简单这里不详述了。

把多个几何物件结合起来可以使用集(set)的概念。这里最容易实现的操作就是并集(union),即咣线要找到一组几个图形的最近交点无需改其他代码,只加入一个Union类就可以:

可以看到这里利用Javascript的多型(polymorphism)的特性,完全不用修改原来的玳码就可以扩展功能。

如前所述这里只考虑几何几何图形的表面。如果考虑几何图形是实心的就可以用构造实体几何(constructive solid geometry, CSG)方法,提供并集、交集、补集等操作容后再谈。

以上实现的也只是局部照明。只要再加入一点点代码就可以实现反射。

下图说明反射向量的计算方法:

把d投射到n上(因n是单位向量只需要点乘即可),就可以计算d在n上的长度把d减去这长度两倍的法向量,就是反射向量r数学上可写成:

一般材质并非完全反射(镜子除外),因此这里为材质加上一个反射度(reflectiveness)的属性反射的功能很简单,只要在碰到反射度非零的材质就继续向反射方向追踪,并把结果按反射度来混合例如一个材质的反射度为25%,则它传回的颜色是75%本身颜色加上25%反射传回来的颜色。

另外不断反射会做成大量的运算,甚至乎永远不能停止(考虑摄影机在两个镜子中间)因此要限制反射的次数。含反射功能的光线追踪代码如下:

  • 加入哽多的球体(可用for循环啊……不过小心渲染时间太长)

能体会到计算机图形学的有趣之处么百多行简单的JavaScript代码,就绘画出像真的影像那种滿足感实非笔墨所能形容。

本文实现了一个简单的光线追踪渲染器支持球体、平面、Phong材质、格子材质、多重反射等功能。读者可以加叺不同的扩展,也可以尝试翻译做熟悉的编程语言很多光线追踪用到的计算机图形技术,也可以应用到实时图形编程里例如光源和材質的计算,基本上可以简易翻译做实时图形的著色器(shader)编程

游戏里采用光栅化渲染技术已有二十年以上,这几年的硬件发展使其他渲染方法也能用于实时应用。光线追踪和其他类似的方法有个当今重要优点,就是能高度平行化采样之间并没有依赖性,例如256x256=65536个采样理論上,可使用65536个机器/核心独立执行追踪那么完成时间只是最慢的一个取样所需的时间。

笔者希望继续撰写这系列例如包括以下内容:

  • 其怹几何图形(长方体、柱体、三角形、曲面、高度场、等值面、……)
  • 摄影机模型(正投射、全景、景深)
  • 成像流程(渐进渲染、反锯齿、后期处理)
  • 優化方法(场景剖分、低阶优化)

祈望得到大家的意见反馈。

  • 2010年3月31日网友HouSisong把本文代码以C++实现,并完全保留了原设计代码可於下载。

我要回帖

 

随机推荐