一次顺带的语言性能评测 -- 以2D水波特效的实现为例

本文作者在实现2D水波特效的过程中,对比了Haskell、NetLogo、Lua、C、C#、Scheme和Clean等语言的性能。通过实例发现,尽管现代函数式语言如Haskell和Clean在性能上接近C,但在特定任务下仍存在较大差距。经过优化,Haskell最终达到与C相当的性能水平,展示了函数式语言在游戏等性能敏感领域的潜力。
摘要由CSDN通过智能技术生成

    本来一开始我只是想学习一下如何实现2D水波特效,关于这个问题早有现成的效果不错且简单的算法,google一下可以找到很多资料,比如这篇http://freespace.virgin.net/hugo.elias/graphics/x_water.htm。但是由于性能上的问题,导致我更换了多种开发语言,最终也使得这次的学习变成了一次编程语言的shoot-out游戏。

    简单来说,2D水波特效是个2D图像处理问题,着迷于DSL的我首先选择了Pan#(http://www.haskell.org/edsl/pansharp.html),一种函数式的针对图像处理的DSL,它的思想、语法和语义都完全来源于Haskell社区的Pan(http://conal.net/Pan/)。作为一种图像处理的DSL,它的基本思想是将图像看成是把2D连续空间映射为色彩的函数,通过应用各种各样的变换函数便可以改变图像函数的映射规则,从而改变图像,这也就实现了各种各样的图像处理。但是当我开始动手做的时候,还是发现了不便。其实Pan#提供的编程模型与流(stream)编程非常类似,同一个2D连续空间中的点与点(同一个流里的元素)之间是比较独立的,绝大多数时候它们不会同时参与运算。但是水波特效不同,图像所在的2D空间中相邻的点与点之间是要进行混合运算的。而且由于Pan#是纯函数式的,没有可变状态(mutable state),所以我用了一些手段迂回地实现了一个demo,但是很可惜它能编译通过,但是启动时却会抛出CLR异常(Pan#是针对.NET平台的)。

    接下来,我换用NetLogo(http://ccl.sesp.northwestern.edu/netlogo/)。这是一个用Java实现的大规模多主体(multi-agent)可编程系统。因为NetLogo支持大规模并发,我想当然地认为它在计算密集型的图像处理中也能胜任,但是最后的结果却惨不忍睹。

    然后我选择了Haskell,底层采用SDL。这个版本的实现我尽量能够functional一点,并且此

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值