我正在为另一个项目编写一些嵌入式语言。尽管游戏开发不是其初衷,但它看起来似乎很合适,我认为我会在某个时候进行开发。
在不透露任何细节(以避免偏差)的情况下,我很想知道:
您喜欢用脚本语言进行游戏开发的哪些功能?
如果您在游戏项目中使用Lua,Python或其他嵌入式语言(例如Tcl或Guile)作为主要脚本语言,那么您发现哪些方面最有用?
语言功能(lambda,类,并行性)
实现功能(性能优化,JIT,硬件加速)
集成功能(C,C ++或.NET绑定)
还是完全不同的东西?
我正在为另一个项目编写一些嵌入式语言。尽管游戏开发不是其初衷,但它看起来似乎很合适,我认为我会在某个时候进行开发。
在不透露任何细节(以避免偏差)的情况下,我很想知道:
您喜欢用脚本语言进行游戏开发的哪些功能?
如果您在游戏项目中使用Lua,Python或其他嵌入式语言(例如Tcl或Guile)作为主要脚本语言,那么您发现哪些方面最有用?
语言功能(lambda,类,并行性)
实现功能(性能优化,JIT,硬件加速)
集成功能(C,C ++或.NET绑定)
还是完全不同的东西?
Answers:
我正在寻找两件事-速度和集成。通常,两个人在一起并熟悉。不幸的是,对于C ++,几乎没有语言提供速度和集成。我用过Lua,它很烂。我一整天都在写绑定,而实际上没有足够的时间来写代码。
语言功能?嵌入脚本语言的目的不是要使它具有我原来的语言所没有的动态语言功能,而是可以在运行时解释它。我真的不在乎,只要它是基本功能,就可以了,并且适合我的宿主语言(在本例中为C ++)。但是,令人惊讶的是,旨在集成到宿主应用程序中的语言完全无法解决集成方面的问题。
我需要协同程序吗?不,我不需要协同例程。我需要动态输入吗?不,我需要知道我的脚本语言返回的类型是什么,并且由于我现有的所有代码都是围绕非常强大的类型构建的,所以我真的希望我的脚本代码也能够尊重这种类型。我需要垃圾收集吗?不,我的类型已经在管理自己的资源,并且我确实希望确定性销毁。我要去吗?不,我想抛出异常。
我发现的问题是,基本上所有现有的脚本语言都是为了扩展C而设计的,而不是C ++,并且不能以多种方式正确地支持C ++模型,此外,它们还具有完全不同的语义。我要如何将shared_ptr
自动确定性销毁转换为垃圾收集的环境?您可以编写所需的任何包装库,而不会更改与要扩展的语言不兼容的基础语言语义。如何确保这void*
是正确的类型?我该如何处理继承?我如何抛出和捕获异常?就是行不通。
好的C ++脚本语言应该是静态类型化,值语义,确定性地破坏,抛出并捕获异常并尊重我的析构函数/构造函数/复制构造函数,因为这样我所有的类型都将正常工作,很好而又容易,并且最终的语言将是快速并支持我所有的原始语义,易于绑定。
对于基于Web的游戏,对我而言,三个重要因素是:
我特别喜欢Perl,部分原因是因为我已经熟悉该语言,并且因为使用mod_perl2这样的Web服务器模块具有巨大的性能和集成优势-mod_perl2将脚本的编译版本保留在RAM中(仅在第一次加载),这使其在速度上比其他没有编译选项的其他解释型语言更具优势,并且还通过功能丰富的API集成到Apache HTTPd服务器中,该API提供了对许多非常强大的功能的访问权限。
这些因素对于基于Web的游戏开发可能非常有用(在需要访问数据库的地方,缓存数据库连接有助于进一步减少用户的响应时间)。当然,由于每种语言都有其优点(和缺点),所以这可能不是所有事物的最理想解决方案,但是对于我的需求而言,它一直很有效。
按照(递减)重要性的顺序排列: