??xml version="1.0" encoding="utf-8" standalone="yes"?> 脚本的基本特?/p>
1、从语法的角度来说需要支持到序、条件、@环,q且最好语法接q某U成熟语aQ比如CQ,q样有利于学习&使用Q?/p>
2、性能Q性能Q性能。要在实时的游戏里面发挥作用Q性能无异是诏I始l的话题?/p>
语法功能解决Ҏ(gu) 1、可以选择一门成熟语a作ؓ借鉴Q?/p>
2、删掉不需要的KeywordQ裁剪语a元素。特别对于C语言Q完全去掉有兛_数声明等部分可以大大降低parse&excute的复杂性?/p>
脚本?/p>
1、脚本语a的函数库比脚本语a的语法更加重要,q个说法的出发点仍然是性能。在上一文章中Q我有提?#8220;冗余”的概念,是q句话很好的体现。尽量将复杂的函数功能封装在游戏引擎本nQ而不要在脚本中编写这些函敎ͼ甚至可以在脚本中不提供用戯定义函数的功能?/p>
2、提供给用户Q脚本编写者)完善的库函数集,从环境配|命令到信息查询{等。用L(fng)q些函数来控制游戏环境,脚本语法只是提供分支Q@环控制?nbsp; 事g响应 1、上提?#8220;事g”(event)指的是所有外设输入的l称Q这U说法是不全面的。除了外设输入,事gq可以由游戏引擎内部来触发,比如timer事gQ这里做一个小的更正?/p>
2、事件包含一些参敎ͼ参数的内Ҏ(gu)“哪些Object要响?#8221;Q?#8220;事gcd”?/p>
3、一个脚本可以调用其他脚本,实现脚本之间的通信?/p>
4、事Ӟ可作本系l&游戏引擎的连接,也就是说Q游戏引擎只有在处理事g的时候才会调用脚本系l,而脚本系l的唯一dQ就是响应事件?/p>
5、再ơ强调一下,事g不是只能有游戏引擎内部的object来触发,q有timer、startUp、sceneEnd{等?/p>
脚本q行模型 1、每个脚本都可以“?#8221;CQ何数量的object上去Q?/p>
2、每个脚本都可以看作是独立的虚拟机,拥有自己独立的变量、堆栈&q行?execution pointer)Q这一Ҏ(gu)自己有保留的xQ出于性能原因Q可能独立虚拟机的概念难以实施,需要进一步寻扑֏通的Ҏ(gu)?/p>
讉K控制 1、上提到脚本需要能dQ改变游戏引擎内部object的属性,q里需要注意一个问题:让脚本直接访问object的属性是很危险的事情Q出于defensive coding的考虑Q个Z应该让脚本直接地来访问内部数据,而应该提供库函数Q通过库函数来对内部数据进行访问,q样做的好处是:边界检查等{安全性工作加入了q来Qƈ且让脚本~写者在~写脚本的时候不用对安全性进行考虑Q坏处是Q肯定效率是有所降低的。(或者还有更好的办法Q想惟뀂。。) 库函?/p>
1、库函数的实质是C/C++Q引擎编写语aQ的函数指针Q对于脚本系l来说它们是可见的全局symbols。这里引入两个小话题Q一是在引擎初始化的时候,需要注意徏立这些函数的入口地址表,让引擎在需要调用的时候有表可查;二是Qjava呢?有没有类似函数指针的东西Q(q里属于实现阶段的问题,我只是提出,没有ȝIӞ 2、脚本运行的时候,如果遇到调用库函敎ͼ则蟩转到native C/C++代码厅R这里存在运行环境切换的问题Q从脚本语言的堆栈里弹出参数Q传lnative C/C++函数来执行,执行l束以后Q返回结果压入脚本语a的堆栈中。如果把游戏引擎看做虚拟机,那么脚本pȝ是嵌套在这个虚拟机里面的虚拟机Q^_^Q拗口哦Q不知道(zhn)明白了没有Q?/p>
==================================================================================================== 以上讨论的,是运行与游戏引擎部分的脚本系l。以下的Q是有关脚本本n的一些讨论,q个应该归属于游戏制作工L(fng)一部分?/p>
==================================================================================================== ~译 1、当Ӟq个步骤?#8220;解释”Q与C语言一cȝ译式语言有所区分的话更加准确。但׃在做法上跟C是类似的Q所以也可以?#8220;~译”?/p>
2、两个阶D:一是把脚本源代码拆成语a元素QtokenQ不知道q个用哪个中文表辑֥Q编译原理学了都忘了Q二是把所有tokenl织hQ组成基本命令序列?/p>
3、什?#8220;基本命o序列”Q刚才不是说把脚本看q虚拟机吗?q个“基本命o”q当于q个虚拟机CPU的机器指令或汇编指o。也是对于q个虚拟机来说的可执行代码?/p>
“汇编指o” 1、ؓ了简单,把脚本q个虚拟计成单堆栈的吧?/p>
2、基本的命o包括QpushQpopQgoQstopQcallfuncQaddQasign{等?/p>
举个例子吧Q比如写了如下的脚本Q语法上qCQ?/p>
a = 1 + 2; 通过~译Q变化成如下?#8220;可执行序?#8221;Q?/p>
push 1 push 2 pop // store 1 pop // store 2 add // store result push 3 // push result pop // store 3 pop // var name a asign // a = 3 q里只是C意Q可能与实际实现有出入?/p>
q篇略显枯燥了,聊点L的。一直在脚本语言的性能问题Q来看看 各种语言性能比较 吧。LUA好像在脚本语a里面排名靠前呵,我正好也下蝲了它的源码,q在VC上编译好了。在PythonQLUA之间犹U了一下,q是选择LUA吧,比较?yu),单,Python目前已经做得很复杂了。再说偶的脚本系l里面目前不需要提供自定义函数机制Q也不需要OO_看看几个月后能不能作q脚本语言来?到时候再跟Python{等一较高低!:)
好戏在后头哦Q下期开始实际以LUAZ子研I脚本系l了。?/p>
脚本pȝ的必要?/strong>
游戏作ؓ上层应用E序Q是在游戏引擎的基础上运行的Q现在游戏的发展势来看Q游戏者(gamerQ对游戏的可自我配置性有非常高的需求,特别是在游戏q行时的自我配置Q已l不能通过单的传参数来完成q种配置。所以,整个游戏的架构有分成两大块的发展势。一块是kernelQ另一块是configuration。Kernel是游戏的基础c&Object的集合,而configuration是针对特定的上层应用E序Q游戏本w)Q对kernel的元素进行组l&配置。脚本系l无疑将是configuration的重要组成部分?/p>
游戏引擎需要ؓ脚本pȝ提供的接?/strong>
我们把游戏中的物体(实例Q称为objectQ把可以作用于object的函数叫action
1、保存全局变量Q局部变?br>2、得到object(s)的引?br>3、得到object(s)的属性,q调用object的action
4、提供timerq行周期性触发action
以上4点ƈ不全面,但是却是最最基本需要支持的部分。如果需要更深入Q应该还要提供对静态场景的配置、设|场景结束条件以及完善的Debug机制{等?nbsp;
游戏引擎不应该ؓ脚本pȝ提供的接?/strong>
1、画?amp;播放声音{算?br>2、内存管?br>以上2点也q不全面Q因为目前的目没有|络斚w的需求,所以没有考虑安全{因素进来?br>杂七杂八
外设响应
我们把所有的gamer的输入都归纳为外设输入。那么在游戏引擎里面Q对外设的响应应该是游戏实时反应能力的直接体玎ͼ在去q从事的游戏引擎目中,采用了类gwindows消息队列的方式,Ҏ(gu)U特定外设输入(比如Q游戏手柄左键按下)Q挂上一个写ȝ函数。在脚本pȝ引入以后Q应该不再挂上一个编译式语言~写的响应函敎ͼ而是调用脚本解释器来q行挂在q个外设上的脚本?strong>所有外N采用脚本来响?/strong>Q这一思想是保证游戏可用户自我配置的关键之一?/p>
冗余
脚本的性能L令h头疼的。所以在引擎提供l脚本的接口当中Q全面所q?点当然在内)Q不要害怕冗余的情况出现Q而是要针Ҏ(gu)戏开发者的需求,适当的增加引擎输出的功能Q让游戏开发者在使用脚本的时候,能用脚本写得尽量的单。D例来Ԍ比如需要在某个时刻获得M角最q的怪兽Q如果只使用前面所提的4U接口,需要在脚本里面枚D出所有的怪兽Q然后一一与主角的坐标q行距离计算Q然后才能得到最q的一个怪兽。这是十分低效的。如果这一动作需要频J发生,那么势必影响游戏的整体运行效率。解军_法就是在游戏引擎里面提供一个类似功能的APIQ由游戏引擎本n的开发语aQ一般是~译式语aQ来完成q项功能Q而游戏开发者只需要在脚本里面调用q个API卛_完成q项q算。如此做法在效率上应该比前面的做法要高出许多?/p>