3DMGAME 3DM首页 新闻中心 前瞻 | 评测 游戏库 热门 | 最新 攻略中心 攻略 | 秘籍 下载中心 游戏 | 汉化 购买正版 论坛

注册 登录

QQ登录

只需一步,快速开始

查看: 20722|回复: 27
打印 上一主题 下一主题

[讨论] 《蒹葭:冒险之旅》新版本引擎升级计划(基本完成)!更新于2013.9.27

   关闭 [复制链接]

38

主题

702

帖子

3467

积分

云游仙境

跟狗一样的程序

Rank: 12Rank: 12Rank: 12

贡献度
703
金元
6350
积分
3467
精华
2
注册时间
2008-11-1

蒹蒹葭葭

跳转到指定楼层
主题
发表于 2013-7-19 12:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 便便藏tt 于 2013-10-29 13:43 编辑

很抱歉有段时间没有出没了,不过这边仍然在继续开发着。看看这个帖子,之前计划的各种功能,有些已经趋于成熟稳定,而有些已经由于种种问题被放弃了。
在之前的一周里,新的一次大改动已经完成,现在的版本号是 0.09。


这一版中最大的改动是支持的脚本引擎被替换为了 python stackless
我姑且说说在游戏开发中关于脚本引擎的体会,和为什么这么做的原因。


一、
在一开始,游戏的脚本引擎是lua。
为lua集成起来极为简单,又广泛的被各种游戏所应用,那么理所当然的,他成为了我开始的第一选择。
在这个时期,我们尽量使用原汁原味的lua风格,跟C风格比较接近。

二、
我从《饥荒》的lua代码里面抄来了class
面向对象的魔法迅速的改变了整个程序的面貌。


三、
后来到了0.08版本,C++部分很多东西被改变了,我借此机会重写了几乎所有的脚本。
利用lua的元表属性对各种类进行了魔改,Screen类几乎改变了其C++原型的所有行为。


四、
0.09版本中,我直接将整个脚本引擎换成了python。因为lua有着若干无法避免的问题:


* Lua内建功能过少
> 这是一种选择,lua牺牲了更加全面的功能,这使其在移动设备上具有强大的优势。但我发现,对跑在PC上的游戏而言,体积并不是什么太重要的事情,200kb的lua相对于5MB的python,大概也就是一分钟不到的下载时间吧。

* 面向对象的缺失
> 面向对象这一特性的缺失是致命的,这意味着根本不可能有一个大家都认可的标准来做类似“class”的事情,更加难以实现对C++类的扩展。
> 而在同样是swig驱动的python中,我可以直接继承C++类,并且其任意方法进行重载。

* 函数回调复杂
> 为了实现lua的回调,我为Screen View World等类加了不少 lua_set_XXX_callback 或者是 lua_onXXX 这样的方法。我通过一个叫wrap的函数生成一个随机函数名交给C++那边,C++在需要回调的时候,根据这个函数名找到相应的lua函数并传入参数调用。
> 在python中,可以直接继承C++类并重载其纯虚函数,C++调用会自动与python类中的相应方法绑定。

* 命名空间混乱
> lua中最值得吐槽的一点就是,所有的变量和函数都是全局的,写在函数中的变量和子函数如果不加 local 前缀,那么也是全局变量/函数!还有一点有些蛋疼,就是所有全局函数共用一个命名空间。
> 当我要使用View的时候,python代码是这样的: from flux import View 也就是说我必须声明了才能用。还有一个方法是 from flux import *,flux模块下所有东西就都能用了。


相对的,说说lua的优点:
* 轻、小、快
> 上面已经说过了,这是python难以比较的。就算压到最小,python也得有3MB左右,而lua则不到200kb。lua本身的执行效率很高,即使是这样也有LuaJit这种玩意来做加速。
> python方面类似的东西是PyPy,但我觉得这货用在游戏项目不太对劲……不过不提pypy的话,python可以通过调试工具和测试单元有效的找出最耗费时间的部分,然后借助cython或者其他东西,用C/C++来改写这一部分。

* 协程
> 这个玩意是 Lua 的一大特色,如果你没玩过的话,看到这个名字会有一种虽不明但觉厉的感觉。但不管怎样,这确实是个好东西,价值很高,意义非凡。

* 版本抉择
> 集成Lua时,你有两个选择,5.1和5.2。前者的使用相对广泛。而这两者的代码迁移通常不会有什么大的问题。
> 对python来说,py2和py3的割裂无疑是编程语言史上最可耻的语言分裂之一,py3已经发布几年,但时至今日仍有一小部分库没能迁移过去。因为swig似乎不会自动将py3的unicode字符串转换成wstring,所以我仍然选择了py2并继续使用lua时代用的utf-8编码。



最后:

我将自己的python换成了 python stackless,这是一个支持协程的python子集。

现在所有我熟悉的特性都回归了,而地图编辑器和物理引擎则更加强大。这就是0.09版本。我们将继续努力。

评分

4

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|3DMGAME ( 京ICP备14006952号-1  沪公网安备 31011202006753号

GMT+8, 2026-5-26 01:46 , Processed in 0.028711 second(s), 16 queries , Memcached On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表