百万亚瑟王界限突破(中亚文学 被忽略的文学腹地)
百万亚瑟王界限突破文章列表:
中亚文学 被忽略的文学腹地
位于亚欧大陆腹地的中亚地区,远离海岸线,却是丝绸之路的必经之所,几千年来,亚欧各大文明在这里交融消长。我们现在常说的“中亚”,通常指哈萨克斯坦、乌兹别克斯坦、吉尔吉斯斯坦、塔吉克斯坦和土库曼斯坦五国,其中有三国与中国接壤,而生活在这片广袤土地上的人们,更与我国西北地区的哈萨克族、乌孜别克族、柯尔克孜族、塔吉克族、撒拉族等族人民血脉相通。
中亚有悠久的历史和文明,但当提起文学,尤其是现当代文学,我们却很少想起这片地域。为什么?想究其原因,首先需要了解这里有些复杂的语言生态。
中亚五国各有各的主体民族语言,其中,哈萨克语、乌兹别克语、吉尔吉斯语(又译为柯尔克孜语)和土库曼语属于突厥语族,而塔吉克语独属于印欧语系语言。
从公元16世纪开始,俄罗斯在中亚的势力日益扩张,大量俄罗斯移民涌入中亚,直至19世纪沙皇俄国完全占领中亚。于是,俄语在中亚日益推广和普及。苏联时期,俄语的优势地位在中亚得到进一步巩固,其影响力也延续至今。苏联解体后独立的中亚五国,基本都同时通用俄语和本民族语言,而在商务、科技、文化艺术领域,俄语的作用依然难以替代。
除此之外,中亚几种语言的书写形式在历史中也经历了数次变革。阿拉伯字母、拉丁字母,斯拉夫语系的西里尔字母……都曾成为其语言书写下来的方式。近年来,为了更好地融入国际间的交流,拉丁字母又重新被推行。
于是,我们可以想象,当语言和文字不得不几经嬗替,文学——我们通常所指的书面语形式的现当代文学,很难发展得特别丰富。再加上语言相隔造就的阅读障碍以及翻译的有限,我们对中亚文学的了解就更为有限。
中亚有相当精彩的口头文学传统,这里的史诗和民间故事,在世界范围内也无法忽视。比如乌孜别克族的史诗《阿勒帕米西》、吉尔吉斯的史诗《玛纳斯》……都是由“阿肯”(歌者)们口口相传至今的伟大作品。
从已经译为中文的中亚文学作品中,我们也能依稀理出一点脉络。哈萨克斯坦现代文学的奠基者、著名诗人阿拜·库南拜耶夫的作品,从上世纪50年代开始就有陆续译介,《阿拜箴言录》还有不止一个译本。作为苏联文学的一部分,萨比特·穆卡诺夫、哈比登·穆斯塔芬等哈萨克作家的作品也曾被引进到中国。穆合塔尔·阿乌埃佐夫根据阿拜生平事迹创作的长篇历史小说《阿拜之路》,也在上世纪90年代引进并重版。公元十五世纪乌兹别克的伟大诗人阿里舍尔·纳沃伊的长诗和传记小说,都有了中文译本。阿布都拉·哈迪尔的小说《圣殿里的毒蝎》中文版出版,又扩大了中国读者对乌兹别克文学的认知。
真正被广泛译介并传播,对中国文学界产生了巨大影响力的中亚作家,当然要数来自吉尔吉斯斯坦的艾特玛托夫。尽管主要活跃于苏联时期的他,通常被归于“苏俄文学”的框架之下。他的《白轮船》《永别了,古利萨雷》《查密莉雅》《一日长于百年》……得到了万千中国读者的共鸣。艾特玛托夫的小说中有诗性和人道主义的底色,在他抒情气质浓郁的文字里,我们能读到来自吉尔吉斯草原的民族传统与灵魂,也能读到苏俄体制的时代记忆。在中亚文学的版图中,艾特玛托夫像一个出挑的异数,但又恰恰说明着,我们不能用狭隘的“民族文学”的视角去揣测文学,它其来有自,却能超越种种边界。
除此以外,与中国有着深刻渊源的“东干文学”也在近年来受到了不少学者的关注。东干族是指迁移到中亚的中国甘肃及陕西回族后裔,如今是散布于中亚各国的少数民族,他们中的许多人能操陕西关中方言和以陕甘方言为基础的新疆伊犁汉、回方言,也有作家用自己的语言进行文学创作。
中亚简单却又错综的文学地图和这片土地的历史一样,本身就是各民族不断流动、迁徙、共处、相融的证明。
《阿拜箴言录》
作者:(哈)阿拜·库南拜耶夫 译者:粟周熊、艾克拜尔·米吉提
版本:民族出版社 1995年
出生于1845年的阿拜·库南拜耶夫是哈萨克斯坦最伟大的诗人,也是承前启后的思想家,是近代哈萨克斯坦书面文学的奠基人,在哈萨克斯坦具有非凡的地位。阿拜创作了大量的诗歌、长诗、散文和哲学作品,他说:“诗是文学的精华,语言的皇帝”;“我的方向——让诗的语言更加精炼/我要用诗的清泉灌溉人们的心田/决不为个人消遣去挥舞笔墨/只为了勉励那些上进的青年”。阿拜的写作有着鲜明的启蒙立场,他对哈萨克民族作了深刻的文化反思,批评人们生活中的恶习,张扬自己的追求与理想。《阿拜箴言录》中多是短小的具有哲理性质的语录。
《阿拜之路》
作者:(哈)穆合塔尔·阿乌埃佐夫 译者:哈拜、高顺芳
版本:民族出版社 2004年4月
《阿拜之路》是哈萨克斯坦作家、学者、阿拜学奠基人穆合塔尔·阿乌埃佐夫根据阿拜的生平事迹创作的历史小说,长达一百四十万字。这本书既是阿拜本人的传记小说,也是一部哈萨克民族的诗史,兼具文学和史料价值。穆合塔尔笔下的阿拜表现出了胆识、勇气和大无畏的精神,以及高尚的思想境界;书中对哈萨克族的生活、娱乐也有着最真实的描写。《阿拜之路》多卷出版以后,在1959年获苏联列宁文学奖,之后被译成一百多种文字在世界各地出版,是哈萨克斯坦当代最重要的文学作品之一。
《法尔哈德和希琳》
作者:(乌)阿里舍尔·纳沃伊 译者:吴国璋
版本:长江文艺出版社 2008年3月
阿里舍尔·纳沃伊是公元十五世纪乌兹别克斯坦的伟大诗人、哲学家、艺术家、政治活动家。他被誉为乌兹别克斯坦文学鼻祖,乌兹别克斯坦文学语言奠基人。他的作品中最负盛名的是《五诗集》,包括《正直者的不安》《莱伊丽和马季农》《法尔哈德和希琳》《七行星》和《伊斯坎德尔墙》五部长诗。在诗歌之外还著有哲学论文《心之所钟》等,谴责荒淫无道的执政者,主张由正直的执政者治理国家。这本《法尔哈德和希琳》,是纳沃伊《五诗集》中迄今唯一一部被完整译为中文的作品。
《一日长于百年》
作者:(吉)钦吉斯·艾特玛托夫 译者:张会森、宗玉才、王育伦
版本:华东师范大学出版社 2018年1月
去年,艾特玛托夫的这部长篇小说时隔三十年在中国重版。相对于他的早期作品如《白轮船》等中篇小说,《一日长于百年》的叙事更为复杂,小说的情节同时在现实、传说和科幻三个层面展开。萨雷·奥捷卡大草原上一个荒僻的铁路会让站,和大气层之外苏美两国的“均等号”空间站,分别发生了一件事情,打破了原有状态。艾特玛托夫在会让站中塑造了一幅“无知”的群像,他通过对“宇宙”意识的引入,让所有人都处于无知的穹盖下。而在美苏联合委员会,那里又呈现出“无知”的另一种形态……在繁复的多层次结构中,艾特玛托夫拓宽了对生活观照的幅度,表达了自己对人类命运的关注和思考。
《亚瑟儿·十娃子精选诗集》
作者:亚瑟儿·十娃子 选编:M.X.依玛佐夫 译者:林涛、崔凤英
版本:世界图书出版公司 2015年6月
亚瑟儿·十娃子是东干族文学的奠基人,东干文字创制的参与者之一。他出版过20多部诗集、散文集、长篇小说和剧本等,有《革命潮》《富足的光阴》《祖国的路》《劳动的火花》《逝去的岁月》《春风》等。在创作之外,他还用东干文、吉尔吉斯文翻译了普希金、莱蒙托夫等俄罗斯作家的作品,还用俄文翻译了《三国演义》《西游记》等中国古典文学作品的片断。近年翻译出版的这本《亚瑟儿·十娃子精选诗集》,从诗歌的层面看也许称不上精彩,但作为一个独特的文本,亦不失关注的价值。对照书中的一些近现代东干语词,也能让我们对现代汉语的生长变化多一些新鲜的体认。
撰文整理/新京报记者 李妍
120部番剧!2019年日本动画个人总结
——不评分,不评价好坏,纯粹随想随记,个人看动画只关注有多少适合自己的看点,比如剧本,比如声优,比如作画,比如角色等等,可能有那么一两个关注点其他都很烂也会默默看完。
顺序以BANGUMI以及翻一年自己的微博历史为准
2019年冬
1.revisions
网飞一举放送,19年开年第一部完结的动画,中二废材男主在前期到中盘搞笑的丑态百出挺劝退人的,但是坚持看到结尾,后期的回收伏笔的剧情还算不错的解释了男主前期的状态;虽然镜头大部分围绕着主角群,还是用一些配角的戏份把这个孤立社会下的人生百态表现出来了,除了一些细节部分可能不那么好,整体的剧情很紧凑,亮点就是结尾的回收,还有对时间穿越BUG的解释;最后3D渲染画面的水准还是不错的,不过比不上年底的
BEASTARS就是了。
2.Endro~!
标准萌豚片,套了个勇者魔王的背景设定,演了一个只有爱的反常规的冒险故事,作画整体挺稳,没有太掉线的段落,关键是这个CV阵容,让我无法拒绝,傻笑的看着她们的日常既轻松又快乐。
3.辉夜大小姐想让我告白~天才们的恋爱头脑战~
这季看得最开心的动画之一,笑点满载,不落俗套的段子,几位主要角色都有各自独有的魅力与个性,动画制作上肉眼可见的用心,声优们的演技也是满点,算是今年整体上最高质量的恋爱喜剧动画之一。(略显遗憾的就是玉米粒的戏份少了一点点;看到柚碰的好姬友古贺表现出色,就会想起有利息的引退...
4.多罗罗
手冢治虫的名作改编,原作我没看过,单说动画前期作画演出上线,世界观的展现,还有主角的主要矛盾点,对于喜欢严肃正剧的人来说应该很有吸引力,就是中盘明显工期把控不好作画掉线明显,搭配中期的比较没那么有意思的剧情,就显得很拉胯,还好后期随着剧情高潮制作有慢慢上线;这故事想要探讨的深刻主题,动画只做到了浅尝辄止,虽然如此,但是作为一部严肃正剧题材的动画还是相当值得一看的部分。
5.粉彩回忆
核心设定有点类似小时候看的十二生肖守护神,只不过穿越的作品是ACG作品,前期NETA主要是今年来的热门作品,比如点兔、俺妹之类的,后期就有一些老派的作品,比如EVA;本质做成了NETA类动画,然而这类动画一开始有新鲜感还觉得有趣,没了新鲜感以后又做不出创意就会越发无聊;制作上这片也没有什么值得称道的地方,然后这片色指定让我觉得这片至少回到了十年前,对了这片的ED印象中很H,让我当时觉得颇为意外。
6.笑容的代价
看第一话觉得是王道萝卜片,看到OP出来以为是百合片,然后看下去变成脑残战争片,最后看完原来傻逼环保片,这个剧情是真的蠢,这个公主我是真的特么没法接受,你跟我说她还是小屁孩,可以,但是都便当一箩筐了也没见你真的成长了,冲着玉米粒和早见看完的,我特么还得忍着玉米粒这个公主。
7.飞翔吧!战机少女
这片最后几话的空战演出真的不错,本身设定就魔幻,所以那不科学的机动就看着很爽快,动画本身素质有一般往上的轻改动画水准,剧情反正就是一般后宫轻改该有的水平,动画人设感觉女主还蛮还原遠坂画风的可爱感,这片可能最差的地方就是主角机的纯色涂装真是土鳖到不行233
8.格林笔记
比粉彩回忆还要更像十二生肖守护神一点,算是一般水准的游戏改编动画,没啥亮点,对童话传说故事的改编中规中矩,男主那变身算是这片主要槽点。
9.烟草
粗糙的3D制作却展现出了一个非常有趣的末世世界观,剧情前期沉闷,中盘推进和伏笔揭示很有趣也很有想法,就是收尾感觉还是有点一般;可能碍于经费,这片的音响不太行,所以这片视听的听上真是靠香帅撑起来的。
10.环战公主 CIRCLET PRINCESS
因为贝吉塔不知不觉看完这游戏广告片,感觉就是在有限的资源内做出的合格广告片,虽然格斗题材,但是打戏没有看点,倒是日常妹子画得挺稳,故事老套,看点主要还是贝吉塔。
11. 约会大作战 第三季
一路看下来,这片前两季动画也就那样,这第三季从放出宣传到正式播放才隔了几个月,到最后能好好做完没有延期我都觉得制作组够屌了;故事反正标准轻改水平,这季涉及到了时间穿越,算是有那么点意思。
12.家有女友
没看漫画,动画就这一季看下来,这剧情狗血到不行,在我的价值观里就觉得男主是纯正渣男,因为有本垒片段,所以能听到真扎和阳子太太不可名状的声音;然后这片作画还不错,绘柄很稳,女角色都很可爱。
13.不吉波普不笑
非常需要对电波的作品,而且动画叙事手法过于碎片化,然后又是群像剧,再加上本身设定又非常的晦涩难懂,这片看着是真的费脑,但是对上了,沉浸进去就会喜欢上这个光怪陆离的世界;然后又到了吹凹酱牛逼的环节。
14.玛娜利亚魔法学院
几乎全程发糖的百合动画,作画精致,演出也很有气质,百合控不容错过的一份“英式下午茶”。
15.灵能百分百 第二季
个人看法第二季相比第一季又更精彩了,故事上不论是跟灵幻的矛盾还是后面超能力建国,都让这个荒诞故事更有深度了;然后全片作画爆炸,全片打戏真是一浪接着一浪,看着人爽飞了,应该是全年打戏作画质量密度最佳的TV动画了。
16.笨拙之极的上野
搞笑小品动画,没节操女主的那些天才发明是真的脑洞大,篇幅也不长,所以大部分点子都很好笑,没有太冷场的地方。
17.五等分的新娘
漫画一直有在追,所以在看到这动画人设的色指定出来后期待值就大降了,这个高明度低饱和的色指定看着是真不好看,动画实际制作是一般,作画崩坏不少,动画本身品质就是靠着原作加入推理元素的多角恋爱情故事以及一票人气CV撑着,动画整体只能说中规中矩吧。(说实话动画还不如线下EVENT有意思)
18.同居人时而在腿上、时而跑到脑袋上
非常适合铲屎官观看的作品,动画基本构成就是每话分别以人和猫两个视角去演绎同样的日常,从中展现人与猫之间逐渐成为彼此重要存在的经历,然后哈鲁是真的很可爱,对猫有好感或者爱猫人士这片应该能收获不少快乐。
19.盾之勇者成名录
异世界穿越轻改,前期主角受虐的部分算是有那么点反传统,男主跟setosan和chanrina互动有点类似养女儿的感觉还挺有趣的,但是关键其他配角的降智太过了,后期不少剧情看着太强行就觉得很蠢,整体上算是一般水平的轻改作品,最后看完这片的最大理由还是chanrina这只鸟真的很可爱。
20.天使降临到了我身边
现在回头看这片应该是全年最佳萌豚片,制作水平上乘,作画几乎就没掉过线,高质量搞笑的日常,充分展现性格迥异角色的各自的可爱,最终话的舞台剧演出简直点睛之笔,可能略显不足的地方就是作为标题天使的主角花的存在感不如日向,喵内实在太洗脑了WWWWWW
21.约定的梦幻岛
奇幻版越狱?诡计的设计,智斗的剧情,都蛮精彩的,动画的演出和气氛烘托也很赞,有几段剧情有那么点恐怖片的感觉,作画没有掉线,动画可以说蛮出色的展现了原作的魅力;最后真扎的少年役很不错啊。
22.荒野的寿飞行队
军宅狂欢的作品,虽然我不是军宅就是了,但是因为玩砍口垒,所以对这片还是很有好感的,这片剧情上是比较水,主要看点就是一场接一场的空战,飞机模型远比同期的战机少女可要精致太多了,空战也是更上一层次,然后因为砍口垒的关系,最后看到震电出场的时候我HI爆了。
23.狂赌之渊 ××
不知是我百合入脑,还是啥原因,感觉二季相比一季百合成分更多了,可能是习惯这片的套路,所以这季季常赌局感觉都一般般,倒是出色作画下的卖肉和颜艺依旧是招牌看点。
24.魔法少女特殊战明日香
又是魔法少女的套皮作品,这片与其说是魔法少女不如说战后老兵,战后老兵的那种状态倒是有做出来一点,战斗模式也是感觉套了魔法少女皮的特种兵的感觉,所以故事看下来还是有点意思的,虽然有不少血腥部分就是了;还有啊呀呸出演明日香也是很有嘈点WWWW
2019年春
25.Fairy gone
在看第二季改观之前,在第二季理清剧情,完整展现出这个世界观之前,这个第一季是真的很迷,突出一个叙事混乱,我感觉我看懂了每一个角色在做啥,为啥做啥,但是就是没能看懂在演什么故事;类似替身和Persona的妖精设定,还有一战前后欧洲背景设定,影像色调烘托出一股文青气息,但是故事讲的实在迷。
26.MIX:明青故事
对大部分运动我都蛮喜欢的,但是偏偏棒球一直不是我的菜,所以小时候看的touch并不像大部分人那样打动我,在这时代看到这作品更显珍贵,这种娓娓道来的舒缓感,宛如现实存在的真实感,是现在大部分作品最缺少的特性,不时的meta演出又在告诉我们这不是现实,真是一部轻松幽默又温柔清新的作品。
27.RobiHachi
搞笑版低配宇宙丹迪,宇宙公路片,卖BL戏份不少,各个星球不同设定有些过于电波,也涵盖了不少现实社会映射,组长这个各种意义上的牙白,然后也太惨了,只能说你的爱太沉重,这片意外的是这季看得最开心的动画之一 。
28.机动奥特曼
结尾简直标准美式英雄片结尾,最后一话打得真是爽,一开始几话感觉打戏帧数不是很足看起来微妙的卡顿感,后面不知道是习惯了还是帧数加了看着好多了,这片3D效果虽然赶不上美帝水平,不过在这几年日本一票3D动画里还是算不错水准的,而且配乐真心好;不少桥段感觉借鉴了美帝作品,比如黑衣人、蜘蛛侠、超人等等,因为没看过原作漫画,所以这动画我觉得还是蛮不错的。
29.在世界尽头咏唱恋曲的少女YU-NO
GALGAME名作改编,在这个GALGAME式微的时代,这片纯粹就是情怀之作了,在时代能做满半年,没分割放送,而且画面没有太崩的地方,简直有能好么;时空穿越,不同女角线路杂糅到一起,还能讲清整个故事,该有的线索和伏笔都有,除了异世界篇和结局有些比较微妙的地方,毕竟是90年代的作品,有其时代的局限性,但是个人认为这动画已经做得不错了,特别是在这个不缺钱的热门人气作品都会分割放送的时代,一个GAL改动画能做成这样让我相当意外了。
30.一弦定音!
古筝世家的人创作出来的以古筝为主题的少女漫改编动画,然后一期当时的感觉就是制作一般的低配花牌情缘,一期剧情还是前期铺垫社团团员组成,故事传统老套,但是至少在水平线上,所以并不难看,而且一期的古筝曲就已经慢慢体现出本作最大魅力,但是爆发要等到二期。
31.皿三昧
几原监督的搞基片,相比上一作百合熊岚,这片剧情要好理解多了,各种恶趣味的意象演出只能说不亏是你,深入浅出的探讨人的欲望与隐私,高质量的作画展现了一个光怪陆离的世界,让我一个百合控坚持看完了这GAY片,然后村濑步的女声是真牛逼。
32.为什么老师会在这里!?
纯卖肉片,ATX请,福利段子还挺搞笑的,小静和小林竟然不是一对有点失望。
33.一个人的oo小日子
角色名谐音梗简单粗暴,女主一开始很有趣,但是看到后面就觉得有点烦躁,实在是急死人,有点轻百合要素,但是不深,minami的压低声线的外冷内暖辣妹挺新鲜,不过印象更深的还是阿卡林的头槌攻击2333
34.淫乱的青酱不能学习
有一点卖肉的搞笑恋爱剧,有趣的段子主要来自闷骚又纯情的痴女女主带来反差,后期基本就是变相撒狗粮放闪,津田叔的变态老爹实在过于生草。
35.CAROLE & TUESDAY
非常纯粹的音乐番,在上半季的选秀节目之前,剧情还是有那么点意思的,小格局小叙事,剧情矛盾更集中,情绪代入感更强一点,下半季格局拉大,激化了地球火星的社会矛盾,更多角色的登场,故事越发白开水,剧情没有撑起来变得越发无趣,不过还好歌曲一直在线,好几首歌是真的好听,而且动画的演出作画也很棒,所以听歌是看这片最大享受。
36.强袭魔女 501部队起飞!
小KK魔女们的搞笑日常,纯粉丝向的作品。
37.信长老师的年幼妻子
比同期的为什么老师在这里还要更直接更露骨的卖肉,ATX请,剧情没什么意思非常无趣无脑的后宫剧情,就是纯粹为卖肉服务;在这片听到ari让我蛮意外,所以遵循欲望看完了233
38.水果篮子 第一季
非常用心的重制版,旧版对来我说是一份相当美好的初中回忆,就算是在童年美化下的对比,我也觉得新版做得很不错,ho酱的小透很棒,石见的小透也很亚撒西,良好的制作,通过影像、配乐、故事再现了那份治愈人心的温柔,真是又收割了我不少眼泪;如果说有什么不足的话,就是旧版冈崎律子演唱OP实在太过经典了,这是着实比不过,虽然新版的OPED也挺好听的,特别是ED2搭配动画演出感觉很好。
39.一拳超人 第二季
如果说第一季是一群大佬在村田版的打戏基础上做了加法,那这一季就是在村田版的基础尽量不做减法的同时把资源有限分配做到尽可能的还原原作,那我觉得这一季虽然不如一季优秀,但是至少做到了及格。
40.贤惠幼妻仙狐小姐
教练,我也好想要有这样发出ajuju甜美声线、家事万能、料理上手、又能给你膝枕、还有毛茸茸尾巴与兽耳的幼妻嗷,作为社畜被精准击沉,现实中不存在的梦只能通过作品去感受了。
41.八月的灰姑娘棒球队
低成本低质量的手游改,有一些百合糖可以吃,作画不怎么样,故事也很低龄,算是平均水平以下的动画吧,我也不知道怎么就看完了这烂片,大概是因为玉米粒的吉祥物让我坚持下来了。
42.叛逆性百万亚瑟王 第二季
延续一起的傻屌风格,团长你在变态阿库娅之路越走越深,每一对合体新形态人设很帅,然并卵本质依旧傻屌。
43.女子高中生
差不多就是个默片,如片名就是JK日常剧,非常生活化的日常,就是全程基本没说过话。
44.川柳少女
狗粮片,香菜这个女主很可爱也很大,就是这个设定回头想还是挺奇葩的,全程用五七五川流句式交流,你能长这么大,是真不容易嗷。
45.文豪野犬 第三季
第三季还挺好看的,这片倒是一直往上走,第一季是除了一开始的文豪NETA异能有点新鲜感,故事真的无聊得一批,第二季慢慢开始有意思了,然后剧场版把异能战斗表现得更加炫酷了,这一季则在故事上又有更多亮点更加张弛有度。
46.异世界四重奏
把几部人气轻改作品的角色凑一起演了个蛮有趣搞笑的粉丝向短剧,这样的联动企划可以更轻松的心态去观看,感谢角色可爱魅力的同时还能收获欢乐何乐而不为呢。
47.贤者之孙
低成本制作的异世界穿越龙傲天厕纸轻改,纯粹的无脑爽片,男主从头到尾强无敌,跟女主双箭头,也就看看撒狗粮了,动画制作又烂,作画崩坏,演出尴尬,用来填补空闲时间当做搞笑片看的消遣之作。
48.进击的巨人 第三季 Part.2
漫画一直在看,所以剧情没啥好说的,动画完全还原了原作剧情,玛利亚之墙夺还战做得实在太屌,不论作画、演出、配乐都过于牛逼,比当时看漫画还要震撼,特别是阿尔敏那段灼烧的演出,现在想起来还能鸟肌了,这就是动画体验和漫画体验区别。
49.鬼灭之刃
非常标准的少年漫,前期主要吸引我的还是水之呼吸类似浮世绘水纹特效演出,阿卡林演的这个妹妹很可爱,虽然除了最开始的戏份,后面基本莫得话说了,在进蜘蛛山篇之前剧情是一路走低的,到鼓鬼篇最无聊沉闷的时候,花江与阿卡林的亲情羁绊与内山渴望家人的碰撞为基调,加上人人在吹的19话演出,让蜘蛛山篇整体有一个很高水准,拉高了整季动画的观感,回头整体看就是一个高开低走再高开低走的过程,整体的看叙事节奏并不那么好。
50.裤袜视界
高质量足控福利短篇,我觉得这动画感觉比原作插画还让我带感。
51.我们真的学不来
平均水准的多角恋校园恋爱剧,套路得不能再套路的剧情,整体制作算是比较稳定,没有太拉跨也没有太出彩的地方,与动画相比,NICO生放节目里看几位女声优可能让我感觉更有趣,osayu真的是笨蛋啊。
52.消灭都市
非原作党看得有点闷,最后这结局应该组长和香菜分开到不同世界线了吧;这片作为游戏宣传片整体质量真不怎么样,真是冲着组长和香菜看完的。
2019年夏
53.7SEEDS
夏季生存要素的动画之一,这作算是更正统派的末世生存,描述的重点是人与人之间在末世下展现的关系,各种各样性格人展现各种各样的人性,只不过感觉并没有写好,本身篇幅不够,也是这么多角色的群像剧,然后不少剧情时间线又不统一,没写好就会变的很混乱,不然作为末世基础的背景设定其实是有点意思的,算是比较令人失望一作。
54.Dr.STONE
夏季生存要素的动画之一,然而这个末世生存的背景只是个皮,后期一转就是在末世展现科学精神,虽然这攀科技的过程有点夸张,而且剧情细节上还是有不少瑕疵的,但是老爹跨越时间界限的互动真的有感动到我,吐个槽,没看过原作最开始看的时候我真特么以为古川和市之濑是主角,结果进入中盘就完全神隐了草。
55.你遭难了吗?
夏季生存要素的动画之一,硬核荒岛生存,漫画也看了几年了,动画整体上还是挺满意,虽然删了狗粮组和老爹的戏份,不过作为很大可能只有这一季的动画,删了这部分也是无可奈何的,还有我很喜欢动画CAST的选择,几位CAST选择都很合适,能够在荧幕上看到誉爷宠溺紫音足够让我开心。
56.彼方的阿斯特拉
夏季生存要素的动画之一,最初看彼方的阿斯特拉还以为会变成无限的未知那样的宇宙大逃杀式,考验封闭环境里的人性关系,然而并没有,不知不觉大家关系变得紧密,变得更像是宇宙探险片;突入后段以后,角色、历史、世界的真相开始揭露以后,让主题瞬间升华了,故事越发扣人心弦,虽然设定与最后的结局都过于理想化,但是看着他们一起经历了这段旅程之后,理想化没有什么不好的,能看到所有人都得到幸福就是最好的结局。最后这片不少笑点的插入真是合理而有趣,而且很好的缓冲了某些相对压抑的剧情,让这个故事整体显得那么阳光和正能量。
57.Re:Stage!Dream Days♪
本来以为这个偶像企划只不过是个小企划,毕竟很少见人说,要不是两年前对鬼头产生了兴趣去谷歌了一下,知道了这企划,然后还是和泉的人物原案,就记住了;今年难得动画出了稍微看了一下,不知不觉倒也是看完了,蛮套路的偶像动画,值得庆幸的是至少没有像WUG二季那样爆炸了,意外的很稳健的做完了,虽然最后结局的live的部分有点廉价感,明明前面其实有几场LIVE演出都不错,还有一些手绘LIVE片段作画挺好的,然而偏偏在结局拉胯了。
58.平凡职业成就世界最强
低成本制作的穿越异世界龙傲天轻改,战斗靠劣质特效和3D效果糊弄,日常作画和绘柄倒是不怎么崩,也算在有限成本下尽量做好的地方,前期奇遇 爬塔的剧情还是有点意思的,后面就是纯粹主角强无敌的无脑爽片套路,女主虽然很贫但是很骚很可爱,几位女角的CAST都很熟所以也算是个个人小看点。
59.为了女儿,我说不定连魔王都能干掉。
最初是为了kanonchan来看的这片,然后被这个女儿萌到,女儿好可爱啊好可爱啊,不得不说这片的剧情是真的平淡如水,就是纯粹养女儿日常,而且基本没有什么大波澜,如果对女儿没有爱的话,大概无法坚持看完吧。
60.致曾为神之众兽
这片设定题材其实还有挺有意思的,然而剧情本身就很一般了,而且中盘基本每话都是同一个套路下去解决曾经的队友,变得沉闷无趣,后期大BOSSU1登场以后虽然起了点波澜,一波超展开以后又变了回去,动画本身对剧本的处理也不好,加上制作本身也没啥亮点,算是前期有所期待,但是最后颇为失望的作品。
61.擅长捉弄的高木同学 第二季
二季还是原来的味道,甚至撒狗粮更狠了,高木几次操作我都觉得很直球了,可惜西片太木了,还好结尾西片终于A了上去,不容易啊;二季配角的戏份更多,很好的缓解了一直围绕主角撒糖的审美疲劳。
62.科学的一方通行
直说我冲着chanrina来看的这片,然而chanrina的戏份太少了,所以我看得蛮不爽的,这片作画也不怎么行,这主线剧情讲的倒是挺直白,但是我并不觉得这个剧情多有趣,还不如多给点小信和chanrina的互动。
63.街角魔族
如果印象没错今年应该是芳文社动画近年来最少的一年了,作为今年唯一的芳文社动画,虽然很明显能看出制作比较一般,但是动画整体却表现得很棒,高于一般水准的轻百合萌豚片,这不只是归功于很本身很不错的原作,也归功于制作组的用心,对整体剧情规划很走向,在有限作画资源下还原原作优点的演出,与及kokochan和阿卡林的精彩演绎;虽然有一些蕴含深意的背后设定,但是这季动画并没有很深入的去描写,所以可以很轻松愉快的去享受本作;最后吐个槽,近几年难得能在非子供向作品里这么轻松的看魔法少女题材动画。
64.满月之战GRANBELM
百合 萝卜的题材让我不容错过,整体制作水平也很不错,作画很稳,打戏也挺好看的,虽然有些地方特效过度看得有点花,萝卜的机设不得不让我想起魔神坛英雄传;故事开局很打动我,中盘虽然有点残酷,但是能接受,而且我不知为何始终抱持着希望,岛袋和阿酱的百合糖我看得很爽,但是结局过于残酷了,我本以为会是舞HIME那样的结局,所以本质又是一个少女们的残酷物语;这片CV阵容很不错,还能看到姬样,而且能听到姬样唱歌,简直血赚。
65.拳愿阿修罗
热血格斗动画,这个3D制作水平已经算是日本TV动画里难得的高水平了,充满了暴力美学的打斗戏份,剧情完全为了打戏而服务没有太多亮点就是搭了个擂台赛,作为最大看点打戏,从头到尾的高质量,不论是整体演出效果还是动作招式的流畅度,作为男性看下来简直爽飞了,真是野性魅力满载的动画。
66.COP CRAFT
村田莲尔的人物原案,贺东招二的原作,怎么就傍上了这么个烂制作,从第三话开始就一路走低,各种PPT和张数不够的作画看得我蛋疼,明明这个背景设定有点像黑衣人故事还是有值得一看的地方,而且村田的LOLI一直都很好舔,真的太遗憾了。
67.期待在地下城邂逅有错吗
保持在一般水平之上的轻改动画,不过整体上不论制作还剧本都不如一季出彩,剧情很明显有赶的痕迹,祈之助这次戏份没一季那么路人,大西这次台词估计还不如一季的149WWWW
68.肌肉少女:哑铃,能举多少公斤
硬核健身宣传片,剧情基本围绕着各种健身科普,女主声优埃日混血的新人和界人是真健身达人,你们是真会找。
69.中之人基因组[实况中]
奇葩片,这破片设定上要是不拿什么直播做噱头的话,应该不会显得那么奇葩,这设定根本没意义,只让人觉得搞笑;整体上制作水平又不错,本身剧情里也需要有太多很强的作画戏份,保持绘柄很稳,不论男女人物美型,就是某羊驼太生草,加重片子的搞笑感。
70.君主•埃尔梅罗二世事件簿 魔眼收集列车
基于FATE世界观与设定下的推理,作为非月球人只能感觉到不明觉厉,所以只能去舔魏霞马的格蕾和祈之助妹妹就完事了。
71.海盗战记
非常难得一见的富有厚重历史感的传记动画,严谨的故事背景承托下的严肃剧情,精良的制作通过背景美术、人物作画、背景音乐、演出效果呈现出一个栩栩如生的维京时代;剧本基础差不多是个以复仇为基调的人物成长传记片,只不过这季动画中盘以后的剧情,与其说是看复仇者托尔芬的复仇之路,还不如说是通过他的眼睛去看,身怀民族荣耀的阿谢拉德如何通过阴谋算计、忍辱负重去对维京人“复仇”,最后为了守护自己民族与荣耀而“献身”,这季作为主角的托尔芬基本没有什么大的心理成长,而且在最后还丢失此时此刻人参的最大目标,只能等二期了;最终话的演出非常有创意,那把剑闪回各种回忆片段之后留下新角色的二季伏笔,直到最后都保持着高水准。最后来吹一波小静,在托尔兹事后的那段戏里,那段嘶吼实在震撼我心。
72.只要可爱即使是变态你也会喜欢我吧?
全员变态的后宫剧,有一定悬疑元素做噱头,有些镜头运用很奇怪,感觉可能是为了展现变态这一特质?主要还是卖角色动画,抖M巨乳痴女学姐的彩喵、抖S萝莉学妹的chanrina、暴露狂妹妹的本渡等等。
73.女高中生的无所事事
让我想起了男高日常,同样的高质量的搞笑校园日常,只不过这片更加无厘头,没心没肺一点,基本上笑点满载,整季看得很开心;然后这CAST阵容也相当可以,松岗和岛崎两虽然是配角中配角,但是那段戏联系两中之人实在太过搞笑让我印象深刻。
74.战姬绝唱SYMPHOGEAR XV
期待已久最终季,虽然从4季开始剧情是越来越一般了,这季也是延续4季的情况,其实本身这个故事要续写下来变成这样也是蛮无可奈何的,但是这最终季抛出剧情不太出色的部分,作为粉丝来看可以说是接近完美收尾,满满的情怀,超赞无比的变身动画,还看到三季的人偶回归,甚至最期待的卡萝再登场都有了,甚至还有新歌,一本满足好么,延续作品风格的超燃最终战,以及最后等待许久的响爷与miku太太的糖,爽死了。(当然作为真正的结局还得等今年的LIVE啊)
75.魔术学姐
天然呆学姐通过犯蠢卖肉的福利短片,本渡枫这个学姐是真的很可爱而且很大,无法拒绝,而且篇幅不长,调剂生活情趣的作品很合适2333。
76.炎炎消防队
作画很屌很赞,打戏非常非常好看,只是这个剧情,很标准的少年漫风格,说不难看也不会,但是直到看完我都没觉得太有趣?不知道是原作的锅呢还是动画脚本演出的锅,前期是真没看出来后期主角能力能到超光速,这个战力提升可太屌了,而且有迹可循的这片主角群简直弱势群体,反派战力感觉过于屌爆,我还是蛮好奇这个局势要怎么翻的;还有不得不说这片的背景设定讲述的太隐晦了。
77.异世界超能魔术师
套路到不能再套路的异世界穿越厕纸轻改,不论设定还是剧本,没有任何可圈可点之处,各方面都很一般,可以说是非常标准的烂片了。
78.重来吧、魔王大人!
同样是异世界穿越厕纸轻改,这片则是烂出了一种境界,作画崩坏比上面那部多多了,剧情奇葩又傻屌,另辟蹊径作为傻屌搞笑片去看或许还能体验一波生草的快乐。
79.普通攻击是全体攻击而且能二次攻击的妈妈你喜欢吗?
这个卖妈片是真的有点微妙,老妈吊打全剧所有角色的设定,在某些段落不太能接受,母控片没问题,但是我更希望看到的是展现母性魅力的母控片,而不是把老妈当做美少女去描写,母亲的身份只是一个设定。
80.骚动时节的少女们啊
这片看下来意外的觉得不错,片中以女性的视点去看待青春期骚动与对性的萌芽,其实还蛮有意思的,虽然有多角恋的成分,但是实际从头到尾都觉得某两对稳得一批,剧情上难免有夸张成分,还是在可接受范围内,然后我很喜欢最后结局的演出,有种骚动时节少女们放肆青春的感觉。
2019秋
81.BEASTARS
年度最优秀的3D TV动画,全片好多段落能看到各种非常牛逼的动画演出,比如第7话那段梦的演出,然后OP的定格动画整体效果也好棒,让我想起犬之岛了,说实话这个时代除了一些实验动画和艺术广告片,感觉都很少看到定格动画了(也可能是我涉猎的少;说到这片剧情,看这片一定要代入片中独特的世界观去理解角色的行为逻辑,以现实的价值观去看待角色的话,有些行为可能没那么好接受,比如兔子;虽然兔子不错,但是我还是好想看到阿酱的母狼赢,然而这并不可能。
82.Fairy gone 2
第二季严重改观,第二季完整展现了世界观以后,叙事上也更直接,相比第一季就好接受很多,几个势力,不同角色的行为逻辑变得更清晰,只不过百合入脑的我看到最后姬友没了还是不太能接受,按这剧本是能猜到两女主是莫得机会,关键是两人的互动那台词,对百合入脑的人来说还挺甜;虽然二季有改观,一二季整体讲完整了一个还算能自洽的故事,但是这个故事感受上并不够有趣,PA又一次原创作死了。
83.Fate/Grand Order 绝对魔兽战线 巴比伦尼亚
有钱工期控制也不错,所以作画挺屌,女角色各种骚,打戏也挺好看的,作为非月球人看这些就蛮爽了,至于剧情挺无聊的,用了一季时间感觉主线剧情就没怎么走过,男主某些行为我是真的看懵了,特别是跳楼那段,完全无法理解,纯粉丝片非粉丝可能没法GET到完整乐趣。
84.GRANBLUE FANTASY The Animation season2
同样是粉丝片,GBF就比较好接受一点,毕竟剧本是传统RPG套路,也没有太过复杂的设定,比较好理解,这个二期整体感觉不如一期,包括制作和剧本,二期三章故事,第一章对百合入脑的我来说还算有点意思,第二章闹闹戏份稍微多一点感觉也还好,第三章就觉得稍微有点沉闷了,主要是第三章整体色调发灰,整个气氛比较压抑,故事本身也是。
85.心理测量者3
大型剧场版预告片,二季就已经开始显现出问题了,就是一季铺的世界观是有局限性的,继续续写下去就会不可避免的出现一些细节上的矛盾,抛开这部分问题,作为一作严肃题材的正剧,这系列横向对比还是一直保持着不错的水平,虽然这季作为预告片主要以铺垫为主;这季最佩服的地方是连着8周更新每话传统TV动画篇幅两倍的真人剧时长的动画,而且基本没有什么太崩的地方,少数几场狡哥的打戏也很好看,真不知道工期怎么把控的,太屌。
86.鸭子的天空
年番离完结还有点远,不过90%会追完,基本是符合正常水平的体育番,只不过作为多年NBA观众,主角队这个配置感觉问题很大,后期感觉依旧少不了各种挫折和被虐;kaji和内田弟从MIX一起撸完棒球接着来这打篮球可还行。
87.一弦定音!第二季
进入正题前先吹一波“天泣太特么好听了!天泣太特么好听了!”;二季整体剧情还是少女漫风格,两对CP还有部员的互动都很甜,面对目标的决心与之相应的努力,也很有青春感,进入竞赛戏份以后把古筝魅力全部展现出来,不止是《天泣》,对手曲子也是很好听,只是《天泣》那段演出伴随着两季以来所有的回忆爆发出来,直击心灵,真是感动到泪水自然而然的在眼眶打转。没错这个动画制作是不算好,作画不怎么样,故事也比较老套,但是两季看完以后,伴随主角一路走来,如果是比较感性的人能够在最后两话里收获不少感动。
88.歌牌情缘3
多年等待终于能看到三季,又可以吃饭睡觉虐太一了;第三季整体还是那么稳,不论是制作水平还是剧本素质,角色们在稳步成长与变化,比如太一对歌牌的态度,千早面对未来的选择;前半季最后还被原田老师的戏份,他的坚持深深打动;这季几场竞技歌牌的演出依旧那么让感到热血崩张,这么多年的等待并没有白等。
89.NULL & PETA
今年在TV动画里整体缺少百合POWER,所以能在年底看到ajuju和魏霞马共演的百合泡面动画,就很快心,而且这片意外的在剧情上很有想法,前期看着像正常的轻松搞笑百合喜剧,到了后期反转意外的能收货不少感动,作为一部篇幅很短的泡面动画,真的是意外的惊喜之作。
90.我们真的学不来!
正常看完这个第二季的人应该大部分对这个结局不太满意吧,二季整体剧情在结尾之前部分其实比第一季我觉得要更有趣一点,学园祭的连环误会有都合的成分,但是确实是蛮有趣的一段剧情设计;可是这个结尾操作是真的让人无法可说,看着想要做个开放结局,却又疯狂暗示武原赢了,问题不是谁赢谁输,而是两季下来,正片中剧情里并没法支撑武原赢了这个结尾,实在不懂这结尾是怎么想出来的,何况原作漫画还没完结呢,完全没必要在这里留暗示性这么强烈的结局。(不过这片动画就此完结最大的遗憾就是没法再看到几位CAST在NICO生放节目上一起玩游戏了)
91.刺客守则
制作素质严重不行,剧情跑火车,打戏能减就减,不能减的做的也不怎么样,然后男女主的互动演出经常让我觉得像是性转版的黑执事,然而这片整体素质可离黑执事差太远了。
92.碧蓝航线
这应该是年度工期最爆炸的TV动画了,快赶上那年的原书使了,真正用实力证明有钱并不能做出来好动画,人脉和工期把控才是动画制作不崩的基础;仅以目前看到的内容来说,这片还是粉丝向为主,世界观、人物、势力之间状态都没有很详细的解说,剧情作为非游戏玩家看着一脸懵逼,然后打戏真是一锅乱炖大杂烩,真是各种类型的战斗风格演出都有,其实看着还挺爽,就是不能去细究其中的逻辑问题;其实如果工期问题制作不太崩的话,这打戏和卖萌卖肉的戏份作为非粉丝来看应该也能看得爽,然而没有如果;最后这片对我个人来说还有个大看点就是难得能在这TV动画看到HO酱有这么多的戏份。
93.非洲的动物上班族
低成本高质量的社畜喜剧,用诙谐戏谑的方式以动物拟人夸张化演绎了社畜日常,而且基本都是现实中确实会遇到的种种案例;然后这片CAST阵容是真的屌,在最后甚至能听到很久没在TV动画里听到的若本叔。
94.高达创形者 再起
前中期真的觉得就是延续上一作的感觉,甚至觉得更子供向,直白点感觉剧情更弱智了,结果后期最后两话直接把格局拉大了,人物刻画也更深刻了,而且甚至有那么点正统派高达作品有的对战争深刻描写,其实作为局外人的观众,前中期这个任务背景没那么简单,不是单纯游戏任务,只是没想到最后能引爆成这样,这个反差真的惊喜;而且伴随着剧情反转以及最后两话的刻画,让风见这个丑角变得越发真实;现在就看二期如何去演了,不要太拉跨的话应该能比上一作整体要好看很多,上一作是真的全程充满嘈点。
95.拳愿阿修罗 第二季
延续了一期的高水准,依旧是热血奔涌的暴力美学,只想说第三季什么时候来。
96.刀剑神域 Alicization篇 War of Underworld
依旧是高水准的制作,这期叙事节奏比上一期要好一点,更紧凑一点,只是这个剧情,好多段落我是真特么想笑....作为当年MMORPG游戏一路玩过的一员,RO、传奇、奇迹、天堂二等等,我是能理解川原想要写大型团战、国战PVP的渴望,但是这搭的舞台实在逻辑上没法说服我,最后只能不去细究剧本只当看着爽了,还好这期打戏不错,女主角争风吃醋的戏份也很有趣,然后后宫团也要开始正式上线了,期待第三期。(吐个槽,SAO作为新时代最富人气,商业化程度最高的ACG作品之一,这爱丽丝篇我印象中没记错的话,从一开始的年番变成分割半年,现在又切了一刀半年变成两季,不得不说动画业界跟十年前真是差太多了)
97.非枪人生
背景设定有点赛博朋克感,大型企业、与之对应反差的贫民区,还有机械义肢、义体等等赛博朋克的常见设定元素;只是故事水准就比较一般了,前期这个喜欢说空话的废材男二蛮拉观感的,中期那段设计兵器、英雄的剧情有点意思,只是这样的故事在这一季的动画里显得分量太轻了;然后祈之助在这片的演的角色可以说全年里最让我觉得特别的,虽然差不多是个路人,但是听她口吐芬芳就觉得很爽2333
98.高分少女 第二季
延续一期的高水准,最后在非常优秀的演出下完结,又收割到了我的眼泪;作为一个直男,最后那段剧情,下定决意的一场战斗输了,喜欢的女孩子可能未来难再相见,面对退回的戒指,靠自己奋发理解大野的真意挺难的;所以小春的出场推一把真的很重要,然而这段戏对小春真的太不友好了,从第一季就知道小春注定赢不了,但是小春真的太好了,真的不想看到她被虐,心疼。
99.巴比伦
一部探讨善与恶和生死观的严肃正剧动画,剧情必然会存在争议,而且有怪力乱神的成分,再加上二章最后第7话的虐杀戏份,更加加深了争议;剧情方面个人看法觉得还好,第一章的善恶辩论、和第二章自杀法辩论都蛮有意思的,还有考哥那段对魅惑描述简直斯巴拉西;然后剧情以外不得不吹一波这片的演出是真的屌,特别是第二话的演出,通过倒叙插叙、画面比例变化运用、意象化的图像等等手法,将一场问讯做得非常好看,而且作画也HOLD住了,角色演技的各种细微表情表现得惟妙惟肖,还有第7话最后虐杀的戏份通过交叉蒙太奇更加加深其中的残忍;鉴于第三章的第8话刚出,而且格局拉大了,对后期剧情持谨慎态度,大概率会有更争议的内容,而且崩的可能性不小;单纯的很想推荐一下对动画演出感兴趣的人可以去看看第二话。
100.美妙射击部
这片制作上很有那年后街女孩的感觉,基本就是PPT,射击题材的美少女轻百合动画,时代告诉我们美少女轻百合是个框什么题材都能往里面套,CAST阵容告诉我们这片本质是百万片场。
101.梦幻之星online2
网游改编动画,纯粉丝片,非粉丝看下来有一定困难,上半季的前中期便当送的有点勤,而且这剧的价值观有点难把握,有人便当完了以后好像剧中人没啥感觉似的,接着该干嘛干嘛,可是后面看又希望尽可能的保护拯救所有人,感觉前后价值观错乱,可能演出的锅,后面涉及时间穿越剧情比起之前的剧情更有意思一点,下半季还是有一定看点的。
102.虚空魔境 第二季
这个二季感觉还是一季那个问题,就是老套的王道少年漫,剧情没有太大的创意,缺乏变数,然后节奏又死慢,用了一整季的时间就是男主在闭关练级,放回二十年前这样演或许可以,放现在这样演可太特么闷了,而且这季凹酱戏份少了很多,只看玉米粒饮鸩止渴可特么难顶了。
103.七大罪 诸神的逆鳞
跟原作一样动画也是一路走低水准,该说还蛮相配?原作最好的部分也是一期做得最好的时候,我从一期结束开始追漫画到现在,原作剧情是真的一路慢慢拉胯,反正就是正反派互相演,互相争奥斯卡影帝影后,逻辑什么的喂狗去吧,虽然也有一些比较感人的剧情,比如这季动画里团长和傻白3000年的经历,然并卵整体的剧情是真不行,所以动画本身也就看着消遣,刚好动画从二期开始制作就一路掉价,这季也就没什么意外的了;这动画现在最大的贡献就是每年的EVENT,毕竟有不少病友,还像kaji的士下座这种老梗。
104.喜欢本大爷的竟然就你一个?
整体水平还不错的轻改后宫喜剧动画,前期的反套路和后期的对决所谓真后宫男主还是有点意思,那一张一直出现的长椅蛮有趣的,结局作为一部TV动画的结尾,操作有点骚,希望今年那个所谓的SP能做完结局,几位女主都蛮可爱的,而且人设很好看,动画的作画也挺稳,没怎么崩,CAST阵容也不错。
105.我的英雄学院 第四季
4期了,动画开始要进入骨头用力也救不回来的戏份了,而且这季从时间上推算,我猜测应该是在做4期动画的同期把资源都花去做剧场版了吧,这上半季整体制作水平不如之前三季了;剧情方面,这上半季刚好做到了个人看法原作最后一段能看的剧情上了,百万这个角色创作出来真是严重打脸主角,如果没有百万主角那些问题不会这么明面的甩出来;因为我是在出久甩出鞭子以后弃坑的,所以后面不太清楚,不过至少动画从这里开始后面学园祭、AB班混合训练真不怎么样,就看骨头能救回多少了。
106.慎重勇者 ~这个勇者明明超强却过分慎重~
很有趣的异世界穿越轻改喜剧,前中期傻屌剧情能收获不少简简单单的快乐,最后的剧情反转还很有感人要素,又能收获点滴感动,算是难得的水准之上的轻改作品;akichan在这作也贡献了超赞的表演。
107.战×恋
从设定上就是毫不掩饰的纯粹卖肉动画,这个节能自闭阳痿男主是看着人脑壳疼,禁不住这个CAST阵容非常不错,而且有最喜欢的chanrina,而且还戏份不少,这卖肉剧情又相当直白,能听到不少牙白的内容,所以看完还是觉得不怎么亏的。
108.放学后桌游俱乐部
不懂桌游,在我看来这片算是蛮“硬核”的桌游科普片,然而剧情实在有点水,看完我印象最深的还是第一话marinka的真空逛街,与及最终话的莫名其妙自闭。
109.旗扬!兽道
作为成立不久的新动画公司ENGI的第一部TV动画,整体表现还是不错的,制作上很稳,就是作为一部穿越异世界的搞笑片,中期的段子有点重复和平淡不那么有趣,我很想说你就不能对公主好一点233公主人设那么可爱,最后都快调教成变态抖M了。
110.星合之空
可能是今年最遗憾的TV动画作品,遗憾的是因为大人的原因可能没法看到后半季,没法看到它完整的样子;我真的蛮喜欢这片的,台面上的打网球非常有体育作品的优点,有少年挥洒汗水的青春,有比赛时的澎湃热血,而且打网球演出作画也不错,虽然明显能看出不少兼用卡;台面下的家庭伦理戏也很有想法,蛮有看点的,只是最关键的如何解决的戏份看不到,所以对这部分的戏份就无从评价了;最后不得不吐槽,怎么你们一个网球部,就全员集齐的家庭问题,莫不是被诅咒了2333
111.书虫的下克上~为了成为图书管理员而不择手段~
制作上差强人意,低开高走,意外的还不错的穿越轻改,前期女主所谓的书虫却有不少感觉上没有常识的行为,配上偏子供向风格的人设,感觉有点有点弱智,中后期智商上线,开始造东西以后倒是有趣不少,虽然制作上有限,但是动画演出与中后期剧情表现出舒适感,让人看着还挺暖的。
112.歌舞伎町夏洛克
最开始被这个落语推理的新奇设定吸引,然而前中期的单元剧剧情过于戏谑,不懂为什么一定要把这些配角侦探塑造成小丑,最初设定上的所谓推理对决在这样塑造下根本无法成立,后期主线以后剧本质量才开始提高,变得有趣,有迹可循猜测下半期剧本估计还是会落到福尔摩斯和莫里亚蒂的对决上,所以这些配角侦探感觉只会越来越边缘化,就看会不会是真的这样演了;目前看这片制作不错,作画演出尚可,主线剧情有不少看点,就看下半季的表现了;最后吹一波,村濑步的女声太特么屌了,然后闹闹又要风评被害了WWWW
113.无限之住人
应该是年度血浆度最高的动画,看过旧版动画,但是没看过原作漫画,目前看整体表现还行,特别是血浆的表现上,然后在制作上能看出想靠演出效果去尽力还原一个武士时代,就是剧情衔接上感觉有问题,能感觉有一定的剧情删减。
114.厨神小当家
童年粉碎机,删删减减一整季,结果还没做完麻婆豆腐,靠着仅有的一点情怀看完了。
115.神田川JET GIRLS
ATX限定,看似跟那年的侧车搭档很像,同样虚构一门女女搭档竞速的竞技,也有百合要素,然而这片更加专注于卖肉上了,射击爆衣的设定不言自明,所以主要看点还是奶子。
116.我,不是说了能力要平均值么!
异世界穿越女傲天,本以为会是个百合片,结果是个纯正NETA片,问题是全靠NETA要撑起一季动画哪有那么容易,所以中后期不可避免的腻味了,而且这个冒险日常是真的很白开水,然后最后的结局剧情告诉观众我是有主线的,只不过刚刚迈出起点,就很囧;亜方逸树的人物原案很可爱,动画还是有表现出这份可爱的。
117.超人高校生在异世界也可以活的风生水起!
一流制作,三流剧本,就是放开大脑去看也能被生草的剧情搞笑,比如后方甩电磁炮前方剑盾堆人头,然后还有那个人工制导导弹,操作太骚了;不得不说这片的制作太好,印象很深的某一话男主跟某配角talk戏份演出甚至有余力画一段幼女在嬉戏,卖肉卖萌的戏份和作画都不错, 矢野茜画奶子无法拒绝,chanrina的卖萌回更加无法拒绝,所以这片我个人看完还是很爽的;最后吐个槽矢野茜三次总作监全都有chanrina你们可真有缘,与及小静小林难得又一次共演又不是一对真是遗憾233
118.银河英雄传说 Die Neue These 星乱 第2章
总体上保持了一季原来的水准,就是这季战斗戏份感觉颇水,比较一般,文戏倒还好虽然有一定的剧情压缩,大公过世以后mamo那段演技真的赞。
119.食戟之灵 神之皿
最想说的是在这季结束多好,何必一定要去出下一季的药哥篇呢,药哥篇是真的不怎么样,只能说食戟这待遇真好;这季动画算是延续了二三季的水平吧,作为美食动画关键的菜品绘柄一直都很稳,让人很有食欲,食戟卖点爆衣演出也依然稳定,剧情就是以赶为主了,不过本来这剧情也是越来越没新意了,没什么意思,所以赶点还是蛮合理的。
120.入间同学入魔了
从人设、色指定、背景美术、剧情上看有种复古十几年前的搞笑动画的感觉,目前半季下来整体很稳健,搞笑的段子水平一直在线,算是蛮有水平的搞笑片。
总体上这一年比较不够爽的地方就是整体缺少百合POWER,作为百合入脑患者今年多少有点遗憾,希望明年的安岛不要太让我失望。
花了一周多的时间,断断续续又码了一万多字,可特么废了我好多脑细胞,需要再去刷一遍今年的24小时不准笑,再好好轻松一下。
原版巴巴多斯只在加勒比海最东
来源:申江服务导报
“浩瀚的太平洋上,洒落着颗颗明珠,贝劳共和国就是……”这句《大撒把》里的经典台词,用在最近挺热闹的某旅游网站“8万打车费”事件中,可以改成“浩瀚的加勒比海上,洒落着颗颗明珠,巴巴多斯就是最迷人的那一个……”没错,正宗的巴巴多斯,是个岛国,不在俄罗斯,也不在希腊,而是在绝美的加勒比海上。
“一生必去”蕾哈娜的故乡
巴巴多斯(英语:Barbados)是位于加勒比海与大西洋边界上的独立的岛屿国家,是西印度群岛最东端的岛屿,首都布里奇顿。岛屿面积430平方公里,主要是低地,在岛的内陆有一些山丘。
1518年西班牙人登岛,而十年之后这座岛屿又被葡萄牙人占领,“巴巴多斯”就是起源于葡语,用来描绘岛上遍地都是野生无花果树的场景。之后,这里成为英属殖民地,岛上的风土人情还都保留着英国殖民的痕迹,人称加勒比小英格兰。
千万不要小看这片弹丸之地,如今,这片原本被称为“殖民者的粮仓”的肥沃土地,成为了一个真正意义上的发达国家——人均GDP将近两万美元。BBC把这里评选为“一生必去的50个国家”之一。
因为特殊的地理优势,这里飓风很少,日平均最高气温26℃,日平均降雨量少于0.25英寸,年日照量达到3000小时!很难想象,世界上还有其他地方能拥有比巴巴多斯更完美的气候。也正因为此,这里也是欧美明星的度假胜地。悄悄说一句,巴巴多斯还是蕾哈娜的故乡哦。
白天玩海,晚上浪个夜生活
这座珊瑚石灰岩海岛是加勒比海诸岛的旅游胜地,东西南三面环海,西边海域风浪较小,适合游泳、出海和潜水,海面清澈见底。不用深潜,就能浮潜着探索丰富的海底生物和珊瑚礁,也可以乘坐潜水艇去海底探寻失事的沉船,甚至是和海龟一起在加勒比海游泳!而东部及南部海域则风急浪高,适合冲浪,超多欧美巨星经常会来这里冲浪,切磋技艺。
除了玩海,还能在岛上寻访殖民时期的遗迹,参观巴巴多斯博物馆,国家英雄广场(原特拉法加广场)和西半球最古老的犹太教堂,还有乔治华盛顿住过的房子和做礼拜的教堂。岛上的风土人情,还保留有英国殖民的痕迹。
首府布里奇顿有很多购物的地方。布里奇顿游船码头有免税购物商场,在布罗德街还有高档时装店。其它活动包括游艇,垂钓,观看板球比赛,还有巴克斯特路的夜生活。
巴巴多斯的物价比国内高,接近欧洲水平。但南边的酒店和交通会比较便宜,豪华酒店则集中在西海岸的St.Jam es区,且大多拥有私人海滩,也是明星狗仔队云集之地。
巴巴多斯更适合自驾游,但道路比较窄,路标经常看不清,容易迷路。但当地居民都很热情,大胆向他们问路吧,他们都讲英语的哦。
喝海盗之酒,飞鱼料理当零食
而夜生活里最不能缺少的,就是朗姆酒,巴巴多斯的特产。以甘蔗为原料酿制蒸馏而成,也被称为“海盗之酒”,传说是海盗们最喜欢的饮品!来巴巴多斯的游客一般都不会放弃品尝美酒的机会。
巴巴多斯岛上盛产甘蔗,甘蔗种植面积占全岛可耕地面积的五分之四以上。每年6月的最后三个星期至7月的第一个周末,巴巴多斯人民为了庆祝甘蔗的丰收都。
会举办非常隆重的甘蔗节。
当年看《少年派的奇幻漂流》时,里面的飞鱼场景也非常令人印象深刻。珊瑚岛国巴巴多斯正是盛产飞鱼的地方。这里的飞鱼种类近100种,小的不过手掌大,大的有2米多长。
作为“国鱼”,飞鱼在当地极受欢迎,渔民们每天出海主要是为了捕捉飞鱼,甚至连国徽上都有飞鱼的身影。飞鱼料理也是巴巴多斯的一大特色,去到那儿一定要试一试,可蒸可炸,肉质鲜嫩。在当地集市上还可以买到用新鲜飞鱼肉做成的炸鱼丸,这几乎是所有巴巴多斯人最喜爱的零食了,甚至电影院的小卖部也会出售呢。
巴巴多斯的Oistins海边小镇上每周五晚上6点后会有一个海鲜市场,可以吃到很多当地特色的海鲜烧烤。当地人和游客都把这里当做周末派对,很多人更是伴随着加勒比风格的音乐载歌载舞。
搭加勒比邮轮
那么问题来了,人少景美的巴巴多斯,要怎么去呢?
2017年6月1日起,中国公民持有效护照可免签入境巴巴多斯,停留期不超过30天。入境时需要提供有效护照、回程机票、在巴住宿信息,同时可能会被要求出示在巴旅行费用证明(如现金或信用卡等)。
但是需要注意的是,虽然免签了,但是由于中国并没有直飞巴巴多斯的航班,需要先到美国、加拿大等国家转机,还需提前办理美国、加拿大的签证才能前往。
目前国内还没有直飞巴巴多斯的航班,大多数航班都会在伦敦或美国转机,单程飞行时间经常高达30 小时。更致命的是,机票价格还奇贵,2个月后的往返含税机票价格大约在1.1万元左右。
当然,两全其美的平价解决方案也不是没有,那就是搭乘加勒比海航线的邮轮,包吃包住的价格,比单买一张往返机票都便宜。在浩瀚的加勒比海上,邮轮就像是穿梭巴士,分别停靠不同的岛屿国家,你只要选择喜欢的线路就可以了。加勒比海邮轮生意常年奇好,迪士尼、公主和地中海这几家,不提前3个月到半年,都订不到合适的日期和舱位。
到私人岛屿一定要打卡
除了古巴、牙买加这样的大国,一般岛国一天玩下来妥妥的。一圈邮轮下来,目的地清单上,又能多好几个加勒比国家。
比如,去拿骚看这个著名的粉红沙滩。去加勒比海上真正的瑰宝圣巴茨,既时尚又酷炫。在这里,你有机会见到很多名人。巨星碧昂斯和Jay-Z在圣巴茨岛两次被认出,保罗·麦卡特尼与亚瑟小子也曾在这里被偶遇,林赛·罗韩在这里发过一张穿性感比基尼的照片……
开曼群岛也一定要去,加勒比海地区最好的浮潜和深潜区域之一。在首府乔治敦附近探索Cali沉船,在Rum Point的珊瑚花园与海龟交流,或是在刺鳐城的浅滩给鳐形目喂食。在渺无人烟的大开曼北部海岸骑马或游泳,那种浪漫也如梦似幻。
还有一个岛,不去就亏了。那就是巴哈马,这里有一堆邮轮公司的私人岛屿,只有邮轮游客才能享用的,而且岛上各种吃喝不额外收费,玩乐收费相当白菜。
比如,地中海邮轮的Ocean Cay大洋岛,诺唯真邮轮的Great Stirrup Cay,迪士尼邮轮的Castaw ay Cay漂流岛以及公主邮轮的Princess Cay公主岛。
不用想要去哪里,也不必担心走错了路无法回船。很纯粹的放松,很纯粹的休闲。岛上的设施相当完善,且非常环保。带上一本书,坐在躺椅上,吹吹海风。选一个感兴趣的水上项目,与大海来次亲密接触,或是就在酒吧,点上一杯椰子鸡尾酒,啥也不干啥也不想,加勒比海盗的快活与肆意,大抵如此吧。(董韵怡 夏蕾蒂)
Netty如何做到单机百万并发?
相信很多人知道石中剑这个典故,在此典故中,天命注定的亚瑟很容易的就拔出了这把石中剑,但是由于资历不被其他人认可,所以他颇费了一番周折才成为了真正意义上的英格兰全境之王,亚瑟王。
说道这把剑,剑身上铭刻着这样一句话:ONLY THE KING CAN TAKE THE SWORD FROM THE STONE。
虽然典故中的 the king 是指英明之主亚瑟王,但是在本章中,这个 king 就是读者自己。
我们今天不仅要从百万并发基石上拔出这把 epoll 之剑,也就是 Netty,而且要利用这把剑大杀四方,一如当年的亚瑟王凭借此剑统一了英格兰全境一样。
说到石中剑 Netty,我们知道他极其强悍的性能以及纯异步模型,释放出了极强的生产力,内置的各种编解码编排,心跳包检测,粘包拆包处理等,高效且易于使用,以至于很多耳熟能详的组件都在使用,比如 Hadoop,Dubbo 等。
但是他是如何做到这些的呢?本章将会以庖丁解牛的方式,一步一步的来拔出此剑。
Netty 的异步模型
说起 Netty 的异步模型,我相信大多数人,只要是写过服务端的话,都是耳熟能详的,bossGroup 和 workerGroup 被 ServerBootstrap 所驱动,用起来简直是如虎添翼。
再加上各种配置化的 handler 加持,组装起来也是行云流水,俯拾即是。但是,任何一个好的架构,都不是一蹴而就实现的,那她经历了怎样的心路历程呢?
①经典的多线程模型
此模型中,服务端起来后,客户端连接到服务端,服务端会为每个客户端开启一个线程来进行后续的读写操作。
客户端少的时候,整体性能和功能还是可以的,但是如果客户端非常多的时候,线程的创建将会导致内存的急剧飙升从而导致服务端的性能下降,严重者会导致新客户端连接不上来,更有甚者,服务器直接宕机。
此模型虽然简单,但是由于其简单粗暴,所以难堪大用,建议在写服务端的时候,要彻底的避免此种写法。
②经典的 Reactor 模型
由于多线程模型难堪大用,所以更好的模型一直在研究之中,Reactor 模型,作为天选之子,也被引入了进来,由于其强大的基于事件处理的特性,使得其成为异步模型的不二之选。
Reactor 模型由于是基于事件处理的,所以一旦有事件被触发,将会派发到对应的 event handler 中进行处理。
所以在此模型中,有两个最重要的参与者,列举如下:
Reactor:主要用来将 IO 事件派发到相对应的 handler 中,可以将其想象为打电话时候的分发总机,你先打电话到总机号码,然后通过总机,你可以分拨到各个分机号码。
handlers:主要用来处理 IO 事件相关的具体业务,可以将其想象为拨通分机号码后,实际上为你处理事件的员工。
上图为 Reactor 模型的描述图,具体来说一下:
Initiation Dispatcher 其实扮演的就是 Reactor 的角色,主要进行 Event Demultiplexer,即事件派发。
而其内部一般都有一个 Acceptor,用于通过对系统资源的操纵来获取资源句柄,然后交由 Reactor,通过 handle_events 方法派发至具体的 EventHandler 的。
Synchronous Event Demultiplexer 其实就是 Acceptor 的角色,此角色内部通过调用系统的方法来进行资源操作。
比如说,假如客户端连接上来,那么将会获得当前连接,假如需要删除文件,那么将会获得当前待操作的文件句柄等等。
这些句柄实际上是要返回给 Reactor 的,然后经由 Reactor 派发下放给具体的 Eventhandler。
Event Handler 这里,其实就是具体的事件操作了。其内部针对不同的业务逻辑,拥有不同的操作方法。
比如说,鉴权 EventHandler 会检测传入的连接,验证其是否在白名单,心跳包 EventHanler 会检测管道是否空闲。
业务 EventHandler 会进行具体的业务处理,编解码 EventHandler 会对当前连接传输的内容进行编码解码操作等等。
由于 Netty 是 Reactor 模型的具体实现,所以在编码的时候,我们可以非常清楚明白的理解 Reactor 的具体使用方式,这里暂时不讲,后面会提到。
由于 Doug Lea 写过一篇关于 NIO 的文章,整体总结的极好,所以这里我们就结合他的文章来详细分析一下 Reactor 模型的演化过程。
上图模型为单线程 Reator 模型,Reactor 模型会利用给定的 selectionKeys 进行派发操作,派发到给定的 handler。
之后当有客户端连接上来的时候,acceptor 会进行 accept 接收操作,之后将接收到的连接和之前派发的 handler 进行组合并启动。
上图模型为池化 Reactor 模型,此模型将读操作和写操作解耦了出来,当有数据过来的时候,将 handler 的系列操作扔到线程池中来进行,极大的提到了整体的吞吐量和处理速度。
上图模型为多 Reactor 模型,此模型中,将原本单个 Reactor 一分为二,分别为 mainReactor 和 subReactor。
其中 mainReactor 主要进行客户端连接方面的处理,客户端 accept 后发送给 subReactor 进行后续处理处理。
这种模型的好处就是整体职责更加明确,同时对于多 CPU 的机器,系统资源的利用更加高一些。
从 Netty 写的 server 端,就可以看出,boss worker group 对应的正是主副 Reactor。
之后 ServerBootstrap 进行 Reactor 的创建操作,里面的 group,channel,option 等进行初始化操作。
而设置的 childHandler 则是具体的业务操作,其底层的事件分发器则通过调用 Linux 系统级接口 epoll 来实现连接并将其传给 Reactor。
石中剑 Netty 强悍的原理(JNI)
Netty 之剑之所以锋利,不仅仅因为其纯异步的编排模型,避免了各种阻塞式的操作,同时其内部各种设计精良的组件,终成一统。
且不说让人眼前一亮的缓冲池设计,读写标随心而动,摒弃了繁冗复杂的边界检测,用起来着实舒服之极。
原生的流控和高低水位设计,让流速控制真的是随心所欲,铸就了一道相当坚固的护城河。
齐全的粘包拆包处理方式,让每一笔数据都能够清晰明了;而高效的空闲检测机制,则让心跳包和断线重连等设计方案变得如此俯拾即是。
上层的设计如此优秀,其性能又怎能甘居下风。由于底层通讯方式完全是 C 语言编写,然后利用 JNI 机制进行处理,所以整体的性能可以说是达到了原生 C 语言性能的强悍程度。
说道 JNI,这里我觉得有必要详细说一下,他是我们利用 Java 直接调用 C 语言原生代码的关键。
JNI,全称为Java Native Interface,翻译过来就是 Java 本地接口,他是 Java 调用 C 语言的一套规范。具体来看看怎么做的吧。
步骤一,先来写一个简单的 Java 调用函数:
/**
* @author shichaoyang
* @Description: 数据同步器
* @date 2020-10-14 19:41
*/
public class DataSynchronizer {
/**
* 加载本地底层C实现库
*/
static {
System.loadLibrary("synchronizer");
}
/**
* 底层数据同步方法
*/
private native String syncData(String status);
/**
* 程序启动,调用底层数据同步方法
*
* @param args
*/
public static void main(String... args) {
String rst = new DataSynchronizer().syncData("ProcessStep2");
System.out.println("The execute result from C is : " rst);
}
}
可以看出,是一个非常简单的 Java 类,此类中,syncData 方法前面带了 native 修饰,代表此方法最终将会调用底层 C 语言实现。main 方法是启动类,将 C 语言执行的结果接收并打印出来。
然后,打开我们的 Linux 环境,这里由于我用的是 linux mint,依次执行如下命令来设置环境:
执行apt install default-jdk 安装java环境,安装完毕。
通过update-alternatives --list java 获取java安装路径,这里为:/usr/lib/jvm/java-11-openjdk-amd64
设置java环境变量 export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
环境设置完毕之后,就可以开始进行下一步了。
步骤二,编译,首先,进入到代码 DataSynchronizer.c 所在的目录,然后运行如下命令来编译 Java 源码:
javac -h . DataSynchronizer.java
编译完毕之后,可以看到当前目录出现了如下几个文件:
其中 DataSynchronizer.h 是生成的头文件,这个文件尽量不要修改,整体内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class DataSynchronizer */
#ifndef _Included_DataSynchronizer
#define _Included_DataSynchronizer
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: DataSynchronizer
* Method: syncData
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_DataSynchronizer_syncData
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
其中 JNIEXPORT jstring JNICALL Java_DataSynchronizer_syncData 方法,就是给我们生成的本地 C 语言方法,我们这里只需要创建一个 C 语言文件,名称为 DataSynchronizer.c。
将此头文件加载进来,实现此方法即可:
#include <jni.h>
#include <stdio.h>
#include "DataSynchronizer.h"
JNIEXPORT jstring JNICALL Java_DataSynchronizer_syncData(JNIEnv *env, jobject obj, jstring str) {
// Step 1: Convert the JNI String (jstring) into C-String (char*)
const char *inCStr = (*env)->GetStringUTFChars(env, str, NULL);
if (NULL == inCStr) {
return NULL;
}
// Step 2: Perform its intended operations
printf("In C, the received string is: %sn", inCStr);
(*env)->ReleaseStringUTFChars(env, str, inCStr); // release resources
// Prompt user for a C-string
char outCStr[128];
printf("Enter a String: ");
scanf("%s", outCStr);
// Step 3: Convert the C-string (char*) into JNI String (jstring) and return
return (*env)->NewStringUTF(env, outCStr);
}
其中需要注意的是,JNIEnv* 变量,实际上指的是当前的 JNI 环境。而 jobject 变量则类似 Java 中的 this 关键字。
jstring 则是 C 语言层面上的字符串,相当于 Java 中的 String。整体对应如下:
最后,我们来编译一下:
gcc -fPIC -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" -shared -o libsynchronizer.so DataSynchronizer.c
编译完毕后,可以看到当前目录下又多了一个 libsynchronizer.so 文件(这个文件类似 Windows 上编译后生成的 .dll 类库文件):
此时我们可以运行了,运行如下命令进行运行:
java -Djava.library.path=. DataSynchronizer
得到结果如下:
java -Djava.library.path=. DataSynchronizer
In C, the received string is: ProcessStep2
Enter a String: sdfsdf
The execute result from C is : sdfsdf
从这里看到,我们正确地通过 java jni 技术,调用了 C 语言底层的逻辑,然后获取到结果,打印了出来。
在 Netty 中,也是利用了 jni 的技术,然后通过调用底层的 C 语言逻辑实现,来实现高效的网络通讯的。
感兴趣的同学可以扒拉下 Netty 源码,在 transport-native-epoll 模块中,就可以见到具体的实现方法了。
IO 多路复用模型
石中剑,之所以能荡平英格兰全境,自然有其最强悍的地方。
相应的,Netty,则也是不遑多让,之所以能够被各大知名的组件所采用,自然也有其最强悍的地方,而本章节的 IO 多路复用模型,则是其强悍的理由之一。
再说 IO 多路复用模型之前,我们先来大致了解下 Linux 文件系统。
在 Linux 系统中,不论是你的鼠标,键盘,还是打印机,甚至于连接到本机的 socket client 端,都是以文件描述符的形式存在于系统中,诸如此类,等等等等。
所以可以这么说,一切皆文件。来看一下系统定义的文件描述符说明:
从上面的列表可以看到,文件描述符 0,1,2 都已经被系统占用了,当系统启动的时候,这三个描述符就存在了。
其中 0 代表标准输入,1 代表标准输出,2 代表错误输出。当我们创建新的文件描述符的时候,就会在 2 的基础上进行递增。
可以这么说,文件描述符是为了管理被打开的文件而创建的系统索引,他代表了文件的身份 ID。对标 Windows 的话,你可以认为和句柄类似,这样就更容易理解一些。
由于网上对 Linux 文件这块的原理描述的文章已经非常多了,所以这里我不再做过多的赘述,感兴趣的同学可以从 Wikipedia 翻阅一下。
由于这块内容比较复杂,不属于本文普及的内容,建议读者另行自研。
select 模型
此模型是 IO 多路复用的最早期使用的模型之一,距今已经几十年了,但是现在依旧有不少应用还在采用此种方式,可见其长生不老。
首先来看下其具体的定义(来源于 man 二类文档):
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *timeout);
这里解释下其具体参数:
参数一:nfds,也即 maxfd,最大的文件描述符递增一。这里之所以传最大描述符,为的就是在遍历 fd_set 的时候,限定遍历范围。
参数二:readfds,可读文件描述符集合。
参数三:writefds,可写文件描述符集合。
参数四:errorfds,异常文件描述符集合。
参数五:timeout,超时时间。在这段时间内没有检测到描述符被触发,则返回。
下面的宏处理,可以对 fd_set 集合(准确地说是 bitmap,一个描述符有变更,则会在描述符对应的索引处置 1)进行操作:
FD_CLR(inr fd,fd_set* set) :用来清除描述词组 set 中相关 fd 的位,即 bitmap 结构中索引值为 fd 的值置为 0。
FD_ISSET(int fd,fd_set *set):用来测试描述词组 set 中相关 fd 的位是否为真,即 bitmap 结构中某一位是否为 1。
FD_SET(int fd,fd_set*set):用来设置描述词组 set 中相关 fd 的位,即将 bitmap 结构中某一位设置为 1,索引值为 fd。
FD_ZERO(fd_set *set):用来清除描述词组 set 的全部位,即将 bitmap 结构全部清零。
首先来看一段服务端采用了 select 模型的示例代码:
//创建server端套接字,获取文件描述符
int listenfd = socket(PF_INET,SOCK_STREAM,0);
if(listenfd < 0) return -1;
//绑定服务器
bind(listenfd,(struct sockaddr*)&address,sizeof(address));
//监听服务器
listen(listenfd,5);
struct sockaddr_in client;
socklen_t addr_len = sizeof(client);
//接收客户端连接
int connfd = accept(listenfd,(struct sockaddr*)&client,&addr_len);
//读缓冲区
char buff[1024];
//读文件操作符
fd_set read_fds;
while(1)
{
memset(buff,0,sizeof(buff));
//注意:每次调用select之前都要重新设置文件描述符connfd,因为文件描述符表会在内核中被修改
FD_ZERO(&read_fds);
FD_SET(connfd,&read_fds);
//注意:select会将用户态中的文件描述符表放到内核中进行修改,内核修改完毕后再返回给用户态,开销较大
ret = select(connfd 1,&read_fds,NULL,NULL,NULL);
if(ret < 0)
{
printf("Fail to select!n");
return -1;
}
//检测文件描述符表中相关请求是否可读
if(FD_ISSET(connfd, &read_fds))
{
ret = recv(connfd,buff,sizeof(buff)-1,0);
printf("receive %d bytes from client: %s n",ret,buff);
}
}
上面的代码我加了比较详细的注释了,大家应该很容易看明白,说白了大概流程其实如下:
首先,创建 socket 套接字,创建完毕后,会获取到此套接字的文件描述符。
然后,bind 到指定的地址进行监听 listen。这样,服务端就在特定的端口启动起来并进行监听了。
之后,利用开启 accept 方法来监听客户端的连接请求。一旦有客户端连接,则将获取到当前客户端连接的 connection 文件描述符。
双方建立连接之后,就可以进行数据互传了。需要注意的是,在循环开始的时候,务必每次都要重新设置当前 connection 的文件描述符,是因为文件描描述符表在内核中被修改过,如果不重置,将会导致异常的情况。
重新设置文件描述符后,就可以利用 select 函数从文件描述符表中,来轮询哪些文件描述符就绪了。
此时系统会将用户态的文件描述符表发送到内核态进行调整,即将准备就绪的文件描述符进行置位,然后再发送给用户态的应用中来。
用户通过 FD_ISSET 方法来轮询文件描述符,如果数据可读,则读取数据即可。
举个例子,假设此时连接上来了 3 个客户端,connection 的文件描述符分别为 4,8,12。
那么其 read_fds 文件描述符表(bitmap 结构)的大致结构为 00010001000100000....0。
由于 read_fds 文件描述符的长度为 1024 位,所以最多允许 1024 个连接。
而在 select 的时候,涉及到用户态和内核态的转换,所以整体转换方式如下:
所以,综合起来,select 整体还是比较高效和稳定的,但是呈现出来的问题也不少。
这些问题进一步限制了其性能发挥:
文件描述符表为 bitmap 结构,且有长度为 1024 的限制。
fdset 无法做到重用,每次循环必须重新创建。
频繁的用户态和内核态拷贝,性能开销较大。
需要对文件描述符表进行遍历,O(n) 的轮询时间复杂度。
poll 模型
考虑到 select 模型的几个限制,后来进行了改进,这也就是 poll 模型,既然是 select 模型的改进版,那么肯定有其亮眼的地方,一起来看看吧。
当然,这次我们依旧是先翻阅 linux man 二类文档,因为这是官方的文档,对其有着最为精准的定义。
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
其实,从运行机制上说来,poll 所做的功能和 select 是基本上一样的,都是等待并检测一组文件描述符就绪,然后在进行后续的 IO 处理工作。
只不过不同的是,select 中,采用的是 bitmap 结构,长度限定在 1024 位的文件描述符表,而 poll 模型则采用的是 pollfd 结构的数组 fds。
也正是由于 poll 模型采用了数组结构,则不会有 1024 长度限制,使其能够承受更高的并发。
pollfd 结构内容如下:
struct pollfd {
int fd; /* 文件描述符 */
short events; /* 关心的事件 */
short revents; /* 实际返回的事件 */
};
从上面的结构可以看出,fd 很明显就是指文件描述符,也就是当客户端连接上来后,fd 会将生成的文件描述符保存到这里。
而 events 则是指用户想关注的事件;revents 则是指实际返回的事件,是由系统内核填充并返回,如果当前的 fd 文件描述符有状态变化,则 revents 的值就会有相应的变化。
events 事件列表如下:
revents 事件列表如下:
从列表中可以看出,revents 是包含 events 的。接下来结合示例来看一下:
//创建server端套接字,获取文件描述符
int listenfd = socket(PF_INET,SOCK_STREAM,0);
if(listenfd < 0) return -1;
//绑定服务器
bind(listenfd,(struct sockaddr*)&address,sizeof(address));
//监听服务器
listen(listenfd,5);
struct pollfd pollfds[1];
socklen_t addr_len = sizeof(client);
//接收客户端连接
int connfd = accept(listenfd,(struct sockaddr*)&client,&addr_len);
//放入fd数组
pollfds[0].fd = connfd;
pollfds[0].events = POLLIN;
//读缓冲区
char buff[1024];
//读文件操作符
fd_set read_fds;
while(1)
{
memset(buff,0,sizeof(buff));
/**
** SELECT模型专用
** 注意:每次调用select之前都要重新设置文件描述符connfd,因为文件描述符表会在内核中被修改
** FD_ZERO(&read_fds);
** FD_SET(connfd,&read_fds);
** 注意:select会将用户态中的文件描述符表放到内核中进行修改,内核修改完毕后再返回给用户态,开销较大
** ret = select(connfd 1,&read_fds,NULL,NULL,NULL);
**/
ret = poll(pollfds, 1, 1000);
if(ret < 0)
{
printf("Fail to poll!n");
return -1;
}
/**
** SELECT模型专用
** 检测文件描述符表中相关请求是否可读
** if(FD_ISSET(connfd, &read_fds))
** {
** ret = recv(connfd,buff,sizeof(buff)-1,0);
** printf("receive %d bytes from client: %s n",ret,buff);
** }
**/
//检测文件描述符数组中相关请求
if(pollfds[0].revents & POLLIN){
pollfds[0].revents = 0;
ret = recv(connfd,buff,sizeof(buff)-1,0);
printf("receive %d bytes from client: %s n",ret,buff);
}
}
由于源码中,我做了比较详细的注释,同时将和 select 模型不一样的地方都列了出来,这里就不再详细解释了。
总体说来,poll 模型比 select 模型要好用一些,去掉了一些限制,但是仍然避免不了如下的问题:
用户态和内核态仍需要频繁切换,因为 revents 的赋值是在内核态进行的,然后再推送到用户态,和 select 类似,整体开销较大。
仍需要遍历数组,时间复杂度为 O(N)。
epoll 模型
如果说 select 模型和 poll 模型是早期的产物,在性能上有诸多不尽人意之处,那么自 Linux 2.6 之后新增的 epoll 模型,则彻底解决了性能问题,一举使得单机承受百万并发的课题变得极为容易。
现在可以这么说,只需要一些简单的设置更改,然后配合上 epoll 的性能,实现单机百万并发轻而易举。
同时,由于 epoll 整体的优化,使得之前的几个比较耗费性能的问题不再成为羁绊,所以也成为了 Linux 平台上进行网络通讯的首选模型。
讲解之前,还是 linux man 文档镇楼:linux man epoll 4 类文档 linux man epoll 7 类文档,俩文档结合着读,会对 epoll 有个大概的了解。
和之前提到的 select 和 poll 不同的是,此二者皆属于系统调用函数,但是 epoll 则不然,他是存在于内核中的数据结构。
可以通过 epoll_create,epoll_ctl 及 epoll_wait 三个函数结合来对此数据结构进行操控。
说到 epoll_create 函数,其作用是在内核中创建一个 epoll 数据结构实例,然后将返回此实例在系统中的文件描述符。
此 epoll 数据结构的组成其实是一个链表结构,我们称之为 interest list,里面会注册连接上来的 client 的文件描述符。
其简化工作机制如下:
说道 epoll_ctl 函数,其作用则是对 epoll 实例进行增删改查操作。有些类似我们常用的 CRUD 操作。
这个函数操作的对象其实就是 epoll 数据结构,当有新的 client 连接上来的时候,他会将此 client 注册到 epoll 中的 interest list 中,此操作通过附加 EPOLL_CTL_ADD 标记来实现。
当已有的 client 掉线或者主动下线的时候,他会将下线的 client从epoll 的 interest list 中移除,此操作通过附加 EPOLL_CTL_DEL 标记来实现。
当有 client 的文件描述符有变更的时候,他会将 events 中的对应的文件描述符进行更新,此操作通过附加 EPOLL_CTL_MOD 来实现。
当 interest list 中有 client 已经准备好了,可以进行 IO 操作的时候,他会将这些 clients 拿出来,然后放到一个新的 ready list 里面。
其简化工作机制如下:
说道 epoll_wait 函数,其作用就是扫描 ready list,处理准备就绪的 client IO,其返回结果即为准备好进行 IO 的 client 的个数。通过遍历这些准备好的 client,就可以轻松进行 IO 处理了。
上面这三个函数是 epoll 操作的基本函数,但是,想要彻底理解 epoll,则需要先了解这三块内容,即:inode,链表,红黑树。
在 Linux 内核中,针对当前打开的文件,有一个 open file table,里面记录的是所有打开的文件描述符信息;同时也有一个 inode table,里面则记录的是底层的文件描述符信息。
这里假如文件描述符 B fork 了文件描述符 A,虽然在 open file table 中,我们看新增了一个文件描述符 B,但是实际上,在 inode table 中,A 和 B 的底层是一模一样的。
这里,将 inode table 中的内容理解为 Windows 中的文件属性,会更加贴切和易懂。
这样存储的好处就是,无论上层文件描述符怎么变化,由于 epoll 监控的数据永远是 inode table 的底层数据,那么我就可以一直能够监控到文件的各种变化信息,这也是 epoll 高效的基础。
简化流程如下:
数据存储这块解决了,那么针对连接上来的客户端 socket,该用什么数据结构保存进来呢?
这里用到了红黑树,由于客户端 socket 会有频繁的新增和删除操作,而红黑树这块时间复杂度仅仅为 O(logN),还是挺高效的。
有人会问为啥不用哈希表呢?当大量的连接频繁的进行接入或者断开的时候,扩容或者其他行为将会产生不少的 rehash 操作,而且还要考虑哈希冲突的情况。
虽然查询速度的确可以达到 o(1),但是 rehash 或者哈希冲突是不可控的,所以基于这些考量,我认为红黑树占优一些。
客户端 socket 怎么管理这块解决了,接下来,当有 socket 有数据需要进行读写事件处理的时候,系统会将已经就绪的 socket 添加到双向链表中,然后通过 epoll_wait 方法检测的时候。
其实检查的就是这个双向链表,由于链表中都是就绪的数据,所以避免了针对整个客户端 socket 列表进行遍历的情况,使得整体效率大大提升。
整体的操作流程为:
首先,利用 epoll_create 在内核中创建一个 epoll 对象。其实这个 epoll 对象,就是一个可以存储客户端连接的数据结构。
然后,客户端 socket 连接上来,会通过 epoll_ctl 操作将结果添加到 epoll 对象的红黑树数据结构中。
然后,一旦有 socket 有事件发生,则会通过回调函数将其添加到 ready list 双向链表中。
最后,epoll_wait 会遍历链表来处理已经准备好的 socket,然后通过预先设置的水平触发或者边缘触发来进行数据的感知操作。
从上面的细节可以看出,由于 epoll 内部监控的是底层的文件描述符信息,可以将变更的描述符直接加入到 ready list,无需用户将所有的描述符再进行传入。
同时由于 epoll_wait 扫描的是已经就绪的文件描述符,避免了很多无效的遍历查询,使得 epoll 的整体性能大大提升,可以说现在只要谈论 Linux 平台的 IO 多路复用,epoll 已经成为了不二之选。
水平触发和边缘触发
上面说到了 epoll,主要讲解了 client 端怎么连进来,但是并未详细的讲解 epoll_wait 怎么被唤醒的,这里我将来详细的讲解一下。
水平触发,意即 Level Trigger,边缘触发,意即 Edge Trigger,如果单从字面意思上理解,则不太容易,但是如果将硬件设计中的水平沿,上升沿,下降沿的概念引进来,则理解起来就容易多了。
比如我们可以这样认为:
如果将上图中的方块看做是 buffer 的话,那么理解起来则就更加容易了,比如针对水平触发,buffer 只要是一直有数据,则一直通知;而边缘触发,则 buffer 容量发生变化的时候,才会通知。
虽然可以这样简单的理解,但是实际上,其细节处理部分,比图示中展现的更加精细,这里来详细的说一下。
①边缘触发
针对读操作,也就是当前 fd 处于 EPOLLIN 模式下,即可读。此时意味着有新的数据到来,接收缓冲区可读,以下 buffer 都指接收缓冲区:
buffer 由空变为非空,意即有数据进来的时候,此过程会触发通知:
buffer 原本有些数据,这时候又有新数据进来的时候,数据变多,此过程会触发通知:
buffer 中有数据,此时用户对操作的 fd 注册 EPOLL_CTL_MOD 事件的时候,会触发通知:
针对写操作,也就是当前 fd 处于 EPOLLOUT 模式下,即可写。此时意味着缓冲区可以写了,以下 buffer 都指发送缓冲区:
buffer 满了,这时候发送出去一些数据,数据变少,此过程会触发通知:
buffer 原本有些数据,这时候又发送出去一些数据,数据变少,此过程会触发通知:
这里就是 ET 这种模式触发的几种情形,可以看出,基本上都是围绕着接收缓冲区或者发送缓冲区的状态变化来进行的。
晦涩难懂?不存在的,举个栗子:
在服务端,我们开启边缘触发模式,然后将 buffer size 设为 10 个字节,来看看具体的表现形式。
服务端开启,客户端连接,发送单字符 A 到服务端,输出结果如下:
-->ET Mode: it was triggered once
get 1 bytes of content: A
-->wait to read!
可以看到,由于 buffer 从空到非空,边缘触发通知产生,之后在 epoll_wait 处阻塞,继续等待后续事件。
这里我们变一下,输入 ABCDEFGHIJKLMNOPQ,可以看到,客户端发送的字符长度超过了服务端 buffer size,那么输出结果将是怎么样的呢?
-->ET Mode: it was triggered once
get 9 bytes of content: ABCDEFGHI
get 8 bytes of content: JKLMNOPQ
-->wait to read!
可以看到,这次发送,由于发送的长度大于 buffer size,所以内容被折成两段进行接收,由于用了边缘触发方式,buffer 的情况是从空到非空,所以只会产生一次通知。
②水平触发
水平触发则简单多了,他包含了边缘触发的所有场景,简而言之如下:
当接收缓冲区不为空的时候,有数据可读,则读事件会一直触发:
当发送缓冲区未满的时候,可以继续写入数据,则写事件一直会触发:
同样的,为了使表达更清晰,我们也来举个栗子,按照上述入输入方式来进行。
服务端开启,客户端连接并发送单字符 A,可以看到服务端输出情况如下:
-->LT Mode: it was triggered once!
get 1 bytes of content: A
这个输出结果,毋庸置疑,由于 buffer 中有数据,所以水平模式触发,输出了结果。
服务端开启,客户端连接并发送 ABCDEFGHIJKLMNOPQ,可以看到服务端输出情况如下:
-->LT Mode: it was triggered once!
get 9 bytes of content: ABCDEFGHI
-->LT Mode: it was triggered once!
get 8 bytes of content: JKLMNOPQ
从结果中,可以看出,由于 buffer 中数据读取完毕后,还有未读完的数据,所以水平模式会一直触发,这也是为啥这里水平模式被触发了两次的原因。
有了这两个栗子的比对,不知道聪明的你,get 到二者的区别了吗?
在实际开发过程中,实际上 LT 更易用一些,毕竟系统帮助我们做了大部分校验通知工作,之前提到的 SELECT 和 POLL,默认采用的也都是这个。
但是需要注意的是,当有成千上万个客户端连接上来开始进行数据发送,由于 LT 的特性,内核会频繁的处理通知操作,导致其相对于 ET 来说,比较的耗费系统资源,所以,随着客户端的增多,其性能也就越差。
而边缘触发,由于监控的是 FD 的状态变化,所以整体的系统通知并没有那么频繁,高并发下整体的性能表现也要好很多。
但是由于此模式下,用户需要积极的处理好每一笔数据,带来的维护代价也是相当大的,稍微不注意就有可能出错。所以使用起来需要非常小心才行。
至于二者如何抉择,诸位就仁者见仁智者见智吧。
行文到这里,关于 epoll 的讲解基本上完毕了,大家从中是不是学到了很多干货呢?
由于从 Netty 研究到 linux epoll 底层,其难度非常大,可以用曲高和寡来形容,所以在这块探索的文章是比较少的,很多东西需要自己照着 man 文档和源码一点一点地琢磨(linux 源码详见 eventpoll.c 等)。
这里我来纠正一下搜索引擎上,说 epoll 高性能是因为利用 mmap 技术实现了用户态和内核态的内存共享,所以性能好。
我前期被这个观点误导了好久,后来下来了 Linux 源码,翻了一下,并没有在 epoll 中翻到 mmap 的技术点,所以这个观点是错误的。
这些错误观点的文章,国内不少,国外也不少,希望大家能审慎抉择,避免被错误带偏。
所以,epoll 高性能的根本就是,其高效的文件描述符处理方式加上颇具特性边的缘触发处理模式,以极少的内核态和用户态的切换,实现了真正意义上的高并发。
手写 epoll 服务端
实践是最好的老师,我们现在已经知道了 epoll 之剑怎么嵌入到石头中的,现在就让我们不妨尝试着拔一下看看。
手写 epoll 服务器,具体细节如下(非 C 语言 coder,代码有参考):
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/epoll.h>
#include <pthread.h>
#include <errno.h>
#include <stdbool.h>
#define MAX_EVENT_NUMBER 1024 //事件总数量
#define BUFFER_SIZE 10 //缓冲区大小,这里为10个字节
#define ENABLE_ET 0 //ET模式
/* 文件描述符设为非阻塞状态
* 注意:这个设置很重要,否则体现不出高性能
*/
int SetNonblocking(int fd)
{
int old_option = fcntl(fd, F_GETFL);
int new_option = old_option | O_NONBLOCK;
fcntl(fd, F_SETFL, new_option);
return old_option;
}
/* 将文件描述符fd放入到内核中的epoll数据结构中并将fd设置为EPOLLIN可读,同时根据ET开关来决定使用水平触发还是边缘触发模式
* 注意:默认为水平触发,或上EPOLLET则为边缘触发
*/
void AddFd(int epoll_fd, int fd, bool enable_et)
{
struct epoll_event event; //为当前fd设置事件
event.data.fd = fd; //指向当前fd
event.events = EPOLLIN; //使得fd可读
if(enable_et)
{
event.events |= EPOLLET; //设置为边缘触发
}
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &event); //将fd添加到内核中的epoll实例中
SetNonblocking(fd); //设为非阻塞模式
}
/* LT水平触发
* 注意:水平触发简单易用,性能不高,适合低并发场合
* 一旦缓冲区有数据,则会重复不停的进行通知,直至缓冲区数据读写完毕
*/
void lt_process(struct epoll_event* events, int number, int epoll_fd, int listen_fd)
{
char buf[BUFFER_SIZE];
int i;
for(i = 0; i < number; i ) //已经就绪的事件,这些时间可读或者可写
{
int sockfd = events[i].data.fd; //获取描述符
if(sockfd == listen_fd) //如果监听类型的描述符,则代表有新的client接入,则将其添加到内核中的epoll结构中
{
struct sockaddr_in client_address;
socklen_t client_addrlength = sizeof(client_address);
int connfd = accept(listen_fd, (struct sockaddr*)&client_address, &client_addrlength); //创建连接并返回文件描述符(实际进行的三次握手过程)
AddFd(epoll_fd, connfd, false); //添加到epoll结构中并初始化为LT模式
}
else if(events[i].events & EPOLLIN) //如果客户端有数据过来
{
printf("-->LT Mode: it was triggered once!n");
memset(buf, 0, BUFFER_SIZE);
int ret = recv(sockfd, buf, BUFFER_SIZE - 1, 0);
if(ret <= 0) //读取数据完毕后,关闭当前描述符
{
close(sockfd);
continue;
}
printf("get %d bytes of content: %sn", ret, buf);
}
else
{
printf("something unexpected happened!n");
}
}
}
/* ET Work mode features: efficient but potentially dangerous */
/* ET边缘触发
* 注意:边缘触发由于内核不会频繁通知,所以高效,适合高并发场合,但是处理不当将会导致严重事故
其通知机制和触发方式参见之前讲解,由于不会重复触发,所以需要处理好缓冲区中的数据,避免脏读脏写或者数据丢失等
*/
void et_process(struct epoll_event* events, int number, int epoll_fd, int listen_fd)
{
char buf[BUFFER_SIZE];
int i;
for(i = 0; i < number; i )
{
int sockfd = events[i].data.fd;
if(sockfd == listen_fd) //如果有新客户端请求过来,将其添加到内核中的epoll结构中并默认置为ET模式
{
struct sockaddr_in client_address;
socklen_t client_addrlength = sizeof(client_address);
int connfd = accept(listen_fd, (struct sockaddr*)&client_address, &client_addrlength);
AddFd(epoll_fd, connfd, true);
}
else if(events[i].events & EPOLLIN) //如果客户端有数据过来
{
printf("-->ET Mode: it was triggered oncen");
while(1) //循环等待
{
memset(buf, 0, BUFFER_SIZE);
int ret = recv(sockfd, buf, BUFFER_SIZE - 1, 0);
if(ret < 0)
{
if(errno == EAGAIN || errno == EWOULDBLOCK) //通过EAGAIN检测,确认数据读取完毕
{
printf("-->wait to read!n");
break;
}
close(sockfd);
break;
}
else if(ret == 0) //数据读取完毕,关闭描述符
{
close(sockfd);
}
else //数据未读取完毕,继续读取
{
printf("get %d bytes of content: %sn", ret, buf);
}
}
}
else
{
printf("something unexpected happened!n");
}
}
}
int main(int argc, char* argv[])
{
const char* ip = "10.0.76.135";
int port = 9999;
//套接字设置这块,参见https://www.gta.ufrj.br/ensino/eel878/sockets/sockaddr_inman.html
int ret = -1;
struct sockaddr_in address;
bzero(&address, sizeof(address));
address.sin_family = AF_INET;
inet_pton(AF_INET, ip, &address.sin_addr);
address.sin_port = htons(port);
int listen_fd = socket(PF_INET, SOCK_STREAM, 0); //创建套接字并返回描述符
if(listen_fd < 0)
{
printf("fail to create socket!n");
return -1;
}
ret = bind(listen_fd, (struct sockaddr*)&address, sizeof(address)); //绑定本机
if(ret == -1)
{
printf("fail to bind socket!n");
return -1;
}
ret = listen(listen_fd, 5); //在端口上监听
if(ret == -1)
{
printf("fail to listen socket!n");
return -1;
}
struct epoll_event events[MAX_EVENT_NUMBER];
int epoll_fd = epoll_create(5); //在内核中创建epoll实例,flag为5只是为了分配空间用,实际可以不用带
if(epoll_fd == -1)
{
printf("fail to create epoll!n");
return -1;
}
AddFd(epoll_fd, listen_fd, true); //添加文件描述符到epoll对象中
while(1)
{
int ret = epoll_wait(epoll_fd, events, MAX_EVENT_NUMBER, -1); //拿出就绪的文件描述符并进行处理
if(ret < 0)
{
printf("epoll failure!n");
break;
}
if(ENABLE_ET) //ET处理方式
{
et_process(events, ret, epoll_fd, listen_fd);
}
else //LT处理方式
{
lt_process(events, ret, epoll_fd, listen_fd);
}
}
close(listen_fd); //退出监听
return 0;
}
详细的注释我都已经写上去了,这就是整个 epoll server 端全部源码了,仅仅只有 200 行左右,是不是很惊讶。
接下来让我们来测试下性能,看看能够达到我们所说的单机百万并发吗?其实悄悄地给你说,Netty 底层的 C 语言实现,和这个是差不多的。
单机百万并发实战
在实际测试过程中,由于要实现高并发,那么肯定得使用 ET 模式了。
但是由于这块内容更多的是 Linux 配置的调整,且前人已经有了具体的文章了,所以这里就不做过多的解释了。
这里我们主要是利用 VMware 虚拟机一主三从,参数调优,来实现百万并发。
此块内容由于比较复杂,先暂时放一放,后续将会搭建环境并对此手写 server 进行压测。
参考资料:
https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html
https://copyconstruct.medium.com/the-method-to-epolls-madness-d9d2d6378642
作者:程序诗人
编辑:陶家龙
出处:cnblogs.com/scy251147/p/14763761.html
巴西也动手了!全球围剿的中国抽卡,是怎么让人上瘾的?
没人能拒绝抽卡,没有人。
不管《阴阳师》、《FGO》、《原神》,还是《和平精英》里的皮肤池子,只要存在抽卡机制的地方,就能看到成批的氪佬、肝帝,扎堆用真金白银或者时间精力为爱充值,只为了享受特效闪过屏幕时那一两秒钟的刺激。
成则欧皇,败则非酋,为了早日实现脱非入欧,甚至有玄学家钻研起抽卡的风水、时辰,试图通过神秘力量让自己和纸片人老婆/老公们早日团聚。
恭喜你们,已经中了狗策划的圈套,成为关在笼子里的鸽子。
抽卡不是新鲜玩意儿,早在上世纪80年代,外国友人们就已经摸索出了这套模式的雏形,并输入到国内,但真正把抽卡骗氪发扬光大的,还是勤劳勇敢很会玩的中国人民。
最早可以追溯的开箱类游戏消费,是万智牌、游戏王、精灵宝可梦等实体卡牌,这股风潮在国内引发了大批量的效仿,伴随80后、90后们长大的水浒英雄卡,就是其中杰出的本地化案例。
对于许多90后来说,攒几天零花钱,到小卖部买一包小浣熊干脆面,是童年最刺激的大冒险——伴随着让人牙酸的塑料撕扯声,你可能会看到心心念念的林冲、宋江,也可能一连几包吃下来,都是手上已经有过的重复卡面。
赌狗的诱因,早在大家还是孩子时就已经种下,没办法,赌博是人类的天性。
到千禧年后,个人电脑和网游开始普及,网游大潮由此兴起,当时的中国网游弄潮儿史玉柱先生,带着巨人公司创造出《征途》,世界上第一款使用开箱机制的网络游戏——玩家可以真金白银购买“钥匙”,再用“钥匙”打开宝箱。
《征途》游戏页面
为了让人民币玩家们体会到尊贵的特权感,开箱的特效十分华丽:散发光亮的箱子里,突然蹦出个大转盘,转盘上标记着五颜六色的装备和道具,转到什么,什么就归你。这套机制为巨人带来了巨大的流水收益,上线第一季度,就聚拢了14.3110万活跃付费用户,平均氪金84元。
朋友们,那可是2006年。
巨人的成功,引发了世界范围内的模仿狂潮,不管国内还是国外厂家,都开始在游戏里建立类似的机制。
但这套机制存在风险,法律风险。抽卡开箱的本质,是不公开赔率的博彩游戏,而所有不公开赔率的博彩游戏,都是违法的。
为了规避风险,后来的模仿者们通过包装,把赌博嫁接到了一些监管不敏感的类型里。画符、做饭、召唤英灵,抽卡被融进游戏的核心机制,再提供有限的无氪抽卡机会,看似对玩家友善得多。
实际上,让玩家可以不花钱体验抽卡,并不是狗策划们善心大发,不过是这么干,有利于更好地赚钱罢了。
这种给点甜头养成习惯,再让玩家沉迷其中越氪越狠的套路,有套成熟的理论依据,斯金纳箱。
美国行为主义心理学家斯金纳,曾经做过一系列实验,他把无辜的小白鼠关进箱子里,给箱子装上按钮,并设计了四个不同的机制让小白鼠们按下按钮。
玩家就是游戏这个箱子里的小白鼠
第一种机制,是纯粹的奖励:只要按下按钮,就会有食物掉落进箱子中,小白鼠很快掌握了行为和奖励的对应规律;
第二种机制,则是惩罚:箱子通了电,小白鼠要停止电击,就必须按下按钮,但在这次实验中,斯金纳发现一旦电击消失,小白鼠很快就会停止按按钮的动作,看来,惩罚构建的行为模式并不长久;
第三种机制是固定时间发放食物,每隔一分钟按下一次,才会有食物落到小白鼠面前,一开始小白鼠不断按按钮,发现规律后开始每间隔一分钟按一次,当食物供给停止后,小白鼠很快停止了行为;
第四种机制,使用了如今抽卡氪金的内涵逻辑,也就是概率式奖励:小白鼠只要按下按钮,就会有概率出现食物,按得越多,掉落食物的机会就越高,在这个实验里,小白鼠对按按钮这个行为上了瘾。
后来斯金纳尝试把小白鼠换成鸽子,再次重复了第四个实验,效果依然显著——平均每5分钟获得变化时距的食物强化的鸽子,每秒能做出2-3次反应,连续反应长达15小时。
看来不止人类,只要有脑子的生物,都无法抵挡抽卡的诱惑。
实际上,开箱抽卡的辐射范围,已经远远不只限于游戏的世界。
这几年火热的盲盒、福袋等营销手段,都是斯金纳箱理论的变体,而各种限量版,则是吸引小白鼠们不断做出重复行为的奖励,在无法预知的概率面前,要获得这些,唯一的选择就是做大分母。
但游戏的吸金能力依然远远高于上述产业,粘性也更强,毕竟,人在现实里的需求终究有限,但在游戏的世界里,欲望有多大,消耗就能有多大。
比如盲盒,总归需要收纳空间,家里的架子上始终就那么多位置,早晚有放不下的那天,除了极少数过于有钱能够买房放娃娃的土豪,大多数普通人看到架子摆满,消费欲望终究会有所下降。
开盲盒,年轻人的快乐源泉
但游戏的虚拟储存空间,很难那么轻易被占满——除了客观上游戏仓库地方够大,策划还会不断通过升星、返魂等机制帮助你清理干净自己的库房,在这套消耗巨大的机制里,不管你投入了多少,每次打开图鉴,会想起来的都是还差哪些卡,而不是氪了多少金。
这些升星、返魂兑换等机制设计,还有一个更重要的作用,通过限制玩家卡面的强度,让玩家产生相对剥夺感。
拿《阴阳师》举个例子,当你PVP的时候发现对面带着和你一样的SP妖刀姬,对面一刀直接让你这边损失惨重,你的刀却只能当个吉祥物,不服气和憋屈立刻油然而生,于是你开始疯狂氪金肝体力刷魂,竭尽全力让你的刀像对面的大佬一样满级毕业。
可现实经验告诉我们,再强的新卡,也只能当一两个版本的爸爸,等你好不容易把手上的卡都捂热乎,狗策划丢出做过数值调整的新版本,新的大佬们又开始横行霸道,你要么接着氪金,要么看人装逼。
简单来说,看到别人有你没有的东西,就是相对剥夺感产生的时刻,为了消灭这种不爽的感受,本能会推着你要么往前,要么走人——走了的就是不能转化为流水的劣质玩家,留下的,都是游戏公司们大发横财的人形ATM机。
在内卷这一点上,就连游戏圈都不能幸免,在号称“免费也能玩个爽”的《原神》里,每次新卡池开幕,都会在半小时内冒出一大堆把新角色刷到满破,还配好装的怪物玩家。要做到这一步,除了有足够多的钱抽齐重复卡,还需要大把时间刷素材,是真实的又肝又氪。
玩家养卡的速度永远追不上更新
看到大佬们的队伍,相对剥夺感汹涌而起的普通玩家们不得不加入战场,看着一路飞升的流水,策划们又可以开始去准备下一波更新。
策划们有恃无恐的基础是,即使明知道珍稀角色的爆率低下,玩家们依然不会放弃。
心理学上有个理论,叫锚定效应,意思是人在做评估的时候,只会将某些数值当作起始值。应用在抽卡领域,就是明知道十赌九输,但只要有一点可能抽到ssr,玩家们的眼里就只会有ssr的影子,全然不顾自己为了抽到这张卡氪了多少金。
换句话说,陷入抽卡漩涡的玩家,思维已经变成了赌徒的形状,除了不想输给别人,更重要的是他们也在享受赌博的快感。
有这么良好的消费习惯,难怪国内不管做多垃圾的手游,都一定会把游戏里的博彩系统,以及攀比的社交体系做到极致。
送上门的韭菜,谁好意思不割呢?
游戏氪金,根子上算不得一件坏事,游戏公司要赚钱维持运营,玩家需要花钱买快乐,一个愿打一个愿挨。
怎么样让玩家出钱,才是问题的关键。
比如只提供皮肤和特效池子的《和平精英》,氪不氪导致的结果也就是时髦值差异,对游戏本体的核心体验几乎没有影响:钱多想被当大佬的就去拼命买服装,只想吃两把鸡就走的就分文不给,各自都能找到各自的乐趣。
穿什么服装,都不影响吃鸡
同理,即使被不断吐槽逼氪,但《原神》的核心机制和氪不氪关系不大,毕竟PVE才是这款游戏的主要内容,你大可以不花一毛钱体验到整款游戏的主体内容,只不过难度会比一手强力角色的大佬们难上一点点而已。
可有些游戏公司,在逼玩家出钱这件事情上确实不太做人。
玩家们玩游戏,除了体验剧情、享受玩法,最核心的爽感来源,其实是获得心流体验。心流,又译作“神驰”,根据匈牙利裔美国心理学家米哈里∙齐克森米哈里的定义,是指一种将个人精神力完全投注在某种活动上的感觉,伴随心流产生,人们会有高度的兴奋及充实感。
这也是为什么,诸如《文明6》、《十字军之王2》等“时间大杀器”类游戏,许多玩家早就已经集齐全成就,依然愿意投注大把时间精力于其中:他们在享受那种一边想着“就玩最后一回合”,一边不知不觉坐到天亮的专注的快乐。
当这种专注被突然打断,意犹未尽的玩家们的第一反应,会是赶快把它续上,重新回到顺畅的游戏体验中去。这一点,很容易会沦为策划们骗氪的软肋——只需要提高游戏的难度曲线,设置出玩家不氪金就无法逾越的难关就行。
比如国服特供版《植物大战僵尸》,就是其中翘楚。被EA改造成“三步一氪金”的无耻模式之后,宝开的上海团队又接手完成了国服特供版,难度曲线比国际服更高,氪金点更多,零氪玩家要通关,简单来说,难如登天。
策划吃掉了玩家的脑子
可IP影响力放在那,哪怕口碑全线崩盘,这款游戏的国服营收照样一度超过《扩散性百万亚瑟王》,成为海外公司研究如何应对中国游戏市场盗版问题的重要案例。
这部粪作大捞特捞后不久,加州的动视暴雪提交了一份改变世界氪金机制的专利,《在多人游戏中诱导微交易的系统和方法》。这个专利提出用匹配系统刺激消费,系统会把氪金玩家和无氪玩家匹配在一起,让无氪玩家被肆意暴打,产生巨大的落差,从而购买氪金玩家的同款装备。
翻译一下:不花钱?行,那你就别想玩得舒服,给氪佬们当沙包去吧。
2020年6月19日,韩国点名了一批不合规的概率型游戏,总共19款问题游戏里,有11款来自中国。
实际上,最早鼓捣出网游开箱抽卡机制的中国,也是最早开始实施监管的。早在2010年,文化部就出台过《网络游戏暂行管理办法》,要求“不得设置未经网络游戏用户同意的强制对战,不得以随机抽取等偶然方式,诱导网络游戏用户采取投入法定货币或者网络游戏虚拟货币方式获取网络游戏产品和服务”。
上有政策,下有对策,面对几乎所有手游厂商都把抽卡开箱作为核心收入来源的现状,监管也没办法轻易进行一刀切——这一刀下去,中国游戏产业,尤其手游产业可能直接暴毙。
但这种滥用用户成瘾心理的模式,不只在消耗玩家们对游戏厂商的好感和耐心,也存在和赌博界线模糊的风险。
2021年4月6日,在国家儿童和青少年保护中心协会(ANCED)的建议下,巴西当局发起了一项调查,旨在禁止游戏中的开箱行为。据Esports Observer报道,该协会认为,这种随机的盈利机制是一种赌博,在巴西是非法的。
赌博犯法
被调查的公司包括动视、EA、科乐美、任天堂、拳头、育碧、腾讯、V社等公司。手机游戏发行商Garena也在其中,据最新报道,Garena已被要求暂停销售开箱,直至另行通知。
如果禁令被通过,巴西考虑引入罚款机制,出售开箱的游戏公司一天最高可被罚款70.6万美元。
在此之前,美国等重要国际游戏市场,也曾出台过类似全面禁止未成年人接触抽卡、开箱类游戏的举措。
而在国内,对于抽卡开箱的保底机制等要求和监管也正在逐步完善,依靠抽卡和开箱肆无忌惮压榨玩家的套路,该刹车了。