noslopforever [天堂里的死神]

我浴血奋战,只为了神圣永久不变的传言

用户操作
[即时聊天] [发私信] [加为好友]
noslopforever(天堂里的死神)
noslopforever(天堂里的死神)的公告

-欢迎大家来到我的空间。这里关注游戏相关学科的问题。
-自我介绍:男,25岁,程序员,喜欢战争、历史和哲学题材游戏。作为一位普通的初学者,希望众位前辈们能多多包涵和帮助。
-欢迎大家拍砖。本Blog原创的文章,如要转载,请注明出处和姓名。本Blog放置的代码,大部分是伪码,不保证能够运行。
*留言本1:没有CSDN帐号的网友留言请点击此链接
*留言本2:CSDN网友请在个人空间留言 ^_^




烽火过千年,往事如烟。争斗一生归何处?黄土青山。 繁华总易逝,回首不堪。敢叫天地换新颜,铁马连天。 ——《无题》 李巍于2008年6月9日

-最近在做:做好自己的项目,安排自己的时间。

-有些栏目的文章是不放在主页显示的,如果有感兴趣的可以到相应栏目查询。杂项和Just As Gamer栏目的,仅作为个人喜好,恕不回复。

最近评论
RAINini:比我小一岁,比我厉害这么多,心里不平衡,请我吃饭。
RAINini:createDirectory好像不支持递归创建目录,../temp/temp 就创建失败了。
noslopforever:嘿嘿……奔三啦……
版本结束,再去酸菜鱼吧~~嘴馋了~~^o^
noslopforever:好的,多谢 ^_^,我马上去弄个1.36来
Nhsoft:你装啥老啊。藕都28了,faint.....竟然比我小三岁,快请客。
文章分类
收藏
相册
misc杂项
朝圣者的路途
文档所需图片册
我的书单
我的照片
!飞龙在天!
cproom前辈的Blog
eXtreme 3D —— Dreams的Blog(RSS)
flymemory的Blog
johnson的Blog——我的老师和第一个上司 ^_^
nhsoft——野猪大大的Blog
Nightmare of Design/Dev(RSS)
游戏编程实践——我的老师的Blog
马肝前辈的Blog
!虎狼成群!
亮——同学、引擎程序员
江自流——另一位同学兼才思敏捷的策划
游戏王——同学,一位才思敏捷的策划
推荐网页
Boost——C++准标准库
Boost中文站
GameDev.net
OGRE3D中文站
OGRE3D——开源的3D图形引擎
Sourceforge
有关WOW格式的Wiki
涂鸦软件——一个很牛的国产游戏引擎
喜欢的站点
《闪电战》杂志讨论区
帝国之鹰
德军总部
英雄世界
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 解释型脚本向编译型脚本转化的一个简单转变收藏

新一篇: 关于DX多窗口编程的一篇翻译(感谢Happy_888网友给出的原文 ^_^) | 旧一篇: 回顾与反思(3)

解释型脚本是大量游戏中需要用到的,用以控制触发器、规则系统和数据系统的一个重要措施。RPG游戏中尤其大量用到了脚本来控制剧情的变化、战场细节等等。即便是在非RPG类游戏中,各种各样的脚本也是被大量运用的。

这里的脚本,并不指代那些"材质脚本""Shader脚本",对我而言,那些不能叫脚本,而只是配置文件,这两个的意义有些不同。脚本是用来执行的,而配置文件则是用来配置、调制的。无论其表现形态如何,是XML?是INI?还是别的,只要是被解释器装载、逐行解释并运行,就是解释型的脚本。

解释型脚本简单易学,耐用。就像名枪AK47,结构简单,经久耐用,高寒、干旱、湿热条件均可应用,每一本编译原理书其实都会花很大的功夫来讲解释原理,正可谓是资源取之不尽用之不竭。我们当时的编译原理课时严重不足,来得及讲完的也不过就是解释原理而已,可惜如何在目标机器上编译出来目标代码、如何把目标代码连接为机器码,都没有学到,惭愧!遗憾!

既然没学过真正的编译原理,因此目前为止所作的也不过就一个很简单的解释器而已。

可惜的事情来了,既然没有学过编译原理,把代码编译为机器代码几乎是不可能的事情,难道写C++或者C的代码,最后交给C++或者C的编译器去编译?虽然这样有先例,但那样也没什么意义,还不如直接硬编码。

后来想想,干嘛把问题考虑得这么复杂,编译,为何要编译?解释器的关键在于逐行解释,每一次运行解释脚本都会重新解释,对于很多游戏来说,这是一个无法容忍的行为。编译的作用就是把脚本代码一次编译为连续的、固定的指令序列的集合,只要脚本没变、以及除开随机数的影响,两次执行同样编译后指令的结果应当是完全相同的。其他还有吗?应该没有了。

其实现在已经有这种编译器,在游戏中也有所应用,Python等脚本语言都提供了编译功能,这种编译其实相对就简单很多。

可以这样理解编译过后的代码:那是一系列指令或者说基本元素的集合,没必要把这些基本元素复杂到细微到Push、Pop、Jump等汇编级别,实际上根据需要,我们可以非常粗略地给出基本元素:按照功能可以把元素划分为行为子和算子,例如GetHP指令获取某物件的HP(如果有),或者MoveTo将某物件设置为MoveTo某位置的状态,最后的算子最为简单而不可或缺,如:与或非、加减乘除、位算符、地址算符、域算符(用于基于对象)等等。这样的一系列代码,对于上层的使用者来说很简单,不必要注意一些不需要注意的细节,同时又能保证扩展性,如果需要新的元素,只需要添加新元素就可以了。就像CISC那样,我不用精简指令,用的就是复杂指令,需要就添加一个复杂指令,效率?要效率的话你就不要玩这个了,去玩机器代码吧,那个效率最高。这本就不准备注意效率,而是去注意开发的效率。在中国,开发了5年的游戏有几个?大部分2、3年就撑不住了,还等你有时间去折磨5年?那只有在特大规模的公司和企业才可能,在中国目前的情况:物力、人力财力是不可能做到的。除了行为子和算子外,更重要的是数据,如何把数据——更多指的是变量——在运行时对应到每个指令上去?这个编译原理的教材中都会提到,我还没有动手,因此就不随便写了,等做完了再写吧。

编译的开始,逐行扫描分析脚本指令,将之打散为基本元素的关系集合。如果脚本是过程性的,那就需要注意出入栈的问题,而如果是基于对象或者面向对象的,目前还没有思考过。最后将所有的基本元素以一种更为精简快速的数据格式存储到某个文件中,作为编译后的目标代码。在执行游戏的时候,我们预先装入这些目标代码,将之转化为用数组或者其他数据结构存储的指令序列。这样就不用解释脚本了,每次运行到目标代码的时候,只需要提供相应的数据,然后调用For循环运行所有的指令就可以了。

我原来用过3DGS,当时听说那个是编译的脚本,刚刚写完解释器的我受触动很大,后来我狠狠查了查3DGS的文件,觉得3DGS好像没有真的把脚本编译为机器码。3DGS的脚本相对是比较RISC的,指令大凡都是简单指令,因此写起来非常难受,比写C还难受。CISC还是RISC是一种具体做法的区别,前者省了脚本编纂者的事情,但是比较费力,不好把握,后者会让脚本编纂者头疼,但是比较好把握,而且挑错比较容易。

粗略写写,请大家帮我看看有没有什么疏漏,期待与您的交流。

发表于 @ 2004年12月10日 16:45:00|评论(loading...)|编辑

新一篇: 关于DX多窗口编程的一篇翻译(感谢Happy_888网友给出的原文 ^_^) | 旧一篇: 回顾与反思(3)

评论

#topcoder0 发表于2007-10-10 12:01:27  IP: 125.35.5.*
这不是什么创新,楼主可能没听说过伪编译这个词吧。
#noslopforever 发表于2007-10-11 15:43:14  IP: 58.31.124.*
^_^ ,确实啊~~
这确实不是什么创新,只是感悟。
感悟一些旧的东西,并提炼出规律,以供今后的进步。
那时候刚入行没几年的我,大概就是因为这个目的,写了这个文章吧……
现在看看,真是自己都有点想笑了呢 *^_^*
发表评论  


登录
Csdn Blog version 3.1a
Copyright © noslopforever(天堂里的死神)