函数式编程适不适合游戏开发

235 天前
 cj323

之前写小游戏(非专业,纯玩)都是习惯面向对象。大概感觉是这样

class Object()
  #states: [position, health, direction...]
  #methods: [move, serializer]
        
class Player(Object)
  #player_methods: [attack...]

class Boss(Object)
  #boss_methods: [...]


p1, p2 = new Player(), new Player()
boss = new Boss()

p1.move(..)
p2.move(..)
boss.attack(..)
Renderer.render(p1, p2, boss)

学了几天 elixir 后发现函数式也挺顺手,但是不知道有没有实际用函数式开发游戏的。

global_state<Immutable> {
  player1_pos: ..
  player1_health: ..
  player2_pos: ..
  player2_health: ..
  boss_pos: ..
  boss_health: ..
  ...
}

fn move: state -> new_state
fn move_player: () -> state -> new_state
fn move_player_by_num: num -> () -> state -> new_state
fn move_boss: state -> new_state
fn boss_attack: state -> new_state

global_state
  |> move_player_by_num(1)
  |> move_player_by_num(2)
  |> move_boss
  |> bos_attack
  |> render

感觉除了内存占用大一些没其他坏处,有有经验的分享下么?

4921 次点击
所在节点    程序员
30 条回复
yazinnnn0
235 天前
写 server 还是写 client?
感觉都不合适, 游戏天生自带了一吨外部状态, 天生和函数式理念不符
mightybruce
235 天前
还是写得太少了,在高手面前编程范式都是可以挑选的,而不是拘泥于一种。上面也有人提到了 erlang, elixir 很多人都用来做游戏后端, 给一个 20 年老程序员 网易游戏总监云飞的 blog 地址,
他之前搞得 skynet 框架 正是借鉴了 erlang 的特点(比如热更新)。他写这些东西的时候已经是 10 年前了。
https://blog.codingnow.com/2013/08/skynet_update.html
c0t
235 天前
客户端肯定不合适,至少不能纯用某个语言来写,连个事实标准的图形 api binding 都没有,要我自己新造个轮子来解析 vulkan xml ,我还真嫌麻烦。

至于 elixir ,要例子的话,我记得一些日本公司有拿来做服务端用,在他们一些技术博客上看过,比如 cygames?

这一堆函数式语言里我觉得最有双端生产力的是 F#,只可惜 BDFL 自己都不在乎自己的成果了,微软剩下那几个全职开发同时负责编译器和内部支持,完全忙不过来,F#最后只会越来越和 C#脱节
mightybruce
235 天前
对 skynet https://github.com/cloudwu/skynet/
实际封装后的游戏服务器例子
https://github.com/li5414/RillServer
kakki
235 天前
性能会跟不上,之前知乎看过某个帖子,也是大佬重构 erlang 写的后端极大的提高并发量, c++ 在性能敏感场景就是这么吊你不得不服.
tubinorg
235 天前
用 erlang 的好处就是
1. 并发,每个进程都有自己的队列,收发消息简单粗暴,进程隔离
2. 监督进程可以管理子进程
3. 热更新

对于性能
非得需要极致性能,那么 + c + zig + rust
对于项目
所有的大型逻辑项目,都是屎山堆屎
fengjianxinghun
235 天前
顽皮狗的游戏逻辑用一个 lisp 方言脚本开发,详见游戏引擎架构那本书
tubinorg
235 天前
@tubinorg 坏处是 这 tm 啥 jb 符号语言
BALDOOR
235 天前
我写这玩意 10 年了,爽和蛋疼参半吧
性能不行,我已经编译甚至在 beam asm 层面优化过,哪怕跑在 jit 下都很差,计算密集场景需要用 c 写 nif
有一次,一个小项目,复杂度很低,我用 typescript+rust 复刻了一遍,直接跑了超过 10 倍的性能
适合一些性能不敏感的,但随意并发需求大的,IO 打满的场景
不要迷信所谓的函数式之类的,从工程角度来说大多数都比较差,难学也是其中之一
netabare
235 天前
游戏开发需要处理大量对象吧,似乎是计算密集型的任务,纯函数式编程会产生巨量生命周期极短的对象,似乎和游戏开发不太合得来。

不过要是写小型游戏或者后端应该会很爽,而且 FRP 和 Signal 之类的工具表现力也很强。不过能不能习惯就是另一个问题了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1104857

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX