去年没给自己设限,是因为是工作的第一年,还处于变化观望中。今年随着新闻的大量摄入,貌似患上了今天知乎上看到的「政治焦虑症」,看来减少新闻的摄入应该要提上议程。这样就只能参考下前年的总结内容,那个时候我还在学校苦苦支撑,和我豪两个人在冰冷而空荡荡的学校宿舍相依为命。这个时候看来,当时的抉择无疑是正确的,至少我对我的现状是比较满意的。在游戏公司修行了一年半,我大致对我欠缺的东西有了一个印象,也明白了在正确的方向上,只需要时间和坚持:石穿需要水滴,水滴也必然穿石。
大家都喜欢天才,特别是全才,无所不通。而我喜欢的人,用我自己的话来说就是纯粹的人。我的微博关注了一千多人基本上都是这样的人,把他们按内容分组,方便自己去看自己需要的东西。我当然不希望一个擅长某项内容的人去发表自己不擅长内容的方面,术业有专攻,这样的内容会污染了我的微博那个分组的时间线,会让我取关甚至拉黑。成为一个纯粹的人是一个很厉害的事情,至少我是这样觉得的。
在我们现在的环境中我们还是很幸运的,我们有条件和意愿成为这样的人,而不是像其他混乱的社会一样,人人都为了生存而奔波。我相信共产主义的最终形态也是这样,人人取之所需,奉之所擅。当然人变得纯粹是一件在当下很不容易的事情,需要有一个简单而容易满足的心;而纯粹下变得有能力,我们俗人除了用时间来累积以外别无他法,或许一些科学有效的计划能帮助自己提升的稍微快些。这些计划有时候需要自己主动在生活中向前迈步,有的在别人看来是很简单的事情,对自己来说其实是一件很不容易的事情,特别是在某些舒适圈中的我。
我装模作样的研究过睡懒觉的对策,最后我相信,一个人如果真正找到了他人生的意义(哪怕只是短期目标),就不会有睡懒觉的问题。一个人如果知道了自己当下为什么而活,就会珍惜自己的每一分钟,觉得吃饭睡觉都是浪费时间。
我完全废寝忘食的阶段印象中有两次,一次是大一的下半年读了The Nature of Code
,我基本上所有的课都在Mephis旁边玩Processing,搞了几个很炫的效果。一次是大二的暑假,我为了从一个程序小白入门JS,每天在没空调的房间里,用我的新Mac把红宝书的全部代码手打打了一遍。(现在看来学习方式低效,入门的语言也不对,但是对我的阶段提升巨大,可以看到这两个阶段我的博客有巨量产出。),后来不管是Python的学习或者是U3D和DirectX的学习,固然也是沉迷其中,但远没有废寝忘食的地步。这样看来,我大一入学不久买的那台杂牌配置的Mac,对我大学的生涯影响还是很大的。不仅让我习惯于Unix-like的思想和操作,另一方面把我从一些消耗时间的游戏中剥离了出去,因为我当时没有开销再去负担一台相同配置的win,原来那台老联想的破笔记本的游戏体验极差,基本上能做的就是office套餐和看看生放送。
我意识到我需要一定的物质基础,至少是我所攻克方向的全部齐套基础工具,以完善我的思考方式和方法论。
我还需要一把民谣吉他和一把古典吉他,缺一不可,电吉他和效果器并不能替代一切。
收集尽可能多的实体桌游,研究设计思路。改变不了策划,就改变自己吧。
……
这些都是我想的到的东西,因为我的眼界不高所以可能还有很多我没想到的东西,所以我仍然还是处于用锤子敲钉子的状态。当然我相信我拥有的越多,想要的东西也会越多。
有的时候想要做的事情已经列好了,但是无数次都是犹豫不决而无限延后,立刻执行常常需要一个很复杂的理由来说服自己。这可能和我的经历有关。我希望自己能成为一个执行力强的人,也希望自己「制定计划」的能力能够提升。
拖延症是一种节能的行为模式,比如我们饿了会去找吃的,但是如果这个时候因为一些其他的情况肚子就饱了,那我们去找吃的行为意愿就会减弱,不到最后一刻我们就不会去做这件事情。重复的意外行为会强化这种行为模式的神经元。守株待兔的人一次不会饿死,但是如果有五六只兔子自己撞死,那他后来绝对会饿死。但是我们作为智人要改变这种行为模式,事实上教育就是反人性的,快乐教育的失败全世界比比皆是。能够提升自己的途径必然会让身体产生排斥反应,偶尔会想吐之类都是正常的。如果一件事情不是生理需要的话,就不应该有拖延这种行为,理智上我们应该坚决,情感上应该感到自我厌恶。
]]>我做过反抗,但是并不知道结果会不会因此改变丝毫,未来还是一片混沌。
《游戏引擎架构》第一章说明了一个典型的团体结构,即一个游戏工作室(game studio)大致可以分为工程师(engineer),艺术家(artist),游戏设计师(game designer),制作人(producer)以及其他支持人员,每个方向又可以分为许多分支。当我们谈到做游戏时,我们第一印象一般都是设计师或者艺术家,然而大部分情况下我们都是SOP的执行人,所以很多游戏程序员感觉自己做的事情和在大学写的沙比外包并没有什么区别,写多了流水线脑子反应都变慢了。
作为一个程序员,想当然的把SOP(Standard Operation Procedure)作为设计原则。我们愿意花上很长的时间去实现一个框架,然后用一分钟生成出一个需要的作品,哪怕它从此废弃。我们把这种事情看做一种浪漫而不是无聊。因为我们长时间受惠于别人的代码,前人栽树后人乘凉,会这样想也是合乎情理的。但是这个事情一旦来到艺术创作就行不通了,因为SOP不能够产生新的东西。程序员能做的事情就是改进别人的SOP。修正bug是一件比较容易的事情,比创造bug还容易。所以为什么做事情我唯唯诺诺,挑毛病我重拳出击。因此指出一个地方有问题,事实上并不能反应出你了解这个东西,尤其程序员要谨记。
在生物学意义上来说,SOP等于是一个大脑模式,创作一个SOP或者修正一个SOP是要烧录到神经元上的,而执行一个SOP只需要序列化的生理反应即可。一个错误的模式的录入是有生物意义的代价的,守株待兔的人会被饿死,排除错误=细胞代谢也需要时间,所以畏惧突变也是生物自然选择的结果,大家都本能的会当一个复读机。只有在有了能够承受失败的成本以后,并且需要足够的竞争环境下,才会去偏锋走险路。
我思考了我自己的行为模式类似于打本,队里T少打T,奶少打奶。如果大家都去做一件事情的话,我会对这件事情有生理恐惧,本能告诉我要避开竞争,外部表现为极具叛逆,倾向独行。和很多人专注一件事情不同,我尝试过很多不同的事情。以我的程序员生涯来说,大学间到毕业不到2年共写过Server-NodeJS比赛作品,写过App-iOS商用,写过Web-Django商用,写过Unity-Lua商用,写过DistributeServer-C++商用,算不上完整作品的更是数不清。大脑在烧录神经元的时候可能会产生一种令人快感的物质,会情不自禁的喊出「啊,又学到新东西了」,我可能沉迷于这种快感。
我相信不只是我,很多人都属于「超级初学者」,就是所谓的上手快、精通难。因为大脑在学习的陡峭期发现没什么收获的时候,会给很强的负反馈。只有在不断地自我暗示下才能够继续坚持下去,如何欺骗自己的大脑也是门学问。
]]>2^10^ = 1024 = 1K
2^20^ = 1048576 = 1024K = 1M
2^30^ = 1073741824 = 1024M = 1G
2^8^ = 256
2^16^ = 2^8*2^ = 65535
2^32^ = 2^8*4^ = 4294967296 = 4G
2^64^ = 2^8*8^ = ??
我们知道计算机是由2进制来储存信息的,我们把一个2进制数位看成一个灯泡,它要么是亮的状态(1),要么是暗的状态(0),那么我们把这个灯泡叫做「位」,英文用bit(比特)表示。但是位的表达有限,我们用一个更大一点的单位来作为基础单位,那就是字节Byte(拜特)。一个字节就是8位,
【灯泡1-灯泡2-灯泡3-灯泡4-灯泡5-灯泡6-灯泡7-灯泡8】 这样8个一串的灯泡就是一个字节,我们说的什么KB,GB的B就是这个字节Byte。而小区墙上贴的各种广告上说的什么10兆100兆带宽指的是位,比如10Mbps / 8(b/位) = 1.25MBps (1.25M/s)
1个字节能表达多少信息呢?如果换成10进制数就是2^8^=256,就是说一个字节能存下范围为0~255的一个数字。那你可能会问,我为啥要存这样一个数字,我不能存2^4^=32,即0~31的两个数字吗?或者拆成其他的分等来表达行不行?
答案是行,但是又不行。1字节的数字甚至可以表达8个布尔值(bool值的意思就是只能为真或假,就是值只能为1和0),比如一家有8口人,0~255的数字可以完全记录这家人的性别,比如1是男0是女,8个灯泡暗或者灭的所有排列组合,都对应了其中一个数字,倒过来反推也可以,1一个0~255的数字,可以推出这家8口人的性别。
1个字节能表达的数字不大,那他能干什么呢?我们来学习第一个数据格式,叫做char。char是什么意思呢,就是字符的意思。观察一下我们手里的键盘,大小写字母符号乱七八糟加起来有多少?,是不是64个不够,256个又太多?刚好差不多不超过128个?所以一个char就能够表达英语环境中的一个基础字符(0~127)。为什么我这里要强调它的环境呢?因为要输入其他的特殊字符,1个字节就不够了。但对于最初最初的计算机来说,表达一个字符一个char就够了。
我们上面说不行的原因,就是我们用了一个char来表达一个字符,那它作为char的话已经用了一个字节来表达所有的信息,哪怕它只用了一半。(我的意思就是说计算机就是这样的,有一个东西要什么东西你就只能给或者不给,给多了的东西你也没办法拿回来。有的游戏上来就直接申请2G的运行内存,哪怕它其实只是一个扫雷,但是你的电脑就是少了2G可用内存,电脑配置不行的话就卡成弱智,虽然你也不理解为什么,我只是开了一个不能再小的扫雷而已。)
你可能会发现,127不就是刚好少了1位吗,那还有一个灯泡空着不是浪费电吗?这个灯泡其实是有用的。char取值为0-127的时候能代表一个字符,但是一定要记住,char的「本质」上还是一个数字。当我们定义了一个「char」的时候,它的第一位就变成了符号位,后面7位才是数值。所以它代表的数值范围其实是-128~127,共256个数字。
为什么是-128~127呢?这个符号位当它是0的时候,就代表它是一个正数,意思就是我灭了,两眼一闭高高挂起,你们其他几个爱咋咋地,原来是多少就是多少,所以还是原来0~127。当它是1的时候,就是代表它是一个负数,就需要把后面的值加个负号变成-0~-127。-0那就看做最大负值,也就是-128。
如果我们需要表达0~255的值的话,我们需要定义「unsigned char」,unsigned的意思就是无符号,整个意思就是无符号字符,也可以说是无符号字节,因为我们日常中很多数字都是自然数,不会出现负数,那这样我们就不需要符号位了,那unsigned char就能够表达128~255的数字。两个类型能够表达的数字都是256个,是一样的。
我们还有其他的数据格式,整数的有short,int和long long(短整型,整型和长整型)以及对应的无符号类型(unsigned short,unsigned int和unsigned long long),它们分别占了2个,4个和8个字节。你可能会问,为什么没有6个字节的呢?你可以把这些数据想象成大小不一的砖头,把程序看成最后的建筑,1:2:4的砖头肯定比1:2:3的砖头来的号,为什么?因为他们在内存里能够一一「对齐」,内存对齐这个思想贯穿了整个图形学,总的来说会有很多好处,比如效率高,计算快等。
这里有一些等价表达问题,这边可以说下:
short = short int = int16
int = long int = long = int32
long long = long long int = __int64
我们可以简单计算下,short能表示带符号的3万多(2^15^),int能表示带符号的21亿(2^31^),long能表达的数字更大(2^63^),可以理解为42亿个int那么大。在我们列出小数的数据格式之前,我们先提出一个设想。
假设我和你在一起计算机考试,你完全不会里面的内容,但是你知道我的答案肯定是对的,那你要怎么作弊才能确保满分呢?你可以偷偷看我的卷子,然后每一条都抄上答案。但是还有一种更简单的方法,就是直接拍张照片,打印了交上去啦!两个人最后都是满分!
这两种方法有什么区别呢?第一个是值相同,第二个是址相同。什么意思呢,虽然两个方法最后的效果都是一样的,但是第一个卷子是你做的,第二个卷子相等于两张都是我做的。所以你想表达一个和现有值相同的方法,除了先在地上划出一块和原有值相同的大小,然后照模照样的搭房子,还能干脆在地上插一个路标,上面写着「去找他」!这个牌子实际上就是表达了一个地址。这的一个地址,我们叫做指针(pointer)。
那这样一个地址在计算机里怎么表达呢?当然用数字就够了。在我这个世代还接触过32位(×86)的电脑,现在都是64位(×64)了,当然现在要创建一个程序有时候还要确定是32位的还是64位的。我们可能知道64位的电脑可以跑32位的程序,反之就不行。那这个位是啥意思呢?这就是代表了指针的大小。
32位有多大?4个字节,2^32^ = 2^8*4^ = 4294967296,刚好就是4G。换而言之,32位的电脑内存不可能超过4G。在零几年的时候电脑内存还在几百M的时候,4G看起来还是非常遥远的目标,更早的时候甚至更小,以K为单位。这个时候插内存条有用吗,就没用了。就好像你拿着福建的地图到了浙江一样,这块地方你就管不了了。64位的电脑的内存上限就很大了,按上面说的相当于几十亿个4G的内存条,这样在相当长的一段时间内,计算机都不需要再改架构了。
那么所有的指针都是等价的吗?是的,本质上就是一个正整数,无数的指针可以互相随意转换。
它不管是指向一个几百亩的豪华别墅,还是指向一个半米宽乡间厕所,它本身就是一个地址,存的就是相同长度的数字。用刚刚的考试作弊做个例子,如果我们想交换答案,除了互相看卷子重新填写以外,是不是直接交换卷子就可以了?对!这样既简单又符合我们的直觉。那你可能会想到一个问题,如果你想那你的厕所换我的别墅,除了把两边都拆了重建以外,是不是只要交换我们的地址就可以了?我知道这很反直觉,但并不可行。
如果我们直接交换了地址(&),你能拿到的只能是这个别墅的前半平米,可能连大门都还没到,而我拿到的除了这个半米的厕所,还有剩下几百亩的地。这个地上有什么?不知道,可能是一片无垠的荒地,也可能存在别人的房子。计算机会把这部分整个看做是我的别墅,这明显是不合理的,其他的房主会来打我。即使是重建,你也需要重新申请一大块土地。本质上来说,我们拥有的不是同一个东西(类)。
但是!如果我们房子不是买的,是租的,我们拥有的只是两个房子的带住址的名片(指针),那我们直接交换行不行?OK!我们交换了名片以后以后你只要告诉计算机,我拿到的已经不是厕所了,是一个大别墅!这样计算机就会用大别墅的方式去解析你的地址,这样你就住进了大别墅!
假如你要拆房子,那又该怎么做?第一,把你的地址交给施工队,施工队按照你的房子说明的大小铲平了这块地,然后你应该把你的这个地址撕掉,因为它不再有用了。无用的数据残留在内存中没有及时释放,他们管这叫做内存泄漏,说白了就是钉子户。
]]>前天周六有一件很有意思的事情,在琴房练习古典的时候,突然隔壁小教室突然传来电吉他的轰鸣声。我寻思两个月前我在练电吉他的时候也没有效果器和音箱,都是基本无声练习,跑到教室一问才知道这设备也就是前几天老师从福建搬来的。我以为教室里的那俩新面孔的小哥哥都是大佬,没想到也是萌二,一看就知道基本上之前没怎么接触过拨弦乐器。在老师各种的各种展示下各种痴迷,一个小哥哥支支吾吾问了个深入灵魂的问题:我要怎么练才能到这个水平(指老师)。
听到这个问题我一时间屏住了呼吸,我在进入琴行正式学习吉他之前也算是有点基础(当然这个基础在老师看来可能基本等于没有),然后到现在为止基本上每天都会固定练习至少2小时以上,然而到现在仍然节奏不稳,16分音符稳吃不下来,推揉弦动作无意识变形,哪怕是小练习曲在没热身的情况下很难完整的弹下来,节拍器一上就乱七八糟……后面按着老师的指示和自己的意愿从电吉他->指弹->古典,发现苦练基础对自己的收益其实是最大的。老师听了也顿了一下,然后好像说了每天苦练需要两三年吧(我估计小哥哥对这个时间完全没概念),我现在对这个时间是信服的,不过确实存在针对个人的最佳实践,找到有效的方法就可能不需要这么久。以前的我肯定会表示得意的不屑,觉得又有一个憧憬的少年要被劝退了,现在我不会这么想,现在我满脑子都是科学学习,把有限的生命投入到无限的学习中去(雾)。
在我短暂的乐谱学习生涯中,有一点收获很重要,那就是「没有什么目标是完不成的,只是你目标分的不够细」。比如完整而有感情的弹唱一首歌很难,但是纯弹奏呢?做不到的话,不那么吃节拍呢?还是做不到的话,只弹第一小节呢?把目标原子化,总是会有一个基础的反复练习可以执行。当然这个与其说是考验你的执行能力,不如说是考验你的规划能力。因为很多人在规划目标的时候,会定出一个大而泛的目标,这样在执行完成以后,反而会让人迷茫而放弃。
就我的个人经验而言,单线马拉松式的学习路线远不如同时多线路径朝向最终目标。克服困难是一件很了不起的事情,但是带来的挫折感和成就感远不成正比。我只是一个生命有限凡人,不会浪费太多时间在自己不擅长的地方,遇到类似的困难我会马上放弃,转向主任务的另一个「子任务」,就好比吃煮鸡蛋的时候我会在桌上滚一圈,把每个面上都滚碎了,鸡蛋就好剥了。所谓的「子任务」是永远存在的,需要你的思考来创造,就好像上山没路的话就想办法开出另一条路,只是程度的不同罢了。
所谓的成就感就是反馈,这也是人类反射的重要部分。一个目标中好的反馈很大程度上决定了你做这件事情的动力,除了这件事情本身完成的反馈以外,还有一部分是可以人为设计的,很多游戏的策划就是这么思考的。比如让熊孩子倒垃圾,那么就可以看做一个任务:
主线任务:倒垃圾(0/1)
熊孩子表示不开心,这个很明显反馈不足,我们需要改进。
主线任务:
倒垃圾(0/1)
奖励:
RMB(5)
这个是我们的传统的奖励模式,但是不够有趣,我们再改一改,甚至加几个完全无意义的支线任务和成就。
主线任务:
指定的地点倒垃圾(0/1)(剩余时间 10:00)
支线任务:
5秒内喝掉一杯水(0/1)
做3个俯卧撑(0/3)
成就:
瞒天过海(全称不被任何家庭成员发现)
圣诞老人(把垃圾放到三个以上的回收处,分类也算)
梦游者(以睡觉姿势开始和结束)
修改后我们可以看到,即时没有了物质上的奖励,一个简单的目标也变得富有挑战性和可行性。同时设定一个明确告知玩家不容易完成的挑战,让玩家习惯于部分失败也能够接受的程度,否则玩家容易纠结于完美主义的情节从而放弃未来的目标。
也许看到这里你也会蠢蠢欲试,在按照我总结的这些原则下,说不定也会制定出一些不错的目标。
第一个就是定目标的时候不能全部等阶,好像是健身房每块肌肉的训练目标。至少要保持一个简单的任务,简单到呼吸就能完成的程度,可以随着个人慢慢的调整。这个原则的大意就是「只要你有做这个事件的意愿了,它的进度就不是0%」。
第二个就是目标不能太简单,否则容易感到困惑,怀疑这个目标存在的意义。至少保持一个挑战性的任务,困难到尽全力都完不成的地步,如果完成了,下次就再提高一些。这个原则的大意是「学会接受不完美主义,保持时间合理规划」。
第三个就是定目标的时候不要太功利,仿佛每个任务都会有它的存在意义。可以指定几个在完成主支线任务的时候顺便可以完成的事情,因为有些大脑习惯于同时做几件事,「给一些无关而简单事情同时也会促使任务的进行」。也可以指定几个无关甚至搞笑甚至专门偷懒的任务,困难或者简单都可以,需要消耗的时间需要长一些,「给大脑一些用于思考的间隔」。
为了定一个好的目标花上几天也是值得的。
定目标甚至可以给你思考做这件事情的意义,有的人想法天马行空,然而只有用笔具体写下来才具有可行性。
除了上述的分支任务和成就任务(选做类型),常见的还有挑战任务(挑战类型)。比如就是健身房,比如50%引体向上要做20个,然后我们做不到/做多了,都会纠结在这里。这里可以设定几个的阶段的奖励。比如做10个是1颗星,做20个2颗星,做30个是3颗星,用标准姿势做20个能额外获得一个白星。而目标是在一系列的健身运动中获得20颗星,这样就不会太纠结于局部的目标。白星可以用来做额外奖励,哪怕没奖励,我们也会下意识的去做,这就是目标的力量。
我们可以设定一些失败任务,比如刷10小时的微博(0/600),把它加到你的任务列表里,它会立刻变得特别刺眼。当然为了变得更加有趣甚至挑战,可以设定的更加细节一些。失败难度要适中,基本上体现做事情的意愿即可。
我是一个不擅长和人相处的人,但是如果有人愿意和你一起相互监督和竞赛,那么你可能会有额外的动力。考虑到人与人之间的不同,你们可能需要先做几个小测试来测量自己的能力,然后相互制定同等程度目标来保持相对的公平性。
这些小测试可以额外了解到这些内容:有强迫症的人,目标可以定的困难一些;有拖延症的人,目标可以定的简单一些。这些可以根据测试结果转换为具体的参数,对目标进行些许的调整。
最终的目标是让「完成的程度」和「做任务的意愿」基本呈现正相关。根据完成的情况和意愿对目标进行些许调整,待等任务条款稳定后就可以套出一个基本的模板,如果这个社群足够活跃,那部分任务可以共享(需要带个人参数),当然是再好不过了。
短期目标任务生成器,模板大概如下:
主线任务:
主线任务(0/1)(剩余时间 0:29:59)
支线任务:
简单任务(0/e)
挑战任务(0/h)
失败任务(0/f)
成就:
成就1(主任务完成时顺便能够完成的挑战)
成就2(耗时类的无关任务)
成就3(搞笑类的无关任务)
长期目标由若干个短期目标构成,一个短期目标开始执行就到成功或者失败为止,否则不启动。要尽量避免制定长期的线性目标,低效而复杂。
主线任务:
至少完成下面n个目标(0/n)
支线任务:
不让下面m个目标失败(0/m)
挑战:
无失败任务
全成就
为了更加的有趣而挑战,我们可以定时启动随机一个子目标,同时做的事情越多,大脑会变得相对高效。
本质上我们作为人类,就是在玩一个叫做「地球Online」的游戏,互动必然是不可少的。虽然我是一个比较害羞的人,但是你愿意监督我,我是欢迎的(逃),如果我当前有正在进行的任务,我会告知与你。
希望每个人都能成为自己想要的样子~
]]>这是现在我们项目开始重视的部分了。随着策划大佬的版本计划的发布,程序可以提前思考规划新功能和原有功能的关联度,最好能够做到能动态关闭和打开新功能,以避免外网随时可能出现的bug。同时开新服的时候可以做到版本控制,否则代码耦合较高的话后面会比较困难,这个事情越早做越好。如果是小作坊的话确实需要一个服务器的架构师或者是相关经验者,这个很重要。
游戏服务器有个重要的特点是与其他互联网业务不同,【在线】的状态特别多,即成千上万的用户数据需要保持在内存中,DB可能需要额外的一到两层缓存来确保数据的安全。用精确(是精确,不只是正确)的数据结构可以节约流量,这个到后面带来的影响是巨大的。比如不超过255用byte(unsigned char),3万内用short,21亿内用int。但是也要避免埋坑,比如用int来表时间戳的话,2^31-1换算成秒的时间戳刚好是北京时间的2038-01-19 11:14:07。虽然我们的游戏活不到那个时候,而且游戏的自然逻辑也不可能出现超过这个的时间,但是上次我们的GM客服在永封玩家的时候设置了一个超过这个格式的时间,然后服务器恰好那个逻辑没容错,就崩了。。(可以预见的是快到这个时间的时候会有一大批外包的网站和App挂掉)。一个char是2byte,一个int64才8byte,所以有时候该用还是得用。
游戏设计上把玩家基本上当做是混沌的,人性上是自私和贪婪的。游戏的出了bug,如果是属于玩家损害的bug,那什么论坛什么贴吧各种群喷成狗;如果是玩家收益的bug,玩家就两眼一闭当做没看见,有时还各种私下交流和利益交换,这个bug甚至到最后都无法被开发者所探知。就像服务器出bug的严重度远远高于客户端出bug的严重度一样,对公司的造成的损失远远大于对玩家造成的损失,而且同时玩家是很容易满足的,一般适量的补偿就能平息玩家的怒火。所以对于各位社畜来说,不管是出于保命还是出于代码质量,设计上请偏向对玩家不利吧:充值永远是先扣款再给游戏币,购买物品永远是先扣币再给道具,兑换永远是先删除道具再添加道具。其实不仅是系统服务器,逻辑服务器也是应该这样。
事实上每个游戏哪怕是照搬某个哪怕是现有的游戏架构,具体到某个服务器设计细节的时候还是会有差异。世界服,比赛服,匹配服,好友服,DB服等等这些架构并不是一开始就是规划出这样的,一般考虑到每个功能服务器的承载量,功能服不宜太多,太多的话要考虑某个服宕掉后其他连接的服的正常运转,数量越多防错复杂就越高;也不宜太少,某个服功能太过耦合需要考虑把部分功能单独迁出去或者独立成一个服。举两个例子,我们的服一开始房间服和匹配服是同一个功能,后来我们出现了队伍匹配,那么房间和匹配功能就不再相关,于是房间服就从匹配服中单独提出来;我们的城镇服算是一个比较重要的逻辑服,但是它又同时作为其他重要服的中转服,这么设计出于安全不太合适,于是单独设立了一个基本上只用于协议中转的透传服,在一些玩家跨服的功能上就不在依赖城镇服。
在公司内部的分享会上有说,其实一些通用的服完全可以交给运维去做,比如聊天服,好友服和比赛日志服,另外我们的好友功能基本上不是独立功能,要依赖于公司的平台,这样能方便公司的平台账号部门管理运营。当然这个部分并不是我们社畜所需要考虑的,有当然是极好的,没有也无所谓。
并不是所有情况下都能热更代码的,特别是服务器热更,更一次用户掉百分之几,被产品姐姐们说的抬不起头来。一些代码还没有办法热更,比如数据库字段的添加(需要重启缓存)和策划表的热更(涉及到C#代码的苹果审核)。所以我们适时可以预留个备用的整型字段或者用一个不是太长的字符串来放杂项,这样新功能就不会再受到大版本的限制了。
很多时候策划给你什么你就去写什么,有的时候感觉是不对的但是还是硬着头皮写了,这明显是不对的。有些可有可无或者有争议的地方,该说就得说,因为这东西放出去最后会一直被玩家喷,然后客服各种收到玩家的熟悉的建议,最后还是得改,还不如一开始就改。同时记得冰山原则,策划给到程序的哪怕是一个很简单的想法,程序给到策划完成的功能,也大概率是把每种方案都实现了让策划去选、去调。所以玩家玩到的东西也是策划思考的可能1/5,然后策划思考的东西也可能只有程序的1/3,程序得缝缝补补把策划方案的遗漏全部补起来,然后「尽可能给上策划足够的自由度」,能够让策划动态配的东西全部加到表里去,这样对他也好,对你也好。
我自己,一年半的分布式服务器开发者和写了半年的U3D客户端(重合), C++ Lua NodeJS
]]>有人说游戏是第九艺术,与文学、音乐、建筑、戏剧、电影、雕塑、舞蹈、绘画并列。艺术是什么?下面是wiki关于艺术的说明:
艺术(拉丁語:Ars;法語、英语:Art;西班牙語、葡萄牙語:Arte;德語:Kunst)指憑藉技巧、意願、想象力、經驗等綜合人為因素的融合與平衡,以創作隱含美學的器物、環境、影像、動作或聲音的表達模式,也指和他人分享美的感覺或有深意的情感與意識的人類用以表達既有感知且將個人或群體體驗沉澱與展現的過程[1]。所有的人類文化都有某種形式的藝術和音樂,藝術表達是普世文化通則之一。
八大艺术的定义已经无从可考,但是根据我之前对游戏的定义,就会发现艺术的定义其实是类似的。根据大脑的模式驱动(pattern-driven)理论(模式驱动理论大概就是说我们的大脑所有的行为模式是序列化的,有意识的思考做事情的效率很低),我可以下一个基础的结论:艺术能够让普众学习到一些行为模式的隐含美学的作品, —by xana
然而在国内资本和市场决定游戏内容的感觉很糟糕。国内游戏完完全全变成了利用人性弱点诱导提供财物的电子工具,而不是触动人性柔软部分的艺术品。1954年,马斯洛在《激励与个性》一书中探讨了他早期著作中提及的另外两种需要:求知需要和审美需要。这两种需要未被列入到他的需求层次排列中,他认为这二者应居于尊敬需要与自我实现需要之间。从古至今,艺术从服务于神学权贵,到服务于资本,再到服务于大众,和受众的经济能力和需求层次变化影响。因此艺术品成为商品,在资本主义环境下显得而外突出。在资本大环境下,不依赖资本的艺术很难存活。纯粹的创作行为早已不存在,或者说需要的创作成本变得异常高昂。创作者除了所需的能力之外,必须熟知相关的法律和法规,提前封堵上所有可能的漏洞,否则任何外部的庞大资本的洪水从任何一个缝隙中冲进来,会把你冲刷的一干二净,而且最后什么都不留给你。包括大环境的不友好,以游戏行业为例,不管你的游戏做的多好,申请一个版号都要缴纳一万人民币,这对独立开发者来说无疑是一比难以接受的开销,更别说更别说潜规则下的花费了,比如广告和渠道买量。更别说猖獗的盗版和维权的问题。
小厂最重要的是活下去,但面对大厂已经形成了固定的产品流水线,把各个市面上成功的游戏进行定向分解,然后进行排列组合,反正流水线产品经受得起市场淘汰,而小厂经不起这种成本的压力。我曾经认为国内环境不好的游戏的原因是市场的限制,只要开放市场,游戏数量够多,玩家就会有向选择,渣游戏就会变少。自从了解现代资本经济以后,我的看法变了,明白根本不是这么回事,仅靠市场所谓的看不见的手,是不可能到达供给平衡状态的,市场永远存在垄断和倾销行为,这些垃圾游戏你哪怕国内不做,丹麦等游戏大国在越南的廉价分厂分分钟完全取代你的手游市场。版号的限制恰恰保护了这些小厂,延缓与大厂直接差距。游戏行业需要进行产业升级,这需要时间和技术的积累,不是几年,可能是十几年的努力。(我总有一种感觉,游戏开发技术不会单独突破,可能首先在其他方面的突破,比如医学或者军事。)
(待更)
模式驱动理论可以参考我之前《Theory of Fun for Game Design》写的书评,大概就是说我们的大脑所有的行为模式是序列化的,有意识的思考做事情的效率很低,于是我们把一些固定的行为模式直接烧录在大脑的神经元上,于是我们可以下意识的完成一些固定流程的事情,基本的比如我们可以无思考的进食,穿衣等,通过学习后比较高级的行为可以无意识地通过红绿灯的马路,甚至无意识地开车。做梦实质是大脑自行的模式训练(chunking),是训练面对未知情况下身体的本能反应。模型能够进行类推,在熟练一种乐器后我们仅通过脑内演练就可以完全入门另一种原理相似的乐器,体育项目也是如此,甚至只凭着脑内练习就可以初步改变身体的健康状态……这本书结论之一就是,一个能吸引人的游戏必定是能让玩家不断的、层层递进的学习到一些行为模式,这会让玩家大脑最大程度的分泌愉悦感。根据模式驱动理论,我们可以解释一些日常比较玄学的概念(只考虑大脑行为),比如(婴儿的)本能(人类出厂附带的行为模式),思考和做梦(行为模式生成),联想(基于其他行为模式生成行为模式,大脑最擅长填补空白部分),梦游(行为模式支撑的现象),聪明(掌握了大量的行为模式),天才(易于掌握或深化行为模式,或许也是基于一种行为模式),遗忘(行为模型所属神经元代谢),健忘(代谢变快),习惯(行为模式群),本性难移(行为模式深化,占据了大量神经元),拖延(一种特定的行为模式,处理中的事件被意外解决时会加深)。这个模式也适用与人类AI的学习方法,但是AI的本身处理信息速度足够快,是否需要学习模式储存为函数也是一个问题。
博文
【闲聊】写给和我一样在游戏行业迷茫的人
【读书】《Theory of Fun for Game Design》
【闲聊】创作与创作欲
其他
https://www.zhihu.com/question/68007718/answer/263480501
https://indienova.com/u/1000water/blogread/10961
'; } text += ' |
PC即Perfect Clean
,即消除屏幕内的所有单元格,是Tetris游戏中的一种特殊攻击方式。PC一旦完成,会给对手短时间大量的(整齐的)垃圾行。PC开局对C4W开和DT开(这种需要一定时间的开局)优势,对BT开和信天翁开(TSpin开局)劣势,因为没有对手快而会PC失败。
在7-pack系统下因为开局7个方块固定,最少需要4行(40格,10个方块)进行PC,剩余12个空格放接下来的3个方块完成全消。PC之后再使用定式就比较困难了。
因此在开局能够使用PC定式,定式容错率高且简单。
PC开局理论上能够分为两部分,TZS
部分和OIJL
部分。
TZS
部分唯一的顺序要求就是T不能在最后,T如果不在最前的话可以根据Z和S的顺序顺势构成定式1或者定式R。(TZS
平滑一侧贴在OIJL
一侧也可)
OIJL
部分的要求只有前两个的顺序不能是O-I,所以只有开局是[S-Z-O-I]或者[Z-S-O-I]这种极限情况下才无法完成定式。然而这种情况下仍有机会PC(定式1-S或定式R-Z)。
我们从定式1的变化情况开始讨论,看定式1对第一个方块的兼容性。很明显,定式1下对开始的7个方块都是兼容的(首行),又因为第三个方块要求PC,因此变式2很容易得出,第二个方块必须构造出以下局部形状(首列):
通过观察定式1可得出结论:
* 定式1-T: T[IO] T[SZ] T[JL] (1-T(Z): T[IL] T[JS] 1-T(S): T[JI] TJS Other: 1-TIS) T开局的收益非常高,但前两个方块出现T方快也不能无脑做1-T,再有IL/JS或IJ/JS的时候得转向1-T(Z)或1-T(S)
* 定式1-I: I[TJ] ITL ITO IOJ IZL ISJ 因为I是横向消除不影响结构,所以把I放到公式最后也成立。但是正是由于带I公式常带着消行操作,所以1-I公式往往都是固定公式。
* 定式1-O: O[JI] OJT * 定式1-S: S[JI] * 定式1-Z: Z[IL] Z[JS] (T[IL] T[JS]) 后续出现的固定顺序可做。
* 定式1-L: L[TI] * 定式1-J: J[TI] 这3个公式有着很高的重复度,很明显4个方块中如果含IT方块和一个JL其中一个方块,那大概率就是走这三个公式之一。
定式R与定式1取相反的方块即可。(在TOP上一开始无法看到第7个之后的方块,因此理论上开局去刻意构造定式1或定式R并没有任何的用处,除非给的方块够给力能完全先构造出`OIJL`)
* 除了1-Z[JS]和R-S[JZ] 外,PC公式必定带有一个I或者一个T,换言之,前四个方块中不存在I或者T,基本PC无望,且IT越靠后越困难,T基本不可能作为结尾。
* 定式1-T能PC的概率为 18/30 = 60% 定式1-Z能PC的概率为 12/30 = 40% 因此T开局的综合PC概率为 1-(0.4*0.6) = 76%(↓) (这里的概率都是含hold操作的情况) (后附:这里的全部的概率计算有问题,hold机制比较复杂,仅供大致参考)
* 定式1-I的PC概率为也很高,没啥规律,观察下序列即可。 其余定式概率均不足30%,尽量不做
* 定式1公式同时出现I和T,基本能认定PC(其余5个中取2个只要不为Z和S,90%)
* [ITL]仅有ILT不能PC,[ITJ]全部OK,基本认定PC。(稳定PC可以先下J或L)
* [ITO]达成的序列中,T在O之前,必定PC。
当然这是一种讨论的方式,不过比较繁琐和不直观(比如遗漏定式1-T的另一种方式从而遗漏[TI]S),我们可以换一种思路来思考。
我们可以清楚的看到方块或者PC定式剩余空间必定处于+2或者+0的状态。
因此我们可以得出要完成PC,必须维持奇偶方块的平衡,能够改变空间奇偶性的操作有以下几个:
使用T方块
消单行时维持上部空间为奇数格
因为PC定式1的奇偶性,所以最终需要1次或者3次的改变奇偶性的操作。因为3个方块要求消除4行,所以必定有一个方块至少消除两行,所以最多两个方块消除单行。即操作1能有1次,操作2最多有2次。
所以使用T方块时,必须有两次单行反转的操作,或者不能有反转的操作,不使用T方块时,需要有一次单行反转的操作。
因此定式1有下列PC公式:
此外PC开局如果I方块在最后的话,还会有额外的PC方式,即定式I(IR),I方块的放置方式不同,最后生成的定式I奇偶性也不同
同理得定式I-1有下列PC公式:
定式I-2有下列PC公式:
通过观察定式I可得出结论:
* 定式1-L: L[TI] * 定式I-1-L: L[ZI] LIO LTJ L[ZT] L[ST] LOS * 定式I-2-L: L[IT] LTO LST LTZ
* 定式1-S: S[JI] * 定式I-2-S: SOJ SJT STO STL SZL * 定式I-1-S: PC不能
定式I-1-L的开局PC率远高于定式1-L(定式IR-1-J >> 定式R-J) 定式I-2-S的开局PC率远高于定式1-S(定式IR-2-J>> 定式R-Z) 因此在定式1开局I结尾可选的情况下,接下的的方块中L开头考虑I速降,S开头考虑ISpin。
我在每个定式后面都放置了一个练习的小函数,理论学习了还是需要熟能生巧最重要。(出现概率-定式1:定式I:定式R:定式IR = 5:2:5:2)
「不是生活所迫,谁愿意恰烂钱呢」
最近游戏行业出了一件事情,就是「行业领军」米忽悠的新游戏「原神」和塞尔达因为相似度上了话题。我的第一反应是米忽悠不可能做这种事,好歹是个有良心的公司,不会这样自我堕落(划不来)。后面越看越不对劲,后面连「借鉴」都开始毫不掩饰,甚至还有说崩坏3是直接解包猎天使魔女的动作的,不然不可能达到这样像素级别的复刻。要知道新做一个动作比一帧帧解包要容易的多,我开始觉得这种事情在国内完全有可能发生。无论结果如何,对米忽悠是失望的。明明有一个好IP为什么不推广,要去拿别人的东西呢?你做的再好也不可能超过原作。这样看来鹰角网络反而显得特别良心,这并不是夸鹰角网络,矮子里拔高个罢了。
国内环境甚至影响到了国外,连暴雪和V社都开始在国内恰烂钱了,且不论是否是粪作,这种资本和市场决定游戏内容的感觉很糟糕。国内游戏完完全全变成了利用人性弱点诱导提供财物的电子工具,而不是触动人性柔软部分的艺术品。现实过于残酷,使我迷失在新手村的Y字路口。
有没有办法改善这种情况呢,有。不管你说是游戏公司被股东(和精神股东)绑架也好,还是国内开发者的素质不够也好,有一点是肯定能改善的,就是开放游戏市场。只有在菜足够多的情况下,食客才会变得挑剔,而不是饥不择食的端上什么东西看都不看就吃。在深究原因到了国家政策层面上戛然而止,涉及到了文化管制,因此这是一个无解的话题。
TG在其他方面一直做的很不错,但是多年的经验告诉我不要因此全盘肯定一个人,毫无疑问TG在有些地方就是做的傻逼,完全不懂实际情况,下面的人各种耍小聪明蒙混过关,上面的人还看着虚假的业绩沾沾自喜。TG曾经要求银行超低利息向中小企业用放贷,简直就是把银行推上绝路,因为小企业的生命周期一般只有几年风险太大,银行迫不得已给平时关系好的企业合作,把一定金额借给他们买基金之类,最后的结果是银行应付了政策,企业白嫖了一波基金,负责人拿到了满意的政绩。所有数字看起来都没问题,但社会因此发展了吗?
最近国内一帮大厂拉上小厂(估计没有我司)给上面写东西,建议实行游戏分级,我个人的估计是倾向悲观,分级等于放权,放权导致腐败,TG肯定觉得不如把权掌握在自己手中。说到游戏分级我就想到了电影分级,乃至一般情况下的视频分级。我觉得TG是真的太敏感了,这种分级下的18+,一般也不会涉政,不会有极端暴力的内容,放到现在来看也基本是完全健康的内容,大概最多也就是《进击的巨人》这种级别,往上的可以禁止(和现在一样),再往上的估计日本深夜电视也不允许播吧。分级制度和禁止制度完全可以共存,一步步来嘛,可以分领域,分类别慢慢实行,你们不是最懂这一套吗。政策上我反对任何一刀切的内容,哪怕你说不行,也得试点然后让我死个明白。
适当的文化自信有助于创作者们灵感迸发。在国内,无论哪个文化领域,最热的东西肯定就是在政策边游走的内容,比如不是很火直播主最热的内容肯定就是在ban和没ban的边缘游走。这种提心吊胆的氛围无助于提高整体质量,反而压抑人性的时间如果太久反而容易导致各种社会问题。
两年前也写过一篇关于创作的文章,国内的创作者环境到现在为止都没有改善,甚至有的发表作品都需要塞钱来换取基本的入口流量。中国社会各种文化被其他文化入侵不是没有原因的,不是外国的月亮圆,是真的吃不下去翔啊。小鲜肉填补了我国三级片市场的空白,流量决定明星而不是明星决定流量。国外资本主义已经玩烂的一套在我国风生水起,很大程度上你可以通过观察国外的历史发展来观测我国社会走向,我国的审美开始变得畸形,自己的行为导致了这种审美,然后又放一个喉舌来抨击这种审美,让人感觉莫名其妙,精神分裂。
这部分是题外话。我国的很多智库的思考方式还是西方那一套,包括普通民众如我也是如此,有些理论基本都是常识性错误,比如经典的经济理论「过剩产能」就是个伪命题,只有「劣质产能」和「优质产能」之分,美国的产能都不知道「过剩」到什么地步去了,一样席卷全球市场。因此如果按照西方那套理论我国从制造业转向服务业,经济TM早就崩到十万八千里了(扩展阅读:韩国经济现状)。很多东西需要重新思考,当你引用一个学术观点时,实际上很有可能是错误的,思考问题时一定要基于实际进行深究,比如「民主」「自由」基于生产产品的分配方式,在经济层面上就完全是对立面,政治上分别衍生出集体主义(共产主义)和资本主义,把「民主」「自由」放在一起说完全是不对的,至少从学术上是完全不符合实际的,也就你喊着爽而已。不愿意思考本质的人是最悲哀的人,连自己迷信的的东西都不愿意深究本质。关于这部分内容我有空单独写一部分我思考的内容,关于过于迷信西方理论的东方人。
]]>C4W在puyopuyo等平台就是无敌的存在
Len
(连击)作为俄罗斯方块三大攻击手段之一(其他两个是Tetris
和T-Spin
),C4W能够达到相对于其他较少width数的连击地形达到最大的连击数,和构造地形需要最少的方块数。因为是4-width的长度,所以必须确保每一个方块都能够消除掉一行。有些方块游戏的结束判定是生成方块的位置有没有方块单元存在,所以有的玩家特地这么摆,把中间生成方块的4格留出来,哪怕低端被顶到最上方都死不了,相当于白嫖一个屏幕。这就相当于两个人打架,我平白无故比你多了一条血,难怪有的人看到C4W就开始毒骂。目前为止能够对抗熟练的C4Wer的方法只有两个,一个是通过开局超快速度的连续T-Spin
降低对面高度,另一个就是加入他们。。
附TOP平台上Len
恐怖的攻击能力:
连击数 | 垃圾行数 | 总数 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 0 |
2 | 1 | 1 |
3 | 1 | 2 |
4 | 2 | 4 |
5 | 2 | 6 |
6 | 3 | 9 |
7 | 3 | 12 |
8 | 4 | 16 |
9 | 4 | 20 |
10 | 5 | 25 |
相较于C3W和C2W,C4W对玩家的地形理解要求不低,下面统计了所有能够连击的C4W地形(部分地形不是最优解故不列出,手动计算,有错误请告诉我)
完全随机方块下连续出现相同方块的概率为1/7,而7-bag系统连续出现两个相同方块的概率为1/49,而且可以通过hold操作来进一步降低,在可以hold的情况下出现三个相同方块的概率简直微乎其微。另外不是每个方块都是渣方块,谁不希望同时持有三个I方块呢。下列是计算在不同有效方块数下,随机两块不同方块情况的消除概率。
为了归类方便,本文把能够容纳n种不同方块的地形简称为有效方块n的地形,或简称有效n。
有效n地形(总数) | 两块方块都不能消除的情况(7-n)*(6-n) | 消除率(42) | 不含I方块时的消除率(30) |
---|---|---|---|
6(3种) | 0 | 1.000 | 1.000 |
5(1种) | 2 | 0.952 | 0.933 |
4(2种) | 6 | 0.857 | 0.800 |
3(5种) | 12 | 0.714 | 0.600 |
2(1种) | 20 | 0.524 | 0.333 |
因此我们基本可以说,有效6的是比较好的形状,在做连的时候尽量往这3种形状上靠;有效5地形也不错断连率极低;有效4就有一种微妙的感觉,观感上7个方块里有3个方块是渣方块,同时持有两个就GG,这个概率感觉很高,然而从计算概率上看其实并不高。因此做出有效4的形状时要尽快回到高有效的形状来。有效3是非常糟糕的情况,而且大概率情况下会走向另一个有效3,出现3的时候要么就是被系统安排了,要么就是玩家一时间脑抽了,就听天由命吧。有效2是一个非常特殊的Spin形状,它唯一的走向是有效5,做2是一个为了放下一个Z(或S)而刻意的行为,在下面的结论中,这种地形几乎算是能做而必做的。
有效3和有效4是常见的导致断连的形状。总体来说,有效方块数和当前形状能容纳的方块空间大小有关,当出现方块隔离和不连续的情况都会降低残骸容纳方块数。
上面的计算是对残骸的研究,然而就像人见人爱的I方块一样,其他方块对C4W的相性如何呢。下列是计算在不同有效方块数下,方块情况对残骸的适应情况。为保持观感一致,继续使用有效方块(n)作为纵坐标。
有效方块(n) | O(5) | T(7) | I(12) | S(4) | Z(5) | J(9) | L(6) |
---|---|---|---|---|---|---|---|
6(3种) | 3 | 3 | 3 | 2 | 2 | 2 | 3 |
5(1种) | 0 | 1 | 1 | 0 | 1 | 1 | 1 |
4(2种) | 1 | 2 | 2 | 0 | 2 | 1 | 0 |
3(5种) | 1 | 1 | 5 | 0 | 1 | 5 | 2 |
2(1种) | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
I无疑是质量最高的方块,I方块因为平放是它的唯一放法(可证),所以也无法影响残骸形状。T方块不仅仅因为它的高消除率,也因为它对地形影响的多样性,使得无论如何下面的方块都能够很舒服的放下,然而面对有效3这类分隔地形显得有些无力。
JL方块和也有着相当高的消除率,而且对有效3地形几乎是唯一的选项,有效3地形的不连续性使得它必须需要一个维度连续的方块才能消除(JLI)。JL放法基本也是唯一的,非插入操作的情况下,有一边必须贴墙从而制造较大的空间,因此JL也不容易制造Spin地形。
O方块是比较挑剔的方块,基本适应所有高消地形,基本不适应所有低消地形,是所谓的有效3杀手。有意思的一点是,方块会把高消地形变成中消地形,也会把低消地形变成中消地形。因此低消地形能用O方块时要优先考虑O方块,高消地形用O方块时要慎重。
ZS方块的消除情况和O方块类似,面对低消地形完全无力,除了Spin有着比较高的收益外,对地形的破坏力相当之高。Z和S对同一个高消地形的能力又完全相反。要么适用Z,要么适用S,要么全不适用,没有一个地形是两个都友好的。
所以我可以得出大概的结论是在IJLT是好方块,OZS的渣方块。一个基本原则是,渣方块能出手要尽量早出手,否则渣方块堆积时会是一个灾难。
最后祝大家TOP水平精进~
]]>不知不觉17楼又来了一批学生来参观,最近看到的第二批还是第三批了,这个时间算下来就算是大四毕业设计估计也过去几个月了吧。
在公司也待了已经整整一年了吧,刚入职的时候阴差阳错开始写C++服务器。其实我是很乐意写完全不符我现有知识结构的东西的,只要不是让我背锅,可以尽情的用自己的风格去影响架构,写的是挺爽的。从一开始的逻辑注重型,到后面也开始关注内存的控制。这里特别感谢前面的人把项目架构写的特别清晰,养成了我很多特别好的习惯。也感谢老大永远顶在第一线帮我擦了无数次屁股。也感谢几个服务器的同事无数个Debug的夜晚。
在公司的这年经历大致可以分为18年和19年两个大阶段,18年算是内测开发阶段,经过1次删档内测和2次不删档内测。我清楚的还记得第一次开服以后看到u3d里城镇瞬间全是玩家然后编辑器卡出屎的场景。后面几个版本人物算是能正常走了,然后单局里各种掉线。我写的一个信用分的功能,玩家信用分都快扣到0了,尴尬的一比。这个项目我虽然知道算是公司的核心项目,但是没想到有这么多人玩,甚至没宣传的的情况下第一次内测短期内人数到15000多。这段时间算是最累的一段时间,有的时候996感觉都不够用。19年开始为开服做版本更新,这个时候的版本还算是付费公测,大概一个月更新一个小版本,2个月一个大版本(iOS提示一次),中间无数次的bug修复类热更。算是比较轻松,6月之前恢复965,日程差不多空了许多,这段时间看了好多书,补了C++的一些东西。过几个月就是正式开服,全渠道的那种,什么4399,哔哩哔哩,金山都有的(举这几个例子的原因是这几个渠道的包贼几把难过审核,所以印象很深)。这就意味着,又要开始加班了,这个就算不说,也是会被动加班的。
部门还是很宽松的,就算上班时间自己公司的游戏基本上怎么玩都不会管,看书学习这种也不会管(当然前提是把东西做完)也基本上很尊重个人意见,有几次我只是提了几个小意见就被几个人抓起来开会讨论了。然后大家都是比较年轻,没啥隔阂,开会也是很有效率的那种,基本上都是按流程把要说的说完就散了。部门效率也是感觉那种很明确,可能这就是大公司吧。一般checklist提前几个月就分配下来,你未来几个版本要做的功能都在上面,策划还被要求仅有文档不够,每个需求还必须自己开个小会和程序们讲清楚,项目经理还很鼓励我们怼策划,不要盲目执行,把不合理的需求打回去。
之前我也有提到对客户端有兴趣,老大就和我聊了一会说会分几个需求给我。我在8月版本的checklist的客户端看到了我的名字,有种不可思议的感觉。这样我就成为项目组唯二有svn全权限的人了,haha。现在想想,从进入公司前写的u3d都已经快忘得差不多了。我看了下7月版本的我的需求真的是超级少,估计老大是觉得我这个月学习下应该能完全搞定客户端吧(草)。这和我的职业规划也差不多:在公司至少完成2个项目,第二个项目想办法尝试下写客户端。毕竟自己也是想着写U3D才进游戏公司的。和互联网公司不同的是没有「全栈」这种概念,因为项目是在太大了,而且C++和Lua+C#是完全两套完全不一样的生态环境,网游很难用一套生态环境写,毕竟浸没成本在那。几十个G的项目完全不可能掌握每一个细节,能做的事情极其有限,这就特别考验你的举一反三的能力,写代码前的思考的要特别仔细,而且服务器用的又是C++这种goushi语言。目前总体还算满意,希望我接下去的兼职u3d生涯能顺利吧。
]]>玩TOP(Tetris Online Poland)一段时间了,发现自己对这种经久不衰的老游戏无法自拔。现在的俄罗斯方块和老版FC上的已经有了很大的区别,而且玩久了也会发现这并不只是一个简单的消消类游戏而已。刚入门和非入门玩家就有很大的差别,后者可能堆着堆着就把自己堆死了,前者在了解一些基本原则且不MD(misdrop)的情况下,哪怕LPM(Line per minute)很低也能正常的进行挖掘,甚至能做一些简单的攻击。
在讲现代方块和经典方块的不同之前,我们先聊聊两者相同的地方,其相同的地方体现在方块旋转机制、多消奖励。
首先俄罗斯方块一共有7种,O Z S J L I T,每一块的各种旋转下的形态都不超过一个4*4的方格中,其中比较特殊的方块有两个,一个是O方块,一个是T方块。因为O方块是唯一一个没有旋转中心的方块,因此顺逆旋转键都对它不生效,他永远占着4*4中间4格的位置。其他6个方块都是有自己的旋转中心的,因此我们很容易想到,ZSI方块看起来只有2个形态,其实实实在在的是有4个形态的(这就是我们在旋转ZSI的时候仿佛同一个形态会有忽高忽低的感觉),换句话说,每个形态下的两种旋转态就共计8种变化态,而不是「竖横横竖」2种,这些形态对现代方块有很重要的意义,这涉及到现代方块SRS(Super Rotate System)而对街机的上的ARS(Arika Rotate System)影响不大。至于其他的旋转系统有兴趣的可以自行查询。T方块的特殊性在于它的奇偶性,什么叫方块的奇偶性呢,简单来说,你把方块放到黑白格子中会发现,其他6方块都是黑白各占两格,只有T方块的黑白格数呈奇数性,所以一般T方块能够很容易把方块平面和凹凸进行转换,而且T方块是也是现代方块的三大攻击手段之一(Tetris,Len,T-Spin),顺便一提,奇偶性的研究特别对全消(Perfect Clean)会有帮助。
基本上消除类游戏的m+n的消除收益会大于m和n的单独消除总和,因为单独多次消除首先比较容易,然后短时间连续可能会有连(Len)的加成。像gameboy上的俄罗斯方块的1234消(Single,Double,Triple,Tetris)的得分就是1357,但是在TOP里Single是没有收益的,一般只视作玩家在简单的挖掘而不是在做攻击,除非玩家在做比如C4W(Combo 4wide,堆高空4列然后疯狂Single打Len)这种堆砌,C4W比较容易失误断Len,C3W不容易失误但是总Len数会少,C2W更甚。
提高LPM永远不会过时。哪怕只做Tetris,只要LPM够高,仍然能碾压大部分玩家,这属于基本功一类。然后是挖掘能力,在处理垃圾行的时候有效的清除行数从而避免没淹没。还有基本的堆砌能力(基础的C1W),这个有专门的程序用AI在研究科学的堆砌方法,不过总的概括可以用几句话表述:尽量构造多种方块能置入的结构;尽量构造局部平面;尽量不创造3格即以上的高度差;但具体情况有时候要根据Next方块分析(包括Hold)。哪怕方块生成机制是完全随机的,只要运气不是太太太太太太太太太背,理论上是不可能把自己堆死的。总而言之,所有的策略游戏都有这么一个原理,策略要柔软,保留所有方向的可能性。
经典竞技方块一般没有攻击手段,纯粹的比堆砌底力,竞技方块一般给对手的攻击手段是增加从底部增加垃圾行,于是还考验玩家的挖掘能力。有些游戏的垃圾行非常不友好,像QQ游戏的火拼俄罗斯方块垃圾行纯粹就是生成黑白格垃圾行,这种垃圾行极难消除,因为根据奇偶理论对会大量需求T方块,而且这个游戏方块生成机制是完全随机,于是后期就成为一个运气游戏。一般现代正常的竞技方块的垃圾行都是单次攻击下生成随机一列空白的n行垃圾行(行数由公式决定)。于是一组整齐的垃圾行送给对面,因为容易打出B2B(back-to-back,指连续的Tetris和T-Spin等高难度消行,会有翻倍的收益),常常反而成为对手制胜的关键。
现代的方块游戏更加具有趣味性,除了精美的画面和精致的BGM以外,游戏性也获得的极大的提升。常见的除了我正在玩的TOP,比较著名的还有噗呦噗呦,以及现在大火的Switch上的Tetris 99。
游戏机制:
操作手感:现代方块除非使用速降,否则哪怕当前方块降落速度再快,在方块落到底部的时候都会有一个比较长的停滞时间(大约0.5秒左右),这大幅提升了玩家的容错率,方便玩家能够更加从容的做各种旋转甚至踢墙(Kick Wall)操作。
方块生成机制:现代方块系统一般不再采用完全随机,而是一种叫7-Pack的伪随机系统,顾名思义就是每包7个,包内随机。这样的好处就是玩家可以做一些固定的开局,对于高手来说,全消(Perfect clean)开局可以给对手带去巨量的垃圾行,甚至可以把握运气做出2PC,让对手的垃圾行警告槽直接拉满。理论上PC开局的可能性是78%(7-Pack方块加上正确的3个方块),要达到这个比例需要你熟练掌握一些基本原理,在出现可能PC的情况下做出正确的应对,在PC失败的时候也能坦然应变。当然开局方案有很多,但是基本上还是取决于个人的攻击风格(Tetris,Len,T-Spin),看下个人资料的攻击风格来决定最适合你的开局吧。
SRS:超级旋转系统可以另起一篇文章来说明,不过这里只简单的说一下踢墙原理。踢墙指方块旋转时旋转中心发生偏移的情况,在方块中心贴边的时候进行旋转会不可避免的发生中心离边的情况,然而在一些特殊地形而满足踢墙机制的时候,方块会发生看起来很诡异的旋转。比如新手常常看到的T3:「这TM怎么进去的」。其中T方块进行的旋转统称T-Spin,其他常用的如S-Spin和L-Spin也存在,但只有T-Spin是有额外加分的。T-Spin的123消行称为T1T2T3,T-Spin攻击力很强,同时消耗的方块很少,又因为不难做所以同时很容易打出B2B的配合。
系统机制:
Hold机制:玩家可以随时把当前的方块与Hold方块交换,然后从顶部重新开始降落。Hold方块不能再被Hold。是一个新手用了就停不下来的功能。
攻击系统:玩家在被攻击时不会立即生成垃圾行,而是在垃圾行警告槽生成对应高度的红条,在一定时间内做出反击能消除对应高度的红条。消除不完就生成剩余高度的垃圾行。而单次攻击内生成的垃圾行空列的位置不同。总的来说,先手攻击带来的优势在这个游戏的过于明显。而具体攻击的行数和游戏有关,Top的垃圾行生成规则见附录链接。
40行无hold:基本上所有的现代方块都有40行模式,尝试着把时间尽可能短吧(大佬一般说1分钟以内算入门),尽量减少对Hold的依赖,能显著提升你的LPM,习惯特定方块的旋转模式,对垃圾行的理解。
C1W练习:只做Tetris消行的练习,能提高你的堆砌能力。不管是不是在7-pack系统下都可以。
TOP里也有单独的挖掘练习,个人感觉也还是不错的。
关于TOP的介绍及攻略:https://tieba.baidu.com/p/1248256609
TOP攻击规则。注意,Len的垃圾行属于额外附加垃圾行,不包含其本身一般消行的垃圾行,一般来说听到对手9Len的音效就可以双手离开键盘了(瞬死)。
一般消行 | 垃圾行数 |
---|---|
Single | 0 |
Double | 1 |
Triple | 2 |
Tetris | 4 |
B2B-Tetris | 5 |
T-spin消行 | 垃圾行数 | B2B |
---|---|---|
mini | 1 | 2 |
Single | 2 | 3 |
Double | 3 | 4 |
Triple | 6 | 8 |
连击数 | 垃圾行数 | 总数 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 0 |
2 | 1 | 1 |
3 | 1 | 2 |
4 | 2 | 4 |
5 | 2 | 6 |
6 | 3 | 9 |
7 | 3 | 12 |
8 | 4 | 16 |
9 | 4 | 20 |
10 | 5 | 25 |
最近很惭愧的被舆论带了风向,这又让我知道了人是很容易被情绪煽动的。人活得越久,越明白不是任何事情分对错就好了,否则国外为什么那么多大流氓,说到底每个个体都只是在短期利益和长期利益间进行权衡。当利益诱惑比较大时,牺牲一些道德或者甚至牺牲一些信誉都是可以预见的事情,用绝对的道德去谴责他人本来就是没有意义的事情,因为你到了那个位置一样也会那么做。
最近有几个话题被炒得很热,也是很有争议的,大小公知们用着自己的推论,在道德或事实基础上做一些形而上的推论,每个人的看法看起来都有一份道理。但是没办法判断到底谁的三观对,谁的说法合理。其实他们的看法都对,不过只是在他们自己的圈子里。
「三观正」是一个黑话,它表达的意义有两个,一:你的三观和主流三观一样;二:你的三观和我一样。那相对的,「三观不正」的一种意义就是,你的三观和我的不一样,所以你的三观不正,这种情况其实是一件很正常的事情,每个人生长环境不同,对一件事情的看法本来就不同,有些人看到的是感情,有些人看到的是背后的资本。还有一种就是和主流三观不同。这是一件我觉得很可怕的事情,我们的社会尝试着把我们全部捏成一样的人,有些潜移默化的错误变成了潜规则。站出来喊错的人少了,抱团圈地的人多了。
有些人的好感很廉价的,你说了他喜欢的话,就马上各种贴脸,你说了他不喜欢的话,就各种威胁辱骂。我其实对这些都不在意,我讨厌的只是被人当枪使,特别是利益无关却自我不知,为了别人的利益在那边打得死去活来的。最近被舆论带了风向,就是这种感觉,为自己感到十分的难过。
这是一个非常非常敏感的话题,因为不管你发表什么观点,都会被围而攻之。女人说女人活得艰辛,男人说男人活得艰辛。那么我们为什么会活的那么艰辛呢?我们可以简单的分析一下最近比较火,或者之前比较火的话题。
「他们没有身份证、身背巨额债务、与家人断绝往来、终日在网吧里流连忘返。他们玩的游戏和大多数人无异。但因为特殊的生活方式,他们被人们称为三和大神。」
「佛系青年,网络流行词,含义是指那些在快节奏的都市生活中,追求平和、淡然的生活方式的青年人。」
「女权追求的目标是平等和自由的权利,田园女权追求的是一切的单边利己的权利,这是本质区别,为了达到单边利己的目的,女权甚至会倾向于塑造极其极端的男权社会,利用女权当武器,在更好的男权社会里寄生。」
「……」
你不妨先暂停一下阅读,从这些例子中你静下心来总结这些人物的特点,你想到了什么?
好了,你现在告诉我,他们争来争去的女权,本质是什么?
我刚进大学的时候,就已经发现软件这一块方面有趋向饱和的趋势。开发者市场上充斥的各种平台,平台的平台,平台的开发工具,平台的平台的开发工具。然而毕竟衣食住行本身就只有那么多选择,大多数的工具只是浪费而已,经济学上叫产能过剩。
技术的发展的放缓是蛋糕做不大的一个很重要的原因,一是蛋糕做不大分不了,二是新的蛋糕会遏制旧的蛋糕,必然导致资本的反攻。你看为什么一开始bat都不搞区块链,(当然区块链本身也不算新蛋糕)到后来搞清区块链就是个骗局以后,才放心的开始疯狂的推广(本质上就是包装起来卖他们的云产品)。不禁感叹一声,实业兴国,XX误邦。
Think broadly,不只是软件市场趋向饱和,我相信在中国基本上各行各业大多数也是趋向饱和的。资本已经注入到任何能赚钱,甚至不能赚钱的地方了。所以现在的年轻人都没那么拼了,一眼就能看到自己的未来。人变得不愿意去创造价值,更趋向于去取得现有的利益。这就是各种人群形成的本质:资本。
扩展阅读:涓滴效应
我们先做道题:
基辛格第一次秘密访华,看到“打倒帝国主义”口号时,曾经表示过不满。尼克松访华时,毛泽东竟然提起此事,并笑着说:“我认为,像我这样的人放了许多空炮……你(尼克松)不在打倒之列,他(基辛格)也不在内。都打倒了,我们就没有朋友了嘛。”毛泽东说自己“放空炮”,是在暗示( )
A.中美之间的矛盾是虚构的 B.美国已经不是帝国主义国家 C.中国在淡化中美意识形态的分歧 D.中国感谢美国帮助中国恢复联合国合法席位
后来基辛格了解到,中国的每一个政治行为,都有他背后的意义,没有无缘无故的政治行为。
想到现在的『主流价值』,全部都是舆论导向的产物,我就不寒而栗。国家发表什么看法什么言论,一定是在推动什么什么价值观,或是要一些人去推倒另一些人。国家的本质是阶级统治的工具,阶级性是国家的本质属性。
]]>手游最近在准备第二次删档内测,真实忙成狗。今天我同时在进行的三个需求,突然同时都卡在了别人那边,而且估计要卡好久,人一下子就闲下来了(U3D也被逐个拉去谈话,听说是东西写不完)。人大概是被工作虐惯了,一停下来突然不知道做什么。学习吧,不是很想看书,刚刚和web强行心平气和的司乐碧,现在很浮躁。现在还算是工作时间,想来想去就只能写写博客了。
我以前写文章是这样的,不管现在是什么状态,只要一下笔,就能很自然的写下去,我好多文章都是很随性的。现在我的感觉很奇怪,手放在键盘上,不知道说什么。单调而枯燥的生活是致命的,特别是游戏行业的加班情况,根本就没有chunking
的时间。以前闲下来还会看一些新闻来思考,现在就是业务、业务、业务。我现在也不知道我这么拼干什么,已经连续两个月全勤,有的时候还很早到,嫌996的上班还不过瘾么……上个月存的钱突然被旅游氪金等其他支出一下子花光了,说实话有点后悔,因为这类东西完全可以通过思考或者其他过程来获得同等的体验。以前我的欲望是很小的,现在对金钱的感觉有点变的不敏感了,动不动就花了好多,根本存不下来……人对时间也变得不敏感,有时候晚上快10点钟才反应过来下班,周围的人都走掉了,人变得昏昏沉沉的,到家快11点,身体代谢都变得紊乱,人的思考变得都有些不清晰,想的东西都变得乱七八糟,大脑都不按照正常的方式运作了。我现在有点祈祷这个项目赶紧结束掉,如果下一个项目还是这个样子,我说不定就放弃了。
还有一个问题也很累,就是和一些同事打交道。我深知人都是短视、贪婪、畏惧、本质上又是懒惰的,但是没想到人会懒惰到这种地步。你已经给他安排好你心目中认为最最最宽松的任务了,然后他还是找借口不做,或者干脆假装忘记,你就会很恼火。次数多了以后你就不愿意和他交流,看到这个人你就会觉得很累,就像狗听到口哨就会流口水的反射一样,你看到他莫名其妙人就一下子瘫下来了。我劝各位朋友,及时做好本职工作(特别是协作性的任务),不脱别人的后腿,就是对他人最大的善良了。
说起善良,撇开以前的偏见,策划真是世界上最善良的人了。策划基本上你只要和他沟通,他都听的进去并且能马上反馈给你,无论是文档的更新还是聊天记录里。策划还能拍着胸脯说我背锅
来和人理论,和其他到处甩锅的人不同。我看到策划经常被当面骂,但是普遍脾气都很好(像我脾气就很差,只是没有当面发作而已),总是以解决问题为目的,比任何一个工程师还工程师。而且策划一般游戏都打得好,又会吹逼,我们能聊得有来有回,和其他同事就是有来无回的那种死闷骚。策划就是这么一个让人心安的职位/可怜
删档内测真是一个天才的发明,找了一堆比内部测试靠谱多的人,然后又不需要发工资,反馈的效率又高,这些人找bug又找到很勤。我就不懂这些人图什么……最后拿一点微不足道的奖品来随便打发一下,然后这些人就高兴的一比。据说第一批测试报名的人有五百人还是五千人,这些人都是韭菜吗(
]]>最近在做GM工具和日志,为了了解流程向大佬要来一份运营的权限,虽然一些内幕我不能说,但是能够看到dh下所有游戏的运营数据,一时间还是很震撼的。这些运营数据是怎么来的呢,就是服务器这边不厌其烦的输出各种各样的日志,从物品到比赛,从登陆到登出,从充值到消费。基本上这边想查,任何异常数据都是随便查出来的,没有什么查不出来的情况,就是看这边的态度怎么样了。
m3服务器的IPC的流读写部分我原来都当做黑盒在用,因为看不太懂也不想去看,后来发现有些非IPC,比如协议和DB也在用流读写,我就正常反应的点进去看了下发现其实并不复杂。大概就是一个SeNetStream
结构体,把读写各种基本类型数据的方法进行分开处理,用读取和移动位置的方法把数据全部存在一个char组里。这样的好处就数据量小,而且解析的方法也比较自然且直观。
|
|
然后我想这东西这么溜批,用法也简单,把结构体丢进去就好了,之后我发现不是的,你要为每个结构体定义读写方法(就是里面属性的读写顺序)。难怪梦2要用自动化工具,不然每定义一个协议,工作量都不小。
记得第一篇文章的那副架构图吗,我想说的是,这个架构并不是一开始是这样的。一开始基本上全部逻辑都在ws里,包括dbserver,后来发现业务太多就分离了出去。其他服务器情况雷同,比如处理GM和运维请求的那个node服务器。这给我们一个启发,任何东西的原型都是很丑陋的,一开始不要太专注于把它设计的很好,说的程序员一点,就是不要过早优化。
node服务器在解析和发送数据的时候也沿用了那套流的解析方法,以及协议的大量的枚举判断。这样写出来的的代码就充满着诡异的感觉(想想看充满着C++气息的JS代码)。导致我前面很长一段时间只能把这个node服务器当做黑盒用,哪怕到了后面,也完全没有是在写Dynamically
的感觉,这是由于工程里硬性规定的变量命名,我copy一下文档,大概是这个样子:
|
|
这个在JS里也是这么要求的(用前缀去命名一个c-union,2333),我以后估计代码风格就变成这个样子了。
规范在大项目很重要,没有规范就没有一切,我能上手这个项目的很大原因就在于其清晰的结构和规范的命名(主要是协议命名)。很难相信梦2的代码是完全手撸的,我之前想参考梦2逻辑,问老大生成协议的xml,他告诉我没有xml,全部代码都是手撸的(当然包括每个通讯函数结构体的定义,及其读写方法)的时候,我一下子没反应过来。有句话说得好,前人栽树后人乘凉,我就是那个乘凉的人的其中一个,真的感谢前面种树的人,虽然很多都已经失联了,不过你们的留下的代码让我这个菜鸡学到了很多东西。
]]>其实这篇东西我很想命名成August 11 Progress Report
的,但是很遗憾,工作压力下并没有让我学习的积累到达足够输出的地步。连写这篇文章都是在公司挤时间写的。我自我感觉算是一个享受当下的人。读书的时候如果放了假,我一定是先玩一段时间,然后假装学习写作业,最后实在没事做了才开始做一些我认为有意义的事情,换而言之,放假在我看来就是应该玩,在假期内学习本身就是一件不道德的事情,你平时不好好看书假期看,要么就是表演欲,要么就是智商低。其实我工作中学到的东西比自己去寻找的那些知识,要牢固且靠谱的多,因为都是基于实践且被反复检验,不过缺点就是太无聊而枯燥,死板而纠结于细节。有时候还能了解一些行业的内幕,这些都是是自我相处、自我学习了解不到的。这篇文章发完以后,可能就发一篇工作总结吧。
我常常问自己,软件这行到底能做什么?好多好多APP说改变这个,改变那个,重新定义这个,重新定义那个,其实用老一辈的话来说,我们离开终端就是废物,你改变了那么多,说了那么多,把你手机拿掉,你还不是一无所有。你们真的不要老是嘲笑老一辈,我对所有的事物都抱着敬畏的心情。现在世界的确暂时由计算机科学定义,基于代码,如果将来出现了新的基准,(举个玄学的例子,比如星际争霸里星灵的灵能,异虫的幽能,我们以后用卡拉交流也说不定)那现在你做的事情就完全没有意义。你看星际争霸的世界观很荒诞,但是以前看现在也是同样荒诞。所以计算机技术,只是非常普通且非常局限的一门普通技术而已,而且非常受制于科技和硬件的发展。说白了计算机技术也就是餐馆里很多桌子里比较大的一桌,你能做的也只能做好自己的菜,你并不能把厨师长踢了,迎娶老板娘走上人生巅峰。
大家都说我们这行浮躁的人很多,大学四年的观察下来,我感觉其实不是的,我看来了又走的人,有相当一部分人是真的想学好,只是没有走对门,走了好多死胡同而迷茫绝望的。我觉得自己只是运气好走对了路入了游戏行业,在最迷茫而孤立的时候没有放弃而已。每个人都有很多种自己的学习方法,其中肯定一定是有最佳实践的,你只要找到这种学习方法,学习就是忘我的享受。那找到这种学习方法需要的时间呢,很难说。在高考前找到的人,现在已经读了一个好的大学,或者就是你旁边周围人口中所谓遥不可及的大佬。在大学内开始找的,像沈东豪这种智商比较高自我管理又很洁癖的,从大一一开始没多久就找到了,基本上你只要去找他,一般大部分时间都在写代码。像我这种比较笨,自我管理又失败的,因为一些运气,在大二过了一半的时候开始算是走上正轨,有了写代码是享受的感觉,水平也开始随着代码量上去了。但是大部分的人还是感觉写代码是一种痛苦的折磨,还是玩游戏快乐。所以说你会发现教一个这种状态前的人,难,很难,真tm的难,即使你说了很多,ta根本也听不进去,比如我表妹,比如社团的学弟妹,比如一个我认为人很好三观又蛮合的学姐,她就是认为自己不是这行的料。你觉得他们没有挣扎过吗?不是的,他们精神上付出的努力可能不比我少,这种痛苦我能够感同身受。我在菜的阶段经历过很长很长的时间。大概不要脸的人运气会好一些吧。
当然,浮躁的人会被说很多也是有原因的,像我这种现在每天都还在读十几年前的大巨头书籍补基础,你这种什么都不做,凭什么上来就想替代我?中国人很喜欢小聪明,真的很喜欢。包括亲戚圈工作圈那种一个什么一句话,一个动作就能什么走上人生巅峰/跌落人生低谷的故事,每天在被传来传去,哪怕是古代也是充满了这种投机取巧的故事。你要明白一件事情,你花多少代价得到,就需要多少的代价失去。像我对自己读书量还是很有自信的,在我现在软工四个班里读的书比我多的人估计就几个,而且我都认识知根知底。这种用时间累积起来的优势是我唯一不会担心被替代的长处。比如我有3年的C++经验,一个1年C++经验的人他再怎么天才也绝对不可能比我强。这种自信不是自我催眠的,是你自己在实践中能够实实在在感受出来的。你认识的大佬,如果你看过他的书柜你可能会害怕,真的不是什么天才,天才只是一个系数,只有在量积累的足够多的时候才会有明显的差距。人家也是一本本书读过来的,读的书量大而类杂。你真的没有理由不学习积累。你坚持积累一年,那就是积累的一年的量,不是什么一句话,一个什么捡垃圾的动作,一个什么面试的技巧这种狗屁。
最后希望大家能勿忘初心,保持前行。
]]>其实说是参考梦三端游的服务器,不如说更像是同为手游的光影对决的服务器。当然,两边的源码我都在读。除了架构是一样的外,很多细节也不尽相同,当然业务逻辑是不一样的。有一种一次性在做三个项目的感觉(并没有
每天对着这十几个G代码鼓捣来鼓捣去,从开始的盲人摸象到开始摸出这是一个什么东西了,一些超级好用的工具不说,代码本身越看越有意思。昨天对着新加的一张库表进行了DBServer的底层C++封装,一天大概贡献了几百行C++代码,下班了人都是晕的。虽然是依葫芦画瓢,但是我感觉对DBServer这个服务器已经基本理解了。其实分布式架构,真的也就这样了。我感觉过个一年对架构的理解不会比现在高多少,如果这样混日子过个3年,那不就是「3年大型游戏分布式架构经验」,但是就这样的话,想想不会不甘心么?
底层先是DatabaseDef对表进行简单的定义和注册,然后用宏进行初步封装,抽象出基本的CURD,然后是DBServer的DBPlayerMgr对DBPlayer的个人线程进行内存管理,把查询数据放在DBPlayer层中,而MSGProcess里的Process和Send相当于对DBPlayer内存对database的读和写。这里用的trick就是在有些比如一局游戏结算时,把数据发放到个人线程中去处理。
因为DBServer的结构简单,我又看了下入口的main,发现其实每个服务器进程在启动后都有自己的Debug模式,按下F1即可,比如DBserver就可以实时查看各部分内存占用,或者同步所有Player数据从内存到DB,WorldServer可以选择开关商城功能等。(宏是真的好用,明显地大幅度提升代码可读性)
说DBServer结构简单的原因是因为和它通信的除了一个Database,对于服务器就只有WorldServer。而且通信的方法有很简单,就是对接受data的curd。稍稍复杂的方法都放在了DBPlayer中,主要是Login时的进行内存层的DB读取,然后每读取一个模块就set一个flag,之后通过二进制运算来判断来决定是否让用户进入主界面。(我当初3天没有解决的登录问题貌似就是出在这,那时候是一个开发中的模块在入口逻辑中有人忘记注释那一行就提交到SVN,导致我登录返回值是OK但是停留在登录界面。当时整个人都快崩溃了,断点一天后update整个项目还是报错,还没人鸟我)
端游和手游还是有差别的,比如m3端游这边完全找不到历史战绩的模块,甚至HttpServer内容都很少。因为这里客户端基本上是直接和运维通信,就不走服务器这里,拿数据也直接从运维那里拿。而光影这边基本上是一样,但是有很多内容是客户端-服务器-运维这样走。老大这边对手游这部分的架构还保持不确定的态度,我就有点不太想做了-_-||。
我看了几天的这个框架,把这个参考bigworld的国内解决方案拿来做入门服务器运维不知道是祸是福。说是文档友好其实已经过期相当一段时间,按照它的getstart的代码七改八改,然而怎么都跑不起来,只能直接用它附带的源码。用它的原因除了是国内环境以外,还是因为它们公司是电魂投资,对我会存在潜在的资源(并不-_-除了一次宣讲会完全没有)。我觉得kbe想要提高知名度和拿到更多的资源,还是需要一款游戏的成功来证明。就好像崩坏3对于unity,wow对于bigworld,仅仅靠一大堆没听过的页游是不行的。
虽然helloworld跑不起来,但是写的时候好处还是看的到的,至少它很对我的相性(还是说我见识少,说不定用过Photon我就不这么想了)。我刚刚fork了b站有人用它写了一个麻将的游戏,有时间去看看。看来还是看视频这种最low又最直接的方法适合我^^(<-这个人真的菜
之前不是写了一个人物demo嘛,其实我一开始还是想把它写成多人的。很多细节就是考虑到多人联机才设计的复杂一些。但是这几天的工作下来,感觉自己一个人要完成的话会吐血到死。但是我并不指望(一开始就)有人会分摊我的工作,这也是我最近的观点,永远不要指望别人做什么,尽量发挥你的主观能动性吧。
]]>根据MMServer.sln的结构来确认
一些重要的通用方法和工具,一般需要先行编译。
依赖库
定义了SeBaseServerNew和SeNetworkService,前者用来发送心跳包,注册包,更新连接等方法;后者用于检测网络状态(?
根据策划xml动态生成的c++代码
没看,但是感觉没卵用,现在用u3d客户端直接测试。
所有的服务器都基于一个基础服务器类SeBaseServer,其中包括一些通用功能,比如初始化,更新,以及网络负载均衡等。
启动服务器后,每个server都会启动一个监听窗口,实时打印出服务器的状态,连接情况。
每个Server的目录下有几个固定的文件路径:
xxxServer
|
├── (D)Logic/GameLogic: 处理业务逻辑
├── (D)MSGProcess
| └── (D)yyyServer: yyyServer的Send和Agent,自定义的Agent用来处理回调(Handle函数)
| └── (D)Auto: 自动生成的inl,列出需要实现的函数文件头
├── (D)Stream: 流处理,传输统一使用二进制
└── xxxServer.h/cpp/-Def.h: 服务器的初始化,以及输出到控制台的信息序列化
交易服不太了解,貌似暂时没有用,需要监听服务器端口、WS,连接DS【MySQL】
单独的聊天服。处理WS中的聊天,需要监听服务器端口、TS,连接DS
处理社团相关,需要监听服务器端口、TS,连接DS
好友服。需要监听服务器端口、TS,连接DS【好友缓存】、DLS、SS
日志系统,目前没卵用。监听服务器端口、WS、GS、ContactS、MS、CommunityS、ChatS
连接指定的数据库表,提供服务器处理服务。监听服务器端口、TS、ContactS
全局服。监听服务器端口、WS、LS、HttpS、MS、连接DS、NodeJSHttp集群、MySQL【全服账户信息】
登录服集群。连接GS
匹配服?监听服务器端口、RS、TS、HttpS、DLS、SS
比赛服,处理对战时的逻辑。TCP监听,连接MS
听说是取代TS的一种方案,让切换服务器的时候绕开TS。监听服务器端口、MS、ContactS、WS
连接检测,socket。监听TS
中心Server,基本上所有的Server的中转站。监听服务器端口、TS,连接WS、MS、DS、ContactS、CommunityS、ChatS
逻辑服/支持水平扩展。监听服务器端口、TS、HttpS,连接GS、DS【逻辑缓存】、Redis【位置信息】、DLS、AS(已注释)、SS
]]>如何处理穷人之灭霸做的好——看油管节目后引发的思考
单纯的从历史纵向来看,人类发展史从人类进入文明社会到现在高度文明,不管是人口数量还是人口质量都发生了翻天覆地的变化。但是有一点几乎不变,就是底层劳动人民所得几乎不变(兑换成粮食来计算)甚至目前一些地区所得不如古巴比伦时代人民所得多。造成这一现象的原因要从长说起。
我们知道在地球上土地有限,食物产出量随时间是线性增长,而人口是指数增长的。每当人口数量超过环境容纳量(K值)时,就会出现大规模人口锐减的情况,比如饥荒、瘟疫、战争、暴乱。这时,如何处理低端人口就成为每一个王国要处理的问题。有一派人认为应该要保持压迫,因为根据需求理论,给穷人资源只会产生更多的无用人口,这也是历史上最多的做法,当然还有另一派人的救济做法,不过这本来就是违反生物学的做法,当然以失败告终。
那穷人是不是就应该去死呢?这听起来很不人道,因为这个理论最初就是用在人的身上的。后来一个叫达尔文的家伙把这个理论推广到动物身上,控制某一个种群的数量,是不是就听起来没那么残酷了?
因此回到原来的问题,总结一下穷人永远是穷人的原因,这个现在还包括穷人永远存在,穷人收入几乎不变。总的来说,人首先要满足食物和生育,因此只要有多余的收入,穷人就会多生孩子,然后重新变得很穷,因此就是一个资源变成人口的过程。(哪怕穷人在某一个时间点集体蒸发,剩余的富人也很快人口上升,最终又会两极分化,重新演变成原来的过程。
而底端想往上爬是一件几乎不可能的事情。不用说既得利益者手里有一大堆资源可以来搞你,底端本身相互之间就存在各种斗争,而且这种斗争是为了一点点资源而你死我活的。
地球上的人口也就是近代史这几百年才从几亿变为60亿的,究其原因为随着科技的发展,粮食产出的大幅度提高,穷人有能力和意愿养活更多的孩子,战争和疾病也得到了抑制;然而底层的情况仍然按照规律运行着。穷人仍然存在,而且一直存在。
近代也有一些反对残酷做法的声音,他们举的例子如下:第一,人们现在生育的欲望开始降低(比如日本虽然发达,但是人口生育低,已经进入老龄化)(难怪有人说避孕套是人类历史上最伟大的发明);第二,粮食等资源得到的科技的帮助(杂交等)获得极大的发展,不存在因为资源不足而暴乱的情况……
我相信这些问题马克思应该也是研究过的,在共产主义的最终形态里,是没有家庭这一概念的,你需要性就会给你性,你需要孩子就分配给你孩子,因为公共资源是极大富足的。
]]>姓名:金云天 / 现居住地:杭州
学校:杭州电子科技大学/软件工程/大四应届生
联系方式:MTc3NjQ1OTE0NTA=
邮箱:xana.awaken@gmail.com
需求职位:U3D客户端 或其他相关职位
我从去年辞职以后自学了半年多的游戏设计、常用编程模式、Unity3d和Shader,有一定的图形学基础,目标是写一个能用到所学内容的独立游戏,并且能够一直保持更新扩展维护。
能熟练使用Unity3d,熟悉人物模型,物理引擎、UGUI、C#脚本,写过很多小游戏;会写一定程度的Unity-Shader,了解各种光的计算、卡通风格的渲染、广告牌等技术。
熟悉Git-flow工作流,能有效快速的处理bug~(前同事用了都说好
我自学能力很强,乐意接受并钻研分享新技术,以前写Web和iOS,能够熟练使用 Python/NodeJS/Swift/OC 每种至少有一个商业应用或者比赛作品,轻度Linux/Vim党。个人控制欲也比较强,写项目希望能完整掌握所有的细节。
欢迎推荐~HR请通过邮箱或者其他方式联系我~
目前使用U3D进行开发,目前在做的作品demo链接:交互模拟 更新1,(开源模型/标准库动画/触发检测/ScriptableObject/Shader/UGUI 运行环境:PC + U3D)
自学过一段时间的图形学,学习过Directx11(读的是原版龙书),会写一些简单的shader,了解性能优化。ShaderLab demo链接:AntiEffect,(自定义顶点/片源着色器 运行环境:PC + U3D)
使用缘之空游戏内的素材写过一个半成品的iOS游戏(语言使用swift2)。游戏部分截图:YZK
参加过三次hackathon,使用NodeJS快速开发游戏主要逻辑和长短请求处理。最好的一次成绩:【链接】2016“龙驰杯”浙江高校Hackathon大赛圆满落幕 作品源码:DemoX
大一写过五六个使用RPGmaker制作的游戏,其中最长的一个花了两个月整理素材,还有一个帮助姬友实现小说剧情化。
仅证明自学能力
使用Objective-C写过iOS商业应用 集成支付宝/微信/QQ,独立上传过App Store。 App Store应用名:水南照相馆;文档主页:水南照相馆技术支持文档。之后还尝试用ReactNative重写一次,坑太多(RN版本更新太快),复刻界面后不了了之。
大三上学期使用python的flask框架写了一个为实验班搭建的论坛,后端技术栈 Python3 + Flask + Mysql,开发与部署平台 Linux / Supervisor + Nginx + uWsgi,自动化运维+测试。项目GitHub地址:Experimental_Class_Forum_Backend
大三下写过一个跨国公司商业用python-django项目。原公司最初使用 svn/django-fbv 经个人坚持后转型 git-flow/django-cbv 最大的收获是 从0到1掌握Django,通过读Django源码深入解读cbv系统(view的结构组织和生命周期)和模板系统,并掌握前端基本技能(jq+Bootstrap3)。网站实现国际化,并至少支持两种语言,官网:ebizbank
大四毕设,学车和看书。
]]>