gpt4 book ai didi

functional-programming - 不可变的游戏对象,基本的函数式编程问题

转载 作者:行者123 更新时间:2023-12-04 08:38:35 24 4
gpt4 key购买 nike

我正在尝试“学习更多”和“从中吸取教训”函数式编程以及不变性有利于并发的想法等。

作为一个思维练习,我想象了一个简单的游戏,其中马里奥-esq类型的角色可以与向他射击的敌人一起跑来跑去......

然后我试图想象这是使用不可变对象(immutable对象)在功能上编写的。

这提出了一些令我困惑的问题(作为一个命令式 OO 程序员)。

1)如果我的小家伙在位置 x10,y100 向右移动 1 个单位,我是否只是使用他的旧值重新实例化他,并将他的 x 位置 +1(例如 x11,y100)?

2)(如果我的第一个假设是正确的)
如果我的输入线程将小家伙向右移动 1 个单位,并且我的敌人 AI 线程射击小家伙并且敌人 AI 线程在输入线程之前解决,那么我的家伙将失去健康,然后在输入线程解决后,将其恢复并向右移动.. .

这是否意味着即使具有不变性,我也无法触发并忘记我的线程?
当我得到两个线程操作的结果时,我是否需要同步发送我的线程来做他们的事情然后 new()up 小家伙?还是有一个简单的“功能”解决方案?

这与我每天面临的线程问题略有不同。
通常我必须决定是否关心线程解析的顺序。在上述情况下,从技术上讲,我不在乎他是否受到伤害或先移动。但我确实关心实例化期间的竞争条件是否会导致一个线程数据完全丢失。

3)(再次如果我的第一个假设是正确的)不断实例化一个对象的新实例(例如马里奥人)是否有一个可怕的开销,这使它成为一个非常严肃/重要的设计决策?

编辑
对于这个额外的编辑很抱歉,我不是这里关于后续问题的好习惯......

4)如果不变性是我应该争取的东西,甚至跳过实例化已更改对象的新版本的箍......如果我每次他移动时都实例化我的人(只有不同​​的位置)我不完全有如果他是可变的,我会遇到同样的问题吗?在某个时间点引用他的东西实际上是在查看旧值吗?..黑客。 :¬?

我想我的问题是:如何 应该 这个工作?以及仅仅改变他的位置有什么好处?

for(ever)//simplified game-loop update or "tick" method
{
if(Keyboard.IsDown(Key.Right)
guy = new Guy(guy){location = new Point(guy.Location.x +1, guy.Location.y)};
}

同样令人困惑的是:上面的代码意味着那个家伙是可变的!(即使他的属性不是)

4.5) 对于一个完全不可变的人来说,这可能吗?

谢谢,

J。

最佳答案

对你的观点有几点评论:

1)是的,也许。为了减少开销,实际设计可能最终会在这些实例之间共享大量状态。例如,也许你的小家伙有一个“设备”结构,它也是不可变的。新副本和旧副本可以安全地引用相同的“设备”结构,因为它是不可变的;所以你只需要复制一个引用,而不是整个事情。这是一个只有通过不变性才能获得的共同优势——如果“设备”是可变的,则您无法共享引用,因为如果它改变了,您的“旧”版本也会改变。

2)在游戏中,解决这个问题的最实用的解决方案可能是拥有一个全局“时钟”,并让这种处理在时钟滴答处发生一次。请注意,如果您没有以函数式样式编写它,您的确切场景仍然是一个问题:假设 H0 是时间 T 的健康状况。如果您将 H0 传递给在时间 T 做出关于健康状况的决定的函数,您采取在时间 T+1 损坏,然后函数在时间 T+5 返回,它可能根据您当前的健康状况做出错误的决定。

3)在鼓励函数式编程的语言中,对象实例化通常尽可能便宜。我知道在 JVM 上,在堆上创建小对象是如此之快,以至于在任何实际情况下都很少考虑性能,在 C# 中我也从未遇到过这种情况。

关于functional-programming - 不可变的游戏对象,基本的函数式编程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3293059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com