如何学好游戏编程 一

这篇文章写完能快半年了,当时只是发到学校BBS上,不敢写到空间里,怕高手见笑,但工作了2个月,发现自己写很多还是对的,于是斗胆拿来出来,给新手一些指点,也希望高手给我些指点。

   现在天天忙工作,没事时忙着写引擎,很少有时间写文章了,等我第二个引擎写完,我一定会把这个细节的详细实现都写出来。

  此篇文章献给那些为了游戏编程不怕困难的热血青年,它的神秘要我永远不间断的去挑战自我,超越自我,这样才能攀登到游戏技术的最高峰   
        ——阿哲VS自己

前言

 本人不才,姑且以自己经验来谈如何学游戏编程,这个话题我酝酿了很久,它确实很难写,因为我也不是资深高手,才刚刚登堂入室,游戏编程大师功力一般都十几年左右,所以让我这样的小卒写的深入浅出更何谈容易,错误出现并不奇怪,高手见笑也在所难免,请大家指正,我会欣然笑纳。但这几年走过的路,让我知道这么学是正确的,大体过程经验告诉我,这样做是对的,高手的指引告诉我,这样做是对的。
 这篇文章主要讨论如何学习游戏图形编程和游戏引擎编程,告诉没有接触游戏过编程或者现在关于怎么学好游戏编程还迷惑的PEOPLE所要走的方向,完全抛开技术和代码实现进行谈论。至于游戏逻辑这几年重点没有发到这个上面上,很难总结。

 对于游戏中的网络,我个人认为不算游戏编程范畴,可能有人和我意见不一样,只不过我们把游戏编程定义不同罢了,虽然现在游戏离不开网络,毕竟它只负责数据传输,和游戏内涵没有任何关系(这里的内涵指的我们可以看见和感受到的游戏氛围)
 经验的限制,对于如何编写一个好的引擎(至于“好”这个词都是相对而言,能做的满意就是我所期望的),至今为止我还没有这个能力,但我相信经过我的努力,不久的将来,我会实现这个愿望,因为我的一个愿望就是实现一个好的引擎。
 
 我从下面几个方面来说明如果学习,记住只是如何学习,要想学好就要靠你自己。
 1。 你真的喜欢游戏编程吗?
 2。 要了解游戏编程
 3。 学会读书,自学与思考,交流与合作
 4。 游戏编程需要的基础知识
 5。 2D游戏编程
 6。 3D游戏编程
 7。 游戏引擎编程
 8。 我的游戏编程生涯
 9。 游戏编程相关书籍介绍
 10。浅谈游戏物理和AI

 

 一。游戏编程,你真的爱她吗?

 当你听完我的介绍后,你就要决定游戏编程是否适合你。

 游戏编程可简单可复杂,简单的2D 《蛇吃豆》,复杂的现在流行的3D游戏。咱们不说简单的,因为你不想学习游戏编程就为了做一个简单的游戏。确实每个人对他所向往的东西都想彻底了解清楚,可是我给你的第一个警告,复杂的3D游戏,复杂到难以想象。


 1 你思想需要改变吗?


 打开话题,游戏是一个结合体,她是一个音乐,美术,技术,创意相结合的艺术品,你要用艺术的眼光去欣赏的,因为好的游戏是用艺术的眼光来设计,除了某国的网游不算外,很多经典的游戏流芳百世,成为真正游戏玩家佳话。
 中国的游戏为什么这么落后,你要联想下,当年中国为什么会被八国联军所侵略。腐朽的思想是根本原因,从而导致了腐朽的社会制度。游戏行业也是这样,看待游戏的中国人,始终带着眼镜,用腐朽思想看待游戏,所以现在出现腐朽的游戏行业,导致中国游戏发展缓慢,有人曾经说中国游戏不久就赶超日本和美国,我认为是扯淡,而且不是一般的扯淡,具体原因后面我会详细说明。
 从小的时候,国外的电子游戏产品就跑进了我的空间,废寝忘食的玩个没玩,因为耽误学习,从此电子游戏被老师和家长全部封杀,任何事物都有利有弊,鲁迅的《拿来主义》曾说过“去其糟粕,取其精华”。在中国,电子游戏被视为过街老鼠。确实要承认电子游戏有负面影响,但这些负面影响是谁产生的,本质上是我们自己,最后本来是精华的东西从我们身边擦肩而过,从小霸王以后的国外游戏机没有任何仿造,导致了游戏机技术从此断代,现在却又想起来赶超。
 而现在,国人知道努力了,国家看到有钱可赚开始支持了,腐朽的游戏思想却还在蔓延,网络游戏就是这样环境下成长的新生儿,国内网络游戏每年要大批量生产,但存活的基本没几个。不能否定,没有利益的事情没人干,但你还不能否定,有些事情即使没有利益,但还是有人干,哪怕知道自己并不能得到什么。国内的人,很少是第2种人,他们把游戏做为赚钱工具,垃圾游戏隔三差五的纷纷涌出。相比来讲,我只拿日本举例子,虽然小日本和咱们有愁,但我们不得不承认小日本在游戏这方面思想层次完完全全超越我们,他们有严格游戏教育背景,他们做一款游戏,要按照严格的流程,从设计到编程,以至最后的测试,都有着干一行敬一行的精神,否则《生化危机》这样游戏你是永远看不到的。
 所以你要改变自己的思想,游戏是一种艺术品,你要有一种艺术境界来去欣赏她。

 

 2 你有毅力爱她爱到底吗?


 也许我上面的话,你还能接受,残酷的在下面,以我的经验告诉我,如果你编程和游戏理论起步是零,你要对游戏编程达到略有小成的水平最少要4到5年,我比较蠢,花了6年。这6年来,几乎每天平均学习4-5个小时左右,当然假期都要算上。头3年半基本学习计算机基础知识,包括数学,数据结构,计算机体系结构,人工智能,汇编,编译原理,操作系统,网络,软件工程,离散数学,算法分析。我们大学4年基本就学这东西,这些都是基础,游戏编程都需要,还有一个就高等物理我没有学,导致我现在对于一些物理微积分方程很难理解,当然这里并不一定是问题,只要你肯努力,没有学不会的。完全把这些学好,花4年时间真的不容易。我曾经抱怨自己没保研而痛苦的经历考研,现在我却认为是值得的,我很难有时间在集中精力的复习这些专业课了,尤其是数学。
 在游戏编程中,上面的基本知识都可以用到,所以我说游戏编程很复杂一点不假。就拿游戏中最难的部分——一个好的游戏引擎来说(这里说的好引擎),世界上能把她做出来的人很少,中国更是寥寥无几。
 上面只是理论基础,要走进游戏编程最基本的。过硬的编程技能更是需要的,其实这些理论学习可以和编程相结合,在编程中学习理论,为了学习理论而增长编程经验。
 有了基础,你才能进一步学习游戏编程,2D游戏和3D游戏理论都要学,这又要花费很长时间,这个是我下面要详细说的。
 看完我写的,你可能心惊胆寒,所以你要爱她,深深的爱她,否则你承受痛苦的时候享受不到暗含的乐趣。


 3 爱她请从游戏开始。


 很多人可能不解,游戏编程为什么要从游戏开始,玩游戏时,有很多潜移默化的东西影响着我们编写游戏程序,很多灵感确实从游戏中得来。一般的游戏编程高手,都是从小由于游戏对他们巨大吸引,从而走上游戏道路,虽然不是绝对,但按统计学角度讲可以说是一个事实。一个不爱玩游戏的人,爱上游戏编程的几率是很小的。其实很多人小的时候都爱玩游戏,他们都是从游戏厅张大,只有一少部分,走向了游戏开发这个行业,他们之间有着明显不同,走向游戏开发的人,是真的被游戏背后那种神秘东西所吸引,并想要揭开它,而另一些人,则是完全迎合了游戏开发的需要——玩的高兴。
 我想说的是,一个游戏编程高手,必定是一个游戏玩家,他们都是从玩游戏而爱上游戏,从而走上游戏编程道路。这条路充满了荆棘,不是一般人能走到最后的。所以你一定要爱她!
 当然任何事情都不绝对的,你可能就是那不爱游戏但爱游戏编程(或者和游戏性无关的那部分编程)小概率的人。

 

 二。游戏编程,你真的了解她吗?


 游戏编程,这个概念包含了很多深层次的东西。


 1.广义上,我给的定义是,游戏引擎开发和游戏逻辑开发。


 游戏逻辑开发是集中力量只开发游戏中剧情部分,你只需要做的是什么时候显示什么,什么时候放出什么声音,什么时候通过网络传输什么数据,什么时候这个物体或者人物做什么动作。至于底层怎么显示,声音如何处理,网络如何传输,物体动作怎么实现的,你不用关心,关心这些的是游戏引擎。所以说游戏引擎负责技术方面,而游戏逻辑负责游戏文化内涵。
 成功的游戏是以好的游戏逻辑为基础的,而游戏引擎并不是成功游戏主要条件,但好的游戏配上好的游戏引擎,确实会给人一种震撼,相比同样的游戏逻辑,好的游戏引擎显示效果会给人一种全新视觉和听觉感受。
 至于游戏逻辑我不想过多解释,但并不是说游戏逻辑简单,游戏逻辑也可以复杂的要命,这取决与游戏复杂程度和游戏引擎与这个游戏的关联程度。为了解释这句话,我不得不从游戏引擎解释开始。
 早期的游戏是没有游戏引擎这个概念,都是一个游戏一套代码,随着游戏越来越多,大家发现开发有些游戏中,有很多可重用的代码,逐渐把这些重用代码封状起来,这就是早期的引擎。对于引擎没有明确的概念,只有好坏和适应程度之分,所谓的好坏,就是引擎支持功能和显示特性等是否strong,而适应程度是指一个引擎是否适合开发这个游戏,开发这个游戏是否要自己再编写一些额外的代码。
 我举个例子
 如果我用开发混斗罗的引擎(假如它有引擎)来开发RPG,和开发RPG游戏的“RPG游戏开发大师”相比,我们还要做很多工作,才能完成玩法功能一样的游戏。
 所以说很难有明确的界限划分这一堆代码是否是游戏引擎,但游戏引擎的任务是不用质疑的,它的任务就是尽量不用负责底层处理,而专心到游戏逻辑上来。
 
 2.从狭义上分,我只分解游戏引擎部分,基本包括(1)游戏图形引擎(2)声音引擎(3)网络引擎(4)脚本引擎(5)GUI(6)人工智能引擎(7)物理引擎。


 (6)(7)两个不是必须的,而前5个是一个好的游戏引擎要基本具备的,其实每个游戏引擎中都具备物理引擎,只不过很多游戏对于物理要求不是很高,所以就集成到了图形引擎中或者游戏逻辑中。
 图形引擎是引擎中最难的,它基本要处理游戏引擎中70-80%的工作量,它的主要任务是负责图形高效显示,包括速度和精度。后面我会集中并详细解释。至于声音和网络引擎大家通过字面就可以知道它干什么。本人对声音处理和网络传输知道甚少,说出来只能误人子弟。
 
 至于脚本我还略有研究,我想解释下什么是脚本,游戏中为什么用脚本。脚本有时很难给出一个定义,但大家都知道那些是脚本语言,我给出的解释是用软件CPU(虚拟CPU)来运行的编程语言就是脚本语言,软件CPU和所说硬件CPU是对立的,也就是说脚本运行与否先是关联到这个虚拟CPU,在虚拟CPU上运行,然后再又映射到真正CPU,来真正运行。这个过程很抽象,我觉2个例子,第一个就是JAVA语言,它有一个虚拟机,这个虚拟机就是软件CPU。再举一个例子,我现在要编写这样一个指令、
 PRINT S  这个指令表示打印S
 S代表一个万能类型。
 为了实现这个指令,你首先要有一个函数来负责处理打印
 比如是这样的函数
 void print(S)
 {
    cout<  }
 这里只是伪代码,只是表示这个意思。
 你首先要找出PRINT这个单词,读入到一个buffer1,然后把参数读入buffer2
 if(buffer1 == PRINT)
  print(buffer2);

 这里段代码其实就是一个软件CPU,它负责虚拟运行PRINT S  这个指令。
 
 那么游戏中为什么要用脚本呢!最简单解释就是灵活性好。拿一个RPG游戏例子来说,游戏中有大量物品,每个物品有大量的属性,如果我把这些属性值直接写到游戏中,每一个小小的改变就要编译整个游戏,花费很多时间,灵活性很差。
 如果我把这些写到一个文件中,用脚本语言来编辑,只需要编译脚本文件就可以了,当然如果你脚本是解释型的语言,不用编译直接可以运行。
 当然脚本还有很多好处,主要目的还是方便性和灵活性。
 其实GUI(图形用户接口)是一个重要部分。3D游戏中,出现的是大量的3D模型,这些模型是先用文件的形式存放好的,而文件里面包括的是3D数据和这些数据的组织方式。
 至于数据怎么组织是你引擎要规定好的,这样也方便读取,最后把3D数据加载到内存。现在问题是3D数据上,我们怎么能有效的得到这些3D模型的数据,手工写进文本里?我靠,那是奴隶社会,SB的做法。我想你不会这么做。人类很聪明,这就是为什么人把其他动物关进笼子里,而不是其他动物把人关进笼子里的原因。既然我们很聪明,就要想一个办法快速的定义3D数据,然后保存成文件。这样一个3D编辑器就产生了。3D编辑器就是类似于3DMAX那种,但引擎中的编辑器是有特殊目的的,使用者要按照引擎指定要求编辑3D数据,这样引擎高效的显示和处理数据比较容易,至于3D数据是怎么组织的,是一个设计上的问题,由你引擎来决定,设计好坏,决定你引擎加载数据是否容易,关系到最后渲染。所以一般好的游戏引擎都有自己GUI,但你也可以用3DMAX这样的软件,然后读3DMAX文件变成自己可以利用的数据形式。

 说到这里,不知道上面的概念大家是否理解,我想如果你没接触过引擎,可能真的不理解。其实我很难用简短的语言把这么复杂的问题说清楚,如果有一天你把3D学的融会贯通,你发现我说的是对的。我不知道大家是否发现一个共性的问题,有时你读一本书,无论你怎么认真把它看完一遍,你都很难掌握里面的知识,当你再认真看第二遍的时候,你突然觉得这本书没有第一次看那么晦涩难懂。有些知识都是前后呼应的,它们之间相互联系,要想完整的理解它们缺一不可。游戏编程的知识也是这样。我前面介绍的如果你看懂了,那你perfect,如果你没有看懂,也不要灰心,这里介绍的只是一个大纲,让你对游戏编程有一个了解,最基础层面的了解。

三。游戏编程,你准备好了吗?
 
 这个部分讲解如果你想开始游戏编程应该具备那些基础知识,这样你才能接下来游戏编程学习,当然下面的有些知识,我开始学习游戏编程时,也不是都具备,但这些知识都是很容易学的知识,如果你基础好,在游戏编程中随时学就可以,不耽误你学习游戏编程的进度。我在这段最后会指出那些是必须掌握的,因为这些知识如果你在游戏编程时学习再学,时间上真的不允许。
 
 

 1。书,永远是你的好朋友!

 书,是你了解她最直接途径,当然我说的书还包括所有游戏编程资料。书,有好有坏,想要深刻了解她,你必须挑选精妙的好书,而且还有循序渐进的,合理次序的去读它们。游戏编程书籍大量风起云涌的出现是在2000年以后,当然2000以前也有,只是很少一部分,从2000或者以前开始就研究3D游戏的中国大哥们,现在可以说是现在中国游戏行业的鼎梁支柱。现在出版有关游戏方面的书籍大约有200左右本,中国人自己原著的书几乎没有,大多数都是翻译国外的,就有几本翻译的质量很好(翻译大哥大姐确实很辛苦,我承认这点,但拜托你们翻译前要看懂再翻译,否则望文生义,不如让我们自己看英文原版)要么自己写的也是东挪西凑的,写出来估计是想骗钱,谁叫中国人这么老实,这么好欺负了。其中大部分书籍是3D游戏的,3D游戏确实要比2D游戏难一个数量级别,如果你足够聪明,其实这些书看个几十本,写出一个在中国可以立足的3D引擎足够了。但好象这样聪明的人真的很少,有黄金的这个地方大家都知道,可是前往这块宝地的道路太荆棘,很少有人走下来。
 书,大家从出生时就接触,学会读书,这四个字,很少有人能领会,你看一本书,要么否定,要么肯定,如果你还是很迷糊,要么是书写的不好,要么就是你知识水平层次有限,要么就是你根本没学会读书。我在这里只说一句话“要读好书,思而不学则罔,学而不思则怠,温故而知新”,我想高手很容易体会这句话。
 想要学好游戏编程,学会读书是你要掌握的,也是你获取知识最快的途径,开始时,建议还是读一些中文的游戏编程书,因为游戏编程中充斥大量术语和名词,没有任何游戏编程概念的人,直接看英文,即使你是老外,我估计你看一会就会爬在书上,眼皮一关,口水把它淹没了。
 看书后,代码一定要仔细读,而且对于初学者一定要亲自去实现,这样你才能加深理解,有时看书看不懂,一看代码就全明白了。“纸上得来终觉浅,觉知此事必躬行”,我始终坚信这句话,只有你经历了,你才能感受,就象你没有失去过,就不会知道珍惜是什么东西。
 我相信既然你都看到这里了,就应该知道我上面为什么给你打好的警钟。看完书,就要写代码,最好不要一味的效仿,要有你自己的独道之处,这样才说明你认真考虑了这个问题,你也真正了解了,这个问题是什么,应该怎么解决,怎么解决最有效果。
 E文书,以后就要是你老婆(同性恋除外),天天都要见面,除非你离婚了,也就是游戏编程这个爱情你不想要了,你提前离开了这个努力走到最后才能见到美好果实的幸福家庭。中文翻译一般都很慢,中文翻译出来,国外这个技术基本过时了,而且有能力翻译的人本来就少,有时间干这事的说他有病,也不足为奇,因为翻译一本太浪费时间了。所以要适应去看E文,现在没钱,就看电子的,很多国外新书,没有电子的,但电子的够我们初学的人玩很长时间,等有钱了,就直接去买国外正中的洋版,然后弄到家中,天天啃,工作时也啃,人家都会说你很有激情的。看电子的如果闲麻烦,就打印下来,打印下来还是花不了几个钢币的,和买一本中文差不多(大家不要哭穷,一本好书100元我认为很值得,里面技术如果你掌握了,你想想,大把大把的票子就进你口袋里,很多人买来不看,天天还抱怨书贵。)
 这几年来,我读过很多游戏编程方面的书,中文的基本都读过了,现在我一直在读E文书,有时到觉得看中文有些不适应,还有好多好书,我还没有读。读E文书时,如果没读懂,自己一定要去网上查查相关资料,然后集中精力把它弄懂,现在很少有看不懂的E文游戏编程书(知道我6级没过的,别用砖仍我),有些还是看不懂,确实自己水平有限,但不是因为英语问题,关于高深而复杂数学问题,即使翻译成中文,我也很难看明白。
 我在后面会把所有好的游戏编程书籍都列出来,告诉大家那些可以买到,那些只有电子的。不好的书,我就不列出来了,只会浪费大家以后的时间。

 2。游戏编程所需要的基础知识
 
 我这里介绍下要做一个好的,称职的,游戏程序员所需要。学习就和盖楼一样,要想上层建筑牢固,你就要有坚实的基础,我这里介绍的基础是你从事游戏编程最基础,基础的不能再基础的东西。
 2。1 数学
 数学是游戏中支柱,没有了它,任何都不要谈,在你编写你游戏的时候,你就会知道,世界抽象成一堆数学是多么的神奇,突然你会觉得以前枯燥无味的数学现在是一顿大餐,但这个是霸王餐。国外人写关于引擎方面书的人,都可以说是数学高手,他们理论和实践都很厉害,让我崇拜的不得了。大学里是你学好数学的最好机会,一定要弄明白它的现实意义,任何理论都不是凭空出来的,它一定有现实基础,这个现实基础,就可以帮助你很好理解这个理论。
 2。1。1高等数学——微积分理论
 在游戏引擎中,很多游戏特效都是通过微积分方程来解得的,高度仿真是现在游戏的追求,真实感越强就需要越多的计算量。极限,一元微积分,多元微积分,级数,微分方程等等在游戏图形图象和物理上都有明显体现。有时一个硕士或者一个博士为了拟真一个效果要花费几个月或者几年的时间,做为一个游戏程序员,微积分到达什么层次我很难给出定义,但起码如果别人给出了原理我们能看明白,并把它实现,我觉得就很可贵了。
 2。1。2线性代数和空间解析几何
 在大学课本中,空间解析几何是放在高等数学书里面讲的,但游戏中,它和线性代数放到一起我认为更加合适。线性代数所有知识都要掌握,在游戏中它们比微积分体现的更淋漓尽致,理解上我个人认为相对微积分更容易。
 空间解析几何主要讲向量,平面,线,体,这些东西并通过线形代数矩阵进行空间变换,最后达到游戏想要的目标。
 2。1。3四元数
 这个在大学里面不学数学的,估计很少有人接触,它也是来用来变换空间,理解起来不是那么容易,但最常用的就是用四元数来表示旋转。
 我这里只是一概而过,上面任何知识在游戏中都有应用,但大学里的数学不是为了游戏而开设的,所以和游戏中用的数学在知识分列和讲解上还是有很大差异,尤其是线性代数和空间解析几何,不用担心,我在后面介绍给大家一些好的游戏书籍,对大家学习游戏编程和有帮助的。
 2。2语言
 编写游戏c和c++是你首选,相对来讲C++是你更应该掌握的。
 2。2。1 其他语言为什么不是当今流行的编写游戏程序语言?
 VB,JAVA,C#,等等其他语言,并不是说它们不能做游戏,它们能做,由于语言本身设计机理的限制,只能做一些对游戏速度要求低的游戏,对于运行速度要求高的游戏,它们被判成死刑。当然这个也取决于硬件的发展,以前8bit FC游戏都用C语言和汇编来写,现在由于硬件速度提高,用VB,JAVA,C#来写这些游戏运行也是可以的,例如现在兴起的WebGame(网页游戏)。但如果你真想做游戏的话,你一定想要了解现在最流行游戏编写,C和C++是你最好的选择,也是你走上真正的游戏编程道路的重要武器。
 2。2。2 C和C++应该选择那一个?
 C和C++,这里面我还要说一说,我个人更看好C++。大家都知道C是面向过程的,而C++是面向对象的,虽然C++的面向对象特性还不是很完善,但出于对大型软件设计上的考虑,因为游戏引擎是大的工程,框架设计远远要比编程重要,一般框架设计用面向对象方式更直接,所以C++比C更有优越性性,而且如果你合理用好C++,并不见得C++比C速度慢。有时一个软件架构和软件运行上问题,很难取舍,对于大应用程序来说,都是一点点牺牲速度来获得好的架构,是利大于弊的事情,这里确实体现软件工程的重要性质。
 2。3。3 汇编,很重要吗?
 汇编语言也是你要掌握的,你说你语言学的好,但却不会汇编,是一个天大的笑话。现在很少有汇编高手能写出比编译器优化出来的汇编代码运行效率要高,因为语言的不同,思考问题的方式就会有不同,就象最早纸带机上的原语言一样(可计算性与计算复杂性就讲这东西)。如果游戏都用汇编来写,写代码效率很低,所以我们都用高级语言来写,同时还要与底层有密切联系的,C和C++担任大部分工作量。对于游戏速度频颈问题,有时我们用C和C++即使优化很多,代码精简很多,算法也改良很多,但由于语言本身设计上问题,和高效汇编来编写还是有不同的,这时就要是汇编高手来做速度最快,内存和寄存器使用最少汇编程序。所以汇编还是很重要的。
 2。3。4 其他CPU硬件指令
 这里只是说 INTER 和 AMD CPU 都支持的指令集,也是最常用指令集。
 MMX和SSE SSE2是游戏编程中最常用的指令集,这个指令集是 SIMD(single instruction multiple data),也就是单指令多数据流指令集,一个指令可以处理多个数据流运算。汇编CPU指令,一个指令只能执行一个数据流运算。
 例如:
   汇编中
  ADD EAX,EBX
  这是一个加法指令,EAX,EBX是寄存器,是32位的。这个指令就是 EAX = EAX + EBX。这个过程只有一个数据流相加。
  而SIMD思想是,如果现在有2个指令
  ADD EAX,EBX  
  ADD ECX,EDX 
  能不能让他们一起执行?所以SIMD 指令提供这样的功能,他用很大的寄存器,前一部分装EAX值,后一部分装ECX值,再用一个寄存器,前一部分装EBX,后一部分装EDX.
  SIMD 寄存器分成2部分[1部分][2部分]

  SIMD ADD 指令  积存器1  ,积存器2

  运算过程为 寄存器1 [1部分] = 寄存器1  [1部分] + 寄存器2  [1部分] ;
      寄存器1 [2部分] = 寄存器1  [2部分] + 寄存器2  [2部分] ;
  这2个运行是在一个SIMD积寄存器用硬件来执行ADD 同时运行的。
  这里只是说了SIMD思想,现在简单介绍下 MMX,SSE,SSE2。
  
  MMX寄存器是32位的,所以它可以执行4个8bit数据同时运算,也可以执行2个16bit数据同时运算,具体要看使用哪个指令,在早期没有SSE指令时,就用MMX,但MMX有缺点,它和FPU(浮点运算单元,专门执行浮点数运算)共用同样寄存器,所以当你指令有中断,从浮点运算跳到MMX运算,要告诉CPU,从MMX跳到FPU 也要告诉CPU,这样数据要临时保存,降低了处理速度。早期2D游戏经常用这个。
  现在SSE,SSE2有自己单独的寄存器可以使用,而且它们是128位的,支持4个32位整数或者浮点数同时运算。
  这些指令都没有分支,所以使用时效率要我们掌握,因为执行都是并行的,一个指令完成多个计算,所以即使你编写SIMD代码很差,速度也会提高几倍,游戏中经常用SIMD处理颜色和数学运算问题。在游戏速度瓶颈地方用这样的代码,公德无量。
 
 2。3。5  ASM SHADER语言 和 高级SHADER 语言
 开始学游戏编程时,这个知识不一定要具备,因为你不了解3D流水线内部细节学起来还是比较困难,所当你做完“软引擎” 了解3D流水线,在学这个语言很容易,接下来的语言发挥,就靠你自己了。
 早期的游戏,所有的图形图象处理基本都由CPU来完成,然后把处理完的数据传到显存,用显卡来显示。现在的设计理念尽量解放CPU,把与图形图象有关的运算用显卡来完成。但早期显卡只支持固定流水线,所谓的固定流水线就是所有3D数据处理过程都是事先用硬件实现好的,这个过程是一个大过程,里面封状了很多小过程细节,用户只需要输入数据,显卡负责输出数据,至于用户无法干预这个大过程,小过程更是接触不到。再说的通俗一点,一个空间3D三角形要想显示到计算机屏幕上,基本要经历2个大过程,顶点处理和象素处理,顶点处理封状了很多空间变换的小过程,象素处理包括象素混合小过程。这个过程是不可以访问的,我们只能通过显卡提供的接口来控制,而且改变方式很单一。(刚接触这些可能不明白,现在你知道的不用太详细,就知道大过程是不可以干预的就可以了,或者是只有很少一部分可以干预)为了让图形图象处理更加完善话,让人们可以参与到整个3D流水线中,实现更多丰富的效果,显卡开始出现GPU单元(图形处理单元),这时的3D流水线从固定流水编成了可编程流水线,有了早期的GPU 指令,大家都称为 SHADER指令,也就是ASM SHADER,和汇编一样,这些指令都是和GPU指令一一对应的,随着硬件更新,GPU越来越强大,支持指令越来越多,ASM SHADER 从1。0 到 1。4 ,到现在3。0版本。由于ASM SHADER 用起来不方便,就象我们用汇编写程序一样,所以又出现了高级SHADER语言,有DirectX3D下支持HLSL(high level shader language)和 OPGL下支持的GLSL(opengl shader language)这些语言都是面向过程。由于硬件设计限制,这些语言不能象C语言那样随意使用,SHADER语言有自己的使用规范,大家学习时一定要弄明白3D流水线内部实现过程,再使用SHADER简直很容易。
 还有一个要说的是,GPU现在还不支持分支预测,但GPU编程语言现在已经提供了丰富的条件判断,条件判断还是会影响到速度的。
 
 重点你要掌握的是,数学,c和c++,汇编,数据结构,基本掌握的是计算机体系结构,离散数学,编译原理,计算机网络,操作系统,软件工程,数据库,人工智能。可以说这些是计算机最基础的学科,你只有掌握了它们,无论你专研计算机哪个领域,你的基础都是足够的,游戏编程中这些学科都可以用到,我们不用每个学科都精通的要命,我们要精通的是游戏编程,也就是接触到和游戏相关的,我们有这些基础完全可以看懂,然后我们在用自己时间来去专研这些学科在游戏领域的应用。

原文地址http://new.qzone.qq.com/79134054/blog/1226580538

你可能感兴趣的:(游戏开发)