朱鱼鱼的小本本

我好快乐,因为我是小熊软糖,小熊软糖~

1.《人升》是什么?

《人升》是一款融合了游戏化激励元素的待办事项、习惯养成应用,可以当作是简约版的地球OL~

在这里,你完成任务的过程不再枯燥无味,根据任务的轻缓急重,完成任务你可以获得『经验值』、『金币』奖励。 经验值奖励能提高你不同属性的『等级』;你可以使用金币去商店购买设定好的「自我奖励」商品。 达成一定的条件,如达到指定等级、完成任务连续多少天,还有可能解锁『成就』,而从获取更多的奖励。

激励体系图

  通俗来说,《人升》就是一个集合了代办奖励机制的app,与常见的todolist软件相比,《人升》多了奖励的功能,能非常好的辅助我们培养自己的习惯,从一个空有上进心的人变成行动上的巨人;而与常见的习惯培养类app相比,人生基本实现了一个完整的游戏奖励机制,可以让我们更好的针对自己的目标进行个性化的设计,而一个更好的设计,往往也能让我们在自律的路上走的更远。

1.1 游戏《人升》的好处

  游戏成瘾,一直是一个绕不开的社会话题。其实,习惯的养成和成瘾是非常相似的,比如一个人每天6点都去健身,今天6点临时要开会不能去健身,他肯定会感觉到浑身不舒服,这个就是习惯的力量。而如果这个不舒服的程度特别高,比如这个人为了去健身直接旷掉了重要的会议,就可以叫做成瘾了。当然,这种是生理性的成瘾,而如药物、毒品成瘾则一般是生理上的成瘾。

  在游戏中,游戏开发商往往会以各种奖励激发玩家的期待,导致玩家的大脑超时间释放多巴胺,形成生理成瘾。同时通过设置足量正反馈循环让玩家不断地肝游戏,直到形成习惯成瘾。

  游戏会成瘾,其实是因为游戏的设计人员在设计奖励系统和反馈的时候只能照顾到大部分人,让大部分人能合理的在游戏中沉迷、消费。如果游戏按照最差的人来设计奖励系统,就会导致大部分人都对游戏不买账,觉得没意思,最后导致游戏的销量不佳。因此游戏才会导致一些抵抗力很差的人成瘾。

  而在《人升》中,我们每个人可以单独给自己设置奖励系统,因此,我们可以合理的结合自己的实际情况设置正反馈循环,来让我们达到1+1>2的效果。同时,因为是游戏任务设计驱动,网络上有十足的手游、端游的策划设计攻略让我们参考,设计出一套合理、可以长线运营的任务——奖励体系。

2.《人升》攻略

  本文聚焦商品奖励与代办事项体系,对于成就、等级和番茄钟只会讲解思路,我并没有去实践过。

2.1 了解自己的需求,设计体验核心

  搭建数值框架之前需要先确定一个事情,就是游戏框架是怎样的,大致分为哪几个系统,每个系统怎么运作。这个部分就因人而异了。

  比如我对《人升》的期望是:

  1. 记录代办事项,防止忘记一下比较重要的事情
  2. 合理开支,将用在娱乐方面的钱控制在一个范围内,防止冲动消费与过度消费
  3. 培养好习惯(减肥、记账、打扫卫生等)

  同时我并没有使用番茄钟的习惯,等级系统对我的激励效果很差,所以没有去进行等级的设计。成就则是直接融入到了活动体系当中,没有使用《人升》自带的成就系统。因此我的体系设计是:

  • 核心收入体系

    • 宝箱
    • 任务
    • 道具合成
  • 核心消费体系

    • 商店买东西(对应RMB消费)
  • 额外体系

    • 活动
    • 借贷

  有了体系,下一步是给每个体系设计一个玩法定位,同样以我自己的设计为例子:

  • 宝箱(增加随机性,刺激度,类似氪金抽卡游戏,增加用户粘性)
  • 任务 (基本获取金币方法,对于重要任务给予宝箱奖励,增加随机性,产生更大的动力去完成)
  • 道具合成(对于不同的需求,关于价格的差异可能很大,如果给通用货币可能不好把握,而合成素材作为某一需求的专用货币,可以更好的根据需要来派发奖品,例如我希望通过跑步一个月换手机,如果用通用货币发奖励,可能就会被用到别的地方去,同时一个月的期限会导致这个任务的奖励价值偏高且金币通用,会让玩家对别的性价比低的任务丧失完成兴趣)
  • 活动(负责动态调整金币,控制通货膨胀或增发奖励,维持长线运营)
  • 借贷(支持金额为一定的负数,用于没钱购买高价值商品的场景)
  • 商店买东西(对应RMB消费,主要是娱乐属性的物品)

2.2 金币(消费)体系

  由于金币不支持小数,因此推荐10:1人民币,当然你四舍五入下消费1:1也可以,这里的金币只是一个数字,实际上货币的价值取决于其消费力,例如我会将商品直接按照人民币的等值价值来使用,有一个商品就是1RMB,最后根据实际支付价格来购买多少个1RMB就行,当然,你也可以将一些比较重要的东西适当降价,比较不重要的东西适当涨价,来让自己的钱花的更有价值。

  如果你还想希望加入等级,体系的话,这里还应该要有等级的级别设计和对应好处。例如:只有完成运动的任务能获得力量属性的等级,当力量等级达到2级后完成成就获得一个大额奖励;或者是力量的级达到6级之后,解锁奶茶商品,如果没有完成当天运动任务就会扣处任务经验。

2.3 玩法设计

  有了基本的金币(&等级)的概念,我们就可以开始设计玩法了,这里就到了游戏设计中的策划拍脑袋决定环节。

2.3.1 任务

  任务作为核心中的核心体系,我们首先来设计任务。首先是分类任务,每一类代表我能从现实的哪一方面来完成任务,获得奖励,比如我将任务分为了

  • 游戏
  • 运动
  • 卫生健康
  • 控制饮食
  • 生活习惯
  • 自我提升
  • TODO

  这几类。然后根据每类先写出需要完成的任务,比如每周运动5次,每天游戏收菜等等。任务有了之后就要设计任务的奖励了,为了方便统计任务和奖励,我们要借助excel来管理,我的excel模板也会放在后面。奖励大概可分为三类(物品、金币、经验),由于我们这里还没设计物品相关的宝箱和道具合成系统,所以我们就先用金币来衡量。具体为一下几步:

  1. 拍脑袋决定一个最容易任务的奖励,比如运动一天给10金币。
  2. 剩下的任务通过第1步任务难度和奖励的基础,设计出对应的奖励,比如我觉得游戏收菜很简单,是运动一天的难度的1/10,那他的奖励就是1金币。
  3. 完成后我们就会的到一个任务-金币奖励的表格,为了方便统计,我们还需要加入任务周期等列,最终拿到每个任务的每日获取金币和总的每日获取金币。

TIPS

  • 增加每日(周、月)礼包和对应任务,保持日活,培养使用《人升》的习惯。
  • 对于大金额、困难程度高的任务,适当设置随机金币上下波动20%左右,可以有效提升完成的动力。

2.3.2 月度收益与玩法收益占比

  下一步开始设计我们的月度月度收益与玩法收益占比,对我来说月度收入就是每个月拿去随便买自己想买的东西的零花钱,假如说是1500RMB,那也就是说我要把金币的月收入控制在15000金币每个月,也就是300金币每天。所以我们新建一个表格,写上所有的玩法和总月收入,然后根据自己的想法填上比例,有了比例之后,其实每个玩法每天获得的金币就也可以知道了,例如我的比例如图

2.3.3 调整任务收益

  此时我们可能会发现我们刚刚设计的任务的月收入和这里按照玩法占比得到的月收入差的很多,我们可以通过增加任务、修改比例、奖励等方面开始调整了,由于我们已经建立好了表格,改动后直接就会重新计算,因此可以很快很方便的调整。

2.3.4 设计道具合成表

  这部分和设计任务一样,全看自己的需求,我会将合成价格打折,比如一个碎片=0.7RMB,30个碎片能换一个30RMB的月卡,由于我将这0.7会计入到任务的价值中,所以碎片的收益应该是打折的这个0.3RMB部分

2.3.5 设计宝箱表

  同样根据自己的需求来设计,宝箱的价值为期望计算后的平均价值

2.3.6 额外维护RMB账户,防止通货膨胀

  这个只是我的方法,就算你直接定期看下金币的获取量,也能很好的控制金币不会过多。因为我自己本身就会记账,所以在这里额外维护了一个RMB账户,每个月打入1500RMB,当我发现RMB的账户的钱和金币的差值太多时,我就会通过活动来增加消耗或者是多发金币,缩小差值。

活动

  活动的作用是在出现金币不足,但是RMB账户足够钱的时候补足金币,可以通过达成一个大目标来设计活动

  1. 设计一个大目标
  2. 设计大目标完成时间
  3. 拆分成每日小目标
  4. 设计活动总奖励
  5. 按照7比3左右的比例设计大目标比小目标的奖励

  活动也可以用在消耗金币上,例如平时没有完成任务是不扣金币的,某一段时间没完成任务就扣除金币等、

属性等级与成就

  属性与成就可以用于解锁物品购买,物品打折或者额外奖励,具体可以根据自己的需求设计。属性经验值和金币奖励一样,可以用相同的方法来设计。成就奖励比如打卡《人升》100天,也能很好的让你保持习惯。

EXCEL模板下载

下载

参考文章

最近写工具时需要快速执行大量sql,之前因为db操作不是很多,所以底层实现是每次执行sql的时候,都会去新建立一个链接,这次就直接拿来用了,最后发现大概每秒只能执行300-400个的sql(还可以更高,因为只起了10个线程,但是如果线程数太高db可能会拒绝访问),所以想要改用连接池看看速度能有多块,但是换成链接池后,反而速度立马变成了100个sql/秒,当时还以为是连接池的配置不对,但是试了很多次都是这个速度,最后看了pooledDB的代码才知道对于高线程多并发的场景,pooledDB支持度有限。

并发时性能变差的原因

取出db链接时需要加锁测试存活性

首先,为了保证多线程不出问题,在存取链接到池子里面的时候,会对池子加锁。

而为了保证链接的可用性,在连接池取链接(pool.connection())的时候,pooledDB还会用该链接ping一下(ping_check()),来测试是否链接还可用,确认可用后再将链接返回并解锁队列,此时下一个线程才能来队列中拿链接。

因此在高并发的场景下,耗时一堆叠,就会越来越慢。

def connection(self, shareable=True):
self._lock.acquire()
try:
while (self._maxconnections
and self._connections >= self._maxconnections):
self._wait_lock()
con = self._idle_cache.pop(0)
except IndexError:
con = self.steady_connection()
else:
con._ping_check()
con = PooledDedicatedDBConnection(self, con)
self._connections += 1
finally:
self._lock.release()
return con

因此,只要不让db去检查链接存活性就可以大幅提升取连接的速度(可以通过初始化时指定ping=0来避免对连接的可用性进行检查), 减少阻塞时间, 但是同时也会导致可能出现不可用的链接,需要逻辑对这种场景进行兼容。

归还db连接时,会对没关机的链接进行回滚

除了取的时候会有问题,归还的时候,也会对pool的队列进行上锁,然后进行归还,pooledDB有个默认的操作,归还时进行reset,也就是回滚链接。

def cache(self, con):
self._lock.acquire()
...
if not self._maxcached or len(self._idle_cache) < self._maxcached:
con._reset(force=self._reset)
self._idle_cache.append(con)
...
self._lock.release()

def _reset(self, force=False):
if not self._closed and (force or self._transaction):
try:
self.rollback()
except Exception:
pass

如果大量的链接同时归还,也会出现耗时越来越长的问题,最终速度上不去。

对于这个问题,可以在初始化时指定reset=False,避免其强制性回滚。

解决办法

无论是ping=0,还是reset=False,虽然能解决速度问题,但是牺牲了pooledDB为连接带来的健壮性。

因此最好的办法是创建多个链接池。把压力均摊到每个连接池上这样就可以在大量并发的同时,拥有更好的性能。

为什么要配置自动保存图片?

当我们写博客的时候,或多或少需要进行配图,这个时候可以将图片上传图床或者直接
保存到服务器上进行引用,因为免费图床经过长时间的保存后图片可能会被清理,所以这里我选择了把图片直接保存到服务器上。

下载插件

首先,下载vscode的插件 Paste Image

下载完成后,我们可以先实验下,截屏一张图片到剪切板之后,使用ctrl+alt+v进行粘贴。

可以看到,插件自动帮我们生成了md语法的图片链接,同时在当前目录下生成了这个png文件。

但是现在还有一个问题,图片应该要保存到images文件夹中去,因此我们下一步是进行插件的配置。

插件配置

首先,我的项目结构如下。

我想将所有图像保存在blog/source/img,并将图像 url 插入文章。所以图片 url 应该是../images/xxx.png。

blog
-- source
---- _post (存放md文档)
---- images (存放图片)
阅读全文 »