Skip to content

用手捏爆苹果,爽~~

下面一起看看这样一款简单的小游戏设计都需要怎样的设定。

游戏资源

老板

决定了工厂、车间及流水线的数目

主仓、副仓

提供手套和摄像头资源,各占用1个资源数;资源总数有限,工厂共用

手套

流水线根据额度申请使用,使用后放回工作台;手套可以开启空闲自动退回仓库,默认关闭

工作台

存放流水线上的手套,如果开启了空闲自动退回功能,则手套空闲时间达到设定的时长后会自动退回到仓库

摄像头

监控整个生产过程,只能与一个仓通信

流水线

可与一个或多个仓通信,至少安装一个摄像头,与多仓通信则需要多个摄像头;有的流水线同时只能一个工人工作,有的可以多个,建厂时决定;可以统一配置流水线上手套的最大使用量,提倡节约

苹果

大小不同,苹果越大捏爆用时越长

工人

只能捏同等大小的苹果;默认工人有两只手,可以增加多只手;通常只用一只手工作,可以增加更多的手同时工作,受手套数量的限制,可能多余的手需要排队,轮流使用手套

工作

工人戴手套捏爆苹果,一个苹果只能用一只手,不可换手,每次工作苹果数量不同,通常一次只有一个苹果

游戏流程

MongoDB

项目:工厂

处理特定的一些任务,游戏中捏爆苹果的场所,其它工厂也许就是捏爆榴莲了

请求:工人

每个请求处理特定任务,同类型的工人只捏爆相同大小的苹果

容器:车间

请求自由选择容器,工人自由选择车间

开发者:老板

决定了项目的技术选型,例如请求采用异步还是同步,容器的数量,Worker的数量,线程的数量等

MongoDB:主仓、副仓

集群中的主、重库

Socket:手套、摄像头

连接数,参数maxIdleTime设置一个连接在连接池中保持空闲的最大毫秒数,超时会被删除或者替换,默认值为None(无限制)

连接池:工作台

由参数maxPoolSize和minPoolSize控制连接池最大值和最小值。最大值代表流水线上最多占用手套的数量,最小值代表分配给流水线的最低手套数量,默认为0,即不分配。

Worker:流水线

一个Worker创建一个client,client创建后会与MongoDB服务建立一个Socket连接,如果client使用主重地址,则需要建立两个Socket连接分别与主重库相连;如果在Worker中使用多进程,则每个进程中都需要创建client;对于同步请求,一个Worker只能同时处理一个请求;异步请求则Worker可以同时处理多个请求。对应到游戏中就是流水线是否支持多人同时工作

线程:手

可以同时处理任务,线程数需要控制在合理范围;线程数较大容易造成单请求占用完所有Socket连接;线程池中没有可用Socket则会增加新的Socket连接;如果已经达到maxPoolSize数,则线程会排队;排队的线程可以通过waitQueueMultiple设置单个Socket等待线程的数量,超出最大线程数会抛出ConnectionFailure错误,例如maxPoolSize为100,waitQueueMultiple为10,则流水线可以最多等待1000个线程,第1001个等待线程会报错;参数waitQueueTimeoutMS可以设置等待线程的等待时间,超出等待时间会抛出ConnectionFailure错误

需要注意的是,排队的线程会明确任务,等待超时后相应的任务也会丢失,相当于游戏中排队等待手套的手会通过协议关联一个苹果,如果手超时消失了,苹果也不会被捏爆,整个任务会继续

结语

花两天时间仔细了解了一下Mongo连接数相关的内容。根据自已的理解,转化成一种游戏设定方便记忆。部分细节可能理解的不到位或者不准确,欢迎指教。

飞桨PPDB——深度学习社区