我刚刚在F#中发现了MailboxProcessor并且它被用作"状态机"......但我对它们的推荐用法找不到多少.
例如...假设我正在制作一个有100个屏幕上敌人的简单游戏,我应该使用MailboxProcessor来改变敌人的位置和健康状况; 给我200个活跃的MailboxProcessor?
引擎盖下是否有任何聪明的线程管理?我应该尝试限制我拥有的活动邮箱处理器的数量,还是可以不断地敲打它们?
提前致谢,
JD.
我想在Clojure中构建一个bloom过滤器,但我对基于JVM的语言可用的所有散列库知之甚少.
在Clojure中,我应该使用什么来实现最快(而不是最精确)的bloom map实现?
我正在尝试"学习更多"和"从函数式编程中吸取教训"以及不可变性对并发性有益的想法等.
作为一个思想练习,我想象一个简单的游戏,Mario-esq类型角色可以跑来跑去向他射击的敌人......
然后我试着想象这是使用不可变对象在功能上编写的.
这引发了一些困扰我的问题(成为一个势在必行的OO程序员).
1)如果我的小家伙在位置x10,y100向右移动1个单位,我只是使用他的旧值重新实例化他的x位置+1(例如x11,y100)?
2)(如果我的第一个假设是正确的)如果我的输入线程移动小家伙右1单位和我的敌人AI线程射击小家伙和敌人-ai线程解决输入线程然后我的家伙将失去健康,然后输入线程解决,获得它并向右移动......
这是否意味着我无法解雇 - 而且 - 即使在不变的情况下也会忘记我的线索?当我得到两个线程操作的结果时,我是否需要发送我的线程来执行他们的操作然后新的()同步的小家伙?还是有简单的"功能性"解决方案?
这与我日常所面临的线程问题略有不同.通常我必须决定我是否关心线程解决的顺序.在上述情况下,我在技术上并不关心他是否先受到伤害或移动.但我确实关心实例化期间的竞争条件会导致一个线程数据完全丢失.
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)};
}
Run Code Online (Sandbox Code Playgroud)
令人困惑的是:上面的代码意味着那个人是可变的!(即使他的属性不是)
4.5)这完全是一成不变的人吗?
谢谢,
J.
使用ZooKeeper时是否可以监视后代znodes上的所有事件?
例如,如果我有:
(/)
/ \
(/a) (/b)
/ \
(/c) (/d)
Run Code Online (Sandbox Code Playgroud)
有没有办法观察根对/ a,/ b,/ c和/ d的更改?
用于存储具有非常高的更新速率和数据量的用户数据的最佳no-sql替代方案是什么?
例如,对于高容量站点,每页请求倾倒数十到数百行用户状态/导航状态数据.
我目前正在关注Mongo或Couch,但我对其他选择持开放态度.
编辑(响应kprobst的请求):它将托管在Linux上,并且可以提供多个实例(硬件或虚拟机).
该系统将用于存储站点访问者状态,未经验证的用户存储1-2周,并且(可能)无限期地用于经过身份验证的用户.
我认为当前在业务中的思维方式是使用CouchDB,因为我们在其他地方使用它,但我也一直在阅读它是性能最差的不断更新,并且该系统有可能更新30 - 400行json为每个用户提供多个文档,当用户与站点交互时(预计使用率非常高).
除了这种状态"转储"之外,还将存储其他用户信息,并且能够查询这将是有用的.
可以说我世界上有一套城市是这样的:
EUKLOND
EUKMANC
EUKEDIN
EITROME
EITMILA
EITNAPE
EFRPARI
EFRAVIG
EFRBRES
Run Code Online (Sandbox Code Playgroud)
如果第一个字母是大陆,则下两个是国家,后4个是缩写的城市名称.
我希望能够通过传入"E"来搜索这个集合,它将返回所有条目或EIT并检索意大利或EFRPARI的所有条目并获得巴黎条目.
这是我可以用Redis做的吗?
我正在尝试编写一个构建类似于compojure中使用的中间件的宏.
我希望能够打电话:
(def-middleware plus-two [x]
(+ 2 x))
Run Code Online (Sandbox Code Playgroud)
结果如下:
(defn plus-two [f]
(fn [x]
(f (+ 2 x)))
Run Code Online (Sandbox Code Playgroud)
我已经远远没有阅读在线指南了,但它对我不起作用:
(defmacro def-middleware [fn-name args & body]
'(defn ~fn-name [f]
(fn ~args
(f ~@body))))
Run Code Online (Sandbox Code Playgroud)
任何帮助或指向更好的宏写作指南的指针都会很棒,谢谢.
我正在为我的F#项目创建一个场景图:
root
->player_bob
-->torch
->enemy_1
-->extravagant_hat
-->enemies_cat_jess
--->fleas
--->fur_ball
->loot
Run Code Online (Sandbox Code Playgroud)
等等,等等.
每个项目都需要保存一组游戏对象来代表它的孩子.
例如,enemy1的列表包含猫和帽子,猫列表包含跳蚤和毛球
所以我计划让它们全部继承自一个包含描述对象子集合的集合的类.
现在回答我的问题: 我应该将子对象向下转换为GameObject,并将它们存储在"GameObject"基类的列表中,或者创建一个有区别的联合,例如
type SceneObject =
|Character of Character //e.g player, enemy, cat
|Item of Item //e.g hat, torch, furball
Run Code Online (Sandbox Code Playgroud)
并将对象存储为"SceneObjects"列表,以避免任何问题/开销,以及向上转换它们等.同时允许我描述在碰撞检测中不渲染和/或不使用对象的特殊情况,例如:声音发射器,陷阱触发器等
歧视的联合+继承组合是我最初的想法; 尽管如此,由于我是FP的新手,我认为向专业人士询问最佳,实用,接近这一点的方式是明智的.
谢谢,
JD
我已经制作了一个简单的3帧动画角色走到了使用Haxe + Haxepunk点击屏幕的地方......好吧,我从在线教程中复制/粘贴代码只是为了测试Haxe.
这在flash,iOS模拟器和三星Galaxy 3上运行得很好......但是我的HTC希望它以低于每秒1帧的速度运行.虽然我知道渴望不是春鸡,但这是一个巨大的性能差距,比我在任何应用程序上看到的更多:Galaxy vs. Desire ......
这是一个Haxe问题还是我做错了什么(错误的NDK,错误的编译标志,操作系统太旧等)?
如何使用cyclejs对文档加载的Web服务发出http请求?这些示例涵盖了对用户输入的反应,不符合我的需求.
clojure ×2
f# ×2
android ×1
android-4.0-ice-cream-sandwich ×1
bloom-filter ×1
concurrency ×1
couchdb ×1
cyclejs ×1
hash ×1
haxe ×1
haxepunk ×1
immutability ×1
inheritance ×1
java ×1
macros ×1
mongodb ×1
nosql ×1
redis ×1