SNEAK IN DESTROY七日杀这个游戏好玩吗有人玩出全结局吗

sneak in destroy游戏下载_sneak in destroy汉化版下载
sneak in destroy游戏下载_sneak in destroy汉化版下载
当前位置:> > sneak in destroy
sneak in destroy
大小:47.4MB
类别:福利游戏
浏览次数:0
页面最后更新时间: 16:29
给大家带来sneak in destroy游戏下载以及sneak in destroy汉化版下载。sneak in destroy是一款福利rpg游戏,游戏还是比较重口的,各种0辱,画风方面的话,在hrpg游戏的基本水平线上。不过福利的h场景cg还是很不错的。算是一款中规中矩的小游戏,喜欢的老司机们自己下载玩玩看呗。
sneak in destroy相关下载地址表
版本号更新时间下载地址
绅士游戏老司机游戏恋爱日本游戏养成
安卓绅士游戏还是传统的优雅游戏?那你就大错特错了!如今的安卓绅士已经成了一种邪恶的代名词,意思就是伪善的变态。安卓绅士游戏包含了各种福利游戏,日本邪恶游戏,岛国福利apk,绅士向手游,只有你想不到,没有小编找不到的。今天给大家带来安卓绅士游戏推荐大合集,喜欢的话请继续支持木子游戏!!!文件大小:322MB类别:福利游戏文件大小:1.09G类别:福利游戏文件大小:3.31MB类别:福利游戏文件大小:765MB类别:福利游戏文件大小:114MB类别:福利游戏文件大小:77MB类别:福利游戏老司机游戏满足你所有的幻想,男生老司机们必备手游,脸红害羞的萝莉,呼之欲出的御姐,宅男们梦寐以求的时刻!赶紧点进来畅快淋漓的玩一次吧!嘿嘿嘿你懂的,没时间解释了,快上车,老司机要发车了!老司机福利游戏大全,为您带来最新最全的手机福利游戏,更多老司机福利安卓手游推荐下载就上木子游戏!文件大小:2.1G类别:福利游戏文件大小:2.1G类别:福利游戏文件大小:67MB类别:福利游戏文件大小:1.04G类别:福利游戏文件大小:2.1G类别:福利游戏文件大小:335MB类别:福利游戏玩家控制一名虚拟人物(主人公)与虚拟的(一般为)异性角色的恋爱故事。恋爱游戏通常会构筑一个虚拟的舞台,让玩家在其中体验一段虚拟的爱情故事。恋爱游戏分为恋爱冒险游戏和恋爱模拟游戏两种。恋爱模拟游戏有点类似于带有恋爱元素的模拟养成游戏。木子游戏为大家推荐人设美、画风唯美、剧情感人的恋爱游戏下载。恋爱游戏下载就上木子游戏。文件大小:52.7M类别:休闲益智文件大小:26.48 MB类别:破解游戏文件大小:36.51 MB类别:破解游戏文件大小:4.6M类别:破解游戏文件大小:52.78 MB类别:角色扮演文件大小:52.78 MB类别:角色扮演你想参与其中吗?赶快进来与岛国女人酣畅淋漓的玩一次成长游戏吧!日本嗨手机游戏满足你所有的欲望与需求,保证让你爽翻天!宅男十八禁必备手游,你懂的!小编倾力搬运,带来萌安卓吧,嗨手机游戏下载大全,为您带来最新最全的手机福利游戏,更多日本安卓手游推荐下载就上木子游戏!文件大小:808mb类别:福利游戏文件大小:0KB类别:福利游戏文件大小:0KB类别:福利游戏文件大小:64.5mb类别:福利游戏文件大小:1.2GB类别:福利游戏文件大小:48.9类别:福利游戏手机养成游戏是非常受欢迎的手游类型之一,玩家可以选择自己的身份,做自己想做的事,成为自己命运的主宰者,体验不一样的人生。如灰姑娘变公主,青蛙变王子等一系列现实中比较难实现的浪漫桥段,都能在游戏中一一体验,下面小编为大家精心挑选了多种经典手机养成类游戏,让每位玩家都能成为自己梦想中的“小公举”哦。手机养成类游戏下载就上木子游戏!文件大小:1.15 MB类别:休闲益智文件大小:0KB类别:休闲益智文件大小:0KB类别:经营策略文件大小:156.4M类别:经营策略文件大小:40.1M类别:休闲益智文件大小:271.69KB类别:休闲益智&img src=&/50/v2-47dcbbf1471c7bdb130538_b.jpg& data-rawwidth=&800& data-rawheight=&413& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/50/v2-47dcbbf1471c7bdb130538_r.jpg&&&p&&b&提要&/b&&br&&/p&&br&&p&一说到开放世界,沙盒,第一个想到的技术点就是Procedual Generation。贴个Wiki上的定义&/p&
&p&&i&术语“过程化”是指计算一个特定&a href=&/?target=https%3A//zh.wikipedia.org/wiki/%25E5%2587%25BD%25E6%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&函数&i class=&icon-external&&&/i&&/a&的过程,如&a href=&/?target=https%3A//zh.wikipedia.org/wiki/%25E5%E5%25BD%25A2& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&分形&i class=&icon-external&&&/i&&/a&。过程化生成常用于生成贴图、多边形网格、声效、语音合成和音乐制作等。过程化生成的好处是衹要很小的函数和源数据,便可以制造出很多和源数据有关或类似但存在不同的新数据。电子游戏借助它可出现许多(接近无限)个关卡。这可以缩短开发时间,也可以减小软件的文件大小。&/i&&/p&
&p&很多游戏都有用到Procedual Generation的技术,或多或少,但是对于能够将Procedual Generation和GamePlay融合的最好的,当然是Minecraft的了。&/p&&p&所有代码均出自forge,ver10.2(加上一部分人肉反编译) 。部分图片来自minecraft wiki。&/p&&p&&b&所有代码的使用均需遵循开源协议!&/b&&/p&&a href=&/?target=https%3A///MinecraftForge/MinecraftForge/blob/1.10.x/LICENSE-new.txt& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/MinecraftFor&/span&&span class=&invisible&&ge/MinecraftForge/blob/1.10.x/LICENSE-new.txt&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&h2&&b&线性同余随机数生成器&/b&&/h2&
&p&为什么同样的种子能够生成完全一致的地形,利用的就是伪随机数。&/p&&p&LCG 算法数学上基于公式:&/p&&p&X(n+1) = (a * X(n) + c) % m&br&&/p&
&p&其中,各系数为:&/p&
&p&模&b&m&/b&,
&p&系数&b&a&/b&,
0 & a & m&/p&
&p&增量&b&c&/b&,
0 &= c & m&/p&
&p&原始值(种子) 0 &= X(0) & m&/p&
&p&其中参数&b&c, m, a&/b&比较敏感,或者说直接影响了伪随机数产生的质量。&/p&
&p&假设a = 2, c = 3, m = 10,初始值Xo = 5,写一下代码&/p&
&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&int lcgRandom(int seed)
return (2 * seed + 3) % 10;
void Start() {
int seed = 5;
for (int i = 0; i & 10; i++)
seed = lcgRandom(seed);
Debug.Log(seed);
&/code&&/pre&&/div&&br&&p&得到的结果就是&/p&
&p&5 3 9 1 5 3 9 1 5 3...&/p&
&p&可以发现会有一个循环周期,这是因为取模运算而造成的,在随机数理论里,这个周期称为&/p&
&p&&b&period of
the sequence&/b& 。对于随机数生成,这个周期当然是越大越好,这样让人感觉随机的随机程度就越高,通常情况下m越大,这个周期就越大。同时a和c也对周期有一定的影响,有些参数能够将m内的数都生成出来,这时候,这个生成器就是 Full-Cycle Linear Congruential Generator 。&/p&
&p&一些随机数生成算法直接将c设置为0,因为c只是一个常数&/p&
aXn-1 mod m&/p&
&p&这样的生成器称为 &b&pure multiplicative generator&/b&. 这样的生成器有一个问题是没法生成0.&/p&
&p&对与,m和a的取值,有个最小标准一说。由Park 和Miller 提出,m = 2,147,483,647 and a = 16,807 ,如果是要提出更好的算法,不能比这个组合差。&/p&
&p&一般而言,高LCG的m是2的指数次幂(一般2^32或者2^64),因为这样取模操作截断最右的32或64位就可以了。多数编译器的库中使用了该理论实现其伪随机数发生器rand()。&/p&&p&看一下Minecraft中的随机数生成器:&/p&
&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&void GenLayer::initChunkSeed(int x, int z)
m_ChunkSeed = m_WorldGenS
m_ChunkSeed *= m_ChunkSeed * 6793005L + 8963407L;
m_ChunkSeed +=
m_ChunkSeed *= m_ChunkSeed * 6793005L + 8963407L;
m_ChunkSeed +=
m_ChunkSeed *= m_ChunkSeed * 6793005L + 8963407L;
m_ChunkSeed +=
m_ChunkSeed *= m_ChunkSeed * 6793005L + 8963407L;
m_ChunkSeed +=
int GenLayer::nextInt(unsigned int range)
unsigned int r = (unsigned int)(m_ChunkSeed && 24) %
m_ChunkSeed *= m_ChunkSeed * 6793005L + 8963407L;
m_ChunkSeed += m_WorldGenS
&/code&&/pre&&/div&&br&&p&
m_ChunkSeed用64位来存,这里没有看到取模运算,对于unsigned整型溢出,C的规范是有定义的——“溢出后的数会以2^(8*sizeof(type))作模运算&/p&
&h2&&b&程序生成流水线&/b&&/h2&
&p&类似于富x康的iphone装配流水线,Minecraft中,从一个随机数种子到在游戏中显示的地形,有着自己的一条生成流水线。&/p&
&p&整体的生成流水线如下图&/p&
&img src=&/v2-348cdd6f713d648a2d167f_b.png& data-rawwidth=&732& data-rawheight=&651& class=&origin_image zh-lightbox-thumb& width=&732& data-original=&/v2-348cdd6f713d648a2d167f_r.png&&&p&简单流程的介绍可以参考这个&a href=&/question/& class=&internal&&Minecraft 的地形生成算法是什么?&/a&&/p&&br&&h2&矿道生成&/h2&&p&Minecraft中结构类的生成发生在洞穴峡谷生成之后,生成的结构主要包括废弃矿坑,村庄,要塞,地牢等。&/p&&img src=&/v2-f1cd4acfe156cb7b6641cd_b.png& data-rawwidth=&800& data-rawheight=&424& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/v2-f1cd4acfe156cb7b6641cd_r.png&&&br&&img src=&/v2-be99b300dc51e10b904c_b.jpg& data-rawwidth=&1440& data-rawheight=&900& class=&origin_image zh-lightbox-thumb& width=&1440& data-original=&/v2-be99b300dc51e10b904c_r.jpg&&&p&Structure生成流程&br&&/p&&img src=&/v2-85c91f41fb2_b.png& data-rawwidth=&556& data-rawheight=&420& class=&origin_image zh-lightbox-thumb& width=&556& data-original=&/v2-85c91f41fb2_r.png&&&br&&br&&p&相关的结构UML图&/p&&img src=&/v2-af65a4a1b0a10c4c0b1fb364e68b1008_b.png& data-rawwidth=&1138& data-rawheight=&764& class=&origin_image zh-lightbox-thumb& width=&1138& data-original=&/v2-af65a4a1b0a10c4c0b1fb364e68b1008_r.png&&&br&&p&简单的描述&/p&&ol&&li&在生成Chunk的时候检测是否适合生成当前结构;&br&&/li&&li&生成中心建筑,矿坑的话就是一个Room,村庄的话就是一个水井;&br&&/li&&li& 检测中心建筑的四个方向是否可以随机生成新的结构和建筑;&br&&/li&&li&如果可以生成,则检测是否可以基于这个Component去生成可以连接的新的Component&br&&/li&&li&重复4&br&&/li&&li&Populate阶段将各个Component进行方块填充,还有刷怪龙,宝箱,村民等。&br&&/li&&/ol&&br&&p&先来讲一个&b&随机生成地牢的算法&/b&。&br&&/p&&p&如果要生成一个地牢,我们首先定义出一些地牢中的一些基本组件,它们有:&/p&&p&&b&房间&/b&:它有一个或者多个出口;&br&&b&走廊&/b&:它是一个很窄很长的区域,拥有两个出口,它也可能是一个斜坡;&br&&b&连接处&/b&:是一个有着三个以上出口的小的空间;&br&&/p&&p&下面是几个简单的组件模型,每个组件都有一个包围盒用于防止在生成的时候组件穿插,在每个组件的出口,都有一个mark,标记了位置和旋转量,用于组件的匹配.&/p&&img src=&/v2-7baa15c61bbdae40e707b9f_b.png& data-rawwidth=&936& data-rawheight=&459& class=&origin_image zh-lightbox-thumb& width=&936& data-original=&/v2-7baa15c61bbdae40e707b9f_r.png&&&p&现在只要将它们遵循一定的规则拼接在一起,就可以生成地牢了,这些规则有:&/p&&ol&&li& 房间只能链接走廊;&br&&/li&&li&走廊链接房间或者连接处;&br&&/li&&li&连接处只能连接走廊;&br&&/li&&li&组件之间不能有穿插(利用Bounding Box)。&br&&/li&&/ol&&br&&p&&br&接下来是生成算法的详细描述&br&&/p&&ol&&li&初始化一个启示模块(可以选择有最多出口数的模块);&br&&/li&&li&对每个未连接的出口生成一个符合条件的模块;&br&&/li&&li&重新建立一个目前未连接的出口的列表;&br&&/li&&li&重复步骤2和步骤3.&br&&/li&&/ol&&p&下图分别是初始状态,迭代三次和迭代六次的结果&br&&/p&&br&&img src=&/v2-42b8bebd4c123da662dbc4aeb182da8c_b.png& data-rawwidth=&1042& data-rawheight=&552& class=&origin_image zh-lightbox-thumb& width=&1042& data-original=&/v2-42b8bebd4c123da662dbc4aeb182da8c_r.png&&&p&&img src=&/v2-52caa776a0dcad6fc004dc0_b.png& data-rawwidth=&1044& data-rawheight=&554& class=&origin_image zh-lightbox-thumb& width=&1044& data-original=&/v2-52caa776a0dcad6fc004dc0_r.png&&上面的随机算法只是生成了地牢的框架,还需要生成很多其他的地牢要素,比如在地上可以打碎的罐子,墙上忽明忽暗的火炬,还有突然从身后窜出来的史莱姆。这些要素的生成的方法和前面的大同小异,简单的说就是在组件的地面或者墙上标记上一些mark点,在这些mark点上随机的去生成一些匹配的要素即可,下面是两个程序生成的房间的例子。&br&&/p&&img src=&/v2-7c18a8b5cb291a3f9e749_b.png& data-rawwidth=&692& data-rawheight=&356& class=&origin_image zh-lightbox-thumb& width=&692& data-original=&/v2-7c18a8b5cb291a3f9e749_r.png&&&img src=&/v2-8854deb19e9c746cc6a29a8c4d47c8e5_b.png& data-rawwidth=&704& data-rawheight=&377& class=&origin_image zh-lightbox-thumb& width=&704& data-original=&/v2-8854deb19e9c746cc6a29a8c4d47c8e5_r.png&&&p&按照上面的算法,废弃矿坑的基本组件就是Room,Corridor,Stair,Cross。在StructureMineshaftStart的构造函数中,起始的组件是一个Room,Room的对象里面包含了一个连接到自己的组件的BoundingBox列表。&/p&&p&看一下Room的buildComponent函数&/p&&img src=&/v2-46c300a27bf295e30e68e_b.png& data-rawwidth=&607& data-rawheight=&125& class=&origin_image zh-lightbox-thumb& width=&607& data-original=&/v2-46c300a27bf295e30e68e_r.png&&&br&&p&代码大家可以自己去搭建一下forge的环境跑一些,这里就不详细解释了。&/p&&br&&p&&b&小结&/b&&/p&&p&结构生成只是MC的生成流水线中非常简单的一环,有兴趣的朋友还可以自己参考forge去学习更多的生成算法,比如生成洞穴峡谷,生成各种生态地形等等,minecraft里面生成部分的代码都还算清晰,所以对程序生成算法感兴趣的同学非常建议你去看看。&/p&&br&&p&&b&参考&/b&&/p&&a href=&/?target=http%3A//mc-server.xoft.cz/docs/Generator.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Generating terrain in Cuberite&i class=&icon-external&&&/i&&/a&&a href=&/?target=http%3A///Biome& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Biome - Official Minecraft Wiki&i class=&icon-external&&&/i&&/a&&a href=&/?target=https%3A//en.wikipedia.org/wiki/Perlin_noise& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Perlin noise - Wikipedia&i class=&icon-external&&&/i&&/a&&a href=&/?target=https%3A//en.wikipedia.org/wiki/Simplex_noise& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Simplex noise - Wikipedia&i class=&icon-external&&&/i&&/a&&a href=&/?target=https%3A///r/gamedev/comments/16yyqw/how_does_minecraft_generate_structures_especially/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&How does Minecraft generate structures? (Especially rivers) o r/gamedev&i class=&icon-external&&&/i&&/a&&a href=&/?target=http%3A//blog.csdn.net/xfgryujk/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Minecraft的世界生成过程(六)村庄 - El Psy Congruu - 博客频道 - CSDN.NET&i class=&icon-external&&&/i&&/a&&a href=&/?target=https%3A///tutorials/bake-your-own-3d-dungeons-with-procedural-recipes--gamedev-14360& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Bake Your Own 3D Dungeons With Procedural Recipes&i class=&icon-external&&&/i&&/a&
提要 一说到开放世界,沙盒,第一个想到的技术点就是Procedual Generation。贴个Wiki上的定义
术语“过程化”是指计算一个特定的过程,如。过程化生成常用于生成贴图、多边形网格、声效、语音合成和音乐制作等。过程化生成的好处是衹要很小的函数…
&img src=&/50/v2-ca29c2b8b2bec58a4b5940_b.jpg& data-rawwidth=&660& data-rawheight=&310& class=&origin_image zh-lightbox-thumb& width=&660& data-original=&/50/v2-ca29c2b8b2bec58a4b5940_r.jpg&&【写在前面的话】:21世纪全球信息化的速度将越来越快。随着人工智能和移动互联网的兴起,越来越多的人开始投身于信息产业中。我们如何迎着这股浪潮找到属于自己的风口浪尖?首先得制作自己的“冲浪板”——也就是信息产业所需要的基础知识。在知乎上类似的文章其实已经很多(文章最后会给出一些链接),但是&b&本文希望通过历史视角,从计算机如何诞生讲到未来信息产业将会有怎样的发展,希望给读者提供一个全景式的视角,方便读者更好的理解目前的计算机产业并找到自己真正感兴趣的方向&/b&。&p&所有图:侵删。&/p&&p&【注1】:本文将分成两部分,第一部分着重于计算机基础知识(重点是计算机科学与程序设计这座大厦是怎么建立起来的,以及每部分在整个大厦中起什么作用),第二部分着重于互联网的建立与网络编程(目前比较流行的)。&/p&&p&【注2】:对于算法、数据结构的专门讨论本文不涉及。如果对此感兴趣的可参考本人这篇文章中的计算机算法部分:&a href=&/p/?group_id=726656& class=&internal&&在bilibili学科学 - 知乎专栏&/a&&/p&&p&&b&&i&&u&下面开始正文:&/u&&/i&&/b&&br&&/p&&p&本文分为11个部分,试图从计算机的产生一直讲到未来整个信息产业的发展。目录如下:&/p&&p&1. 为什么会有计算机?它是如何演变到现在这样的?&/p&&p&2. 计算机体系基本结构——冯诺依曼(von Neumann)计算机&/p&&p&3. 什么是程序设计?&/p&&p&4. 程序设计语言&/p&&p&5. 程序=算法+数据结构&/p&&p&6. 计算机中的数学&/p&&p&7. 互联网的提出、发展与未来&/p&&p&8. 网络编程&/p&&p&9. 移动互联网与App&/p&&p&10. 信息产业分工(技术部分)&/p&&p&11. 未来的信息产业——路在何方?&br&&/p&&p&&i&&u&&b&开始正式进入我们的讲解模式:&/b&&/u&&/i&&br&&/p&&p&&b&1. 为什么会有计算机?它是如何演变到现在这样的?&/b&&/p&&p&
当我们学会了&img src=&/equation?tex=%2B%2C-%2C%5Ctimes+%2C%5Cdiv+& alt=&+,-,\times ,\div & eeimg=&1&&之后,我们就希望运用它们来处理更复杂的数学问题。但是许多时候我们的求解过程都是非常枯燥无味的。例如计算机产生之前,人们在做财务计算时,所使用的工具是——算盘:&/p&&p&&img src=&/v2-c871c775ba1a971e156f8_b.png& data-rawwidth=&557& data-rawheight=&178& class=&origin_image zh-lightbox-thumb& width=&557& data-original=&/v2-c871c775ba1a971e156f8_r.png&&(来自&a href=&/?target=https%3A///search/detail%3Fct%3Dz%3D0%26ipn%3Dd%26word%3D%25E7%25AE%%259B%2598%26step_word%3D%26hs%3D0%26pn%3D9%26spn%3D0%26di%3D%26pi%3D0%26rn%3D1%26tn%3Dbaiduimagedetail%26is%3D0%252C0%26istype%3D0%26ie%3Dutf-8%26oe%3Dutf-8%26in%3D%26cl%3D2%26lm%3D-1%26st%3Dundefined%26cs%3D2C%26os%3D%252Csimid%3D%252Cadpicid%3D0%26lpn%3D0%26ln%3D1989%26fr%3D%26fmq%3D0_R%26fm%3D%26ic%3Dundefined%26s%3Dundefined%26se%3D%26sme%3D%26tab%3D0%26width%3Dundefined%26height%3Dundefined%26face%3Dundefined%26ist%3D%26jit%3D%26cg%3D%26bdtype%3D0%26oriquery%3D%26objurl%3Dhttp%253A%252F%%252Fsy%252Fxx-out%252Fshuxue%252Fdsdrs%252Fzyzx%252Fxgtp%252Fpics_79.jpg%26fromurl%3Dippr_z2C%2524qAzdH3FAzdH3Fooo_z%tw5x7j1wfit_z%AzdH3FfyAzdH3Fxx-57pAzdH3Ffi7x7jAzdH3F1f16fAzdH3FzyzxAzdH3Fx2prAzdH3Frtvf_z%2526e3Bip4%26gsm%3D0%26rpstart%3D0%26rpnum%3D0& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&算盘的搜索结果_百度图片搜索&i class=&icon-external&&&/i&&/a&)&/p&&p&这东西记得小学的时候学过,但是真是难用。。。所以作为新时代的懒人,很多技术人才就开始思考——能不能制造出一种东西来代替我们打算盘?它可以打的更快、而且也不会出错、最重要的可以释放我们作为人的潜力——不要再在打算盘上浪费时间。。怀着对新时代的憧憬,人们开始踏上了探索之路。当然,首先遇到的问题是:如何将数字存储起来?这就牵扯到了数字的表示法。&/p&&p&
人们在很早之前就开始研究数字的表示法。例如我们现在常用的十进制,就是众多数字表示法中的一种。例如罗马数字,就和我们的十进制非常不同:&/p&&p&1-I,2-II,3-III,4-IV,5-V,6-VI,7-VII,8-VIII,9-IX,10-X,11-XI,50-L,100-C,500-D,1000-M&/p&&p&罗马数字的读书规则是:从左到右,当遇上“小-大”(例如XC)这样的符号时,则拿C-X(100-10=90),如果是“大-小”(例如XI)这样的符号组合时,则拿X+I(10+1=11)。&/p&&p&
这个规则有些抽象,下面我们拿两个具体的例子来做一下说明。这个例子能很好的展现人类对数字的处理方法随着时间演变会有如此大的差别:&/p&&p&&b&[e.g.1:MMMCMXCIX, 3999,这是千位数]&/b&&/p&&p&从左到右:M M M C M X C I X。&/p&&p&第一个M(1000)&/p&&p&第二个M()&/p&&p&第三个M(00)&/p&&p&第四个C(比M小,是“大-小”结构,则00+100)&/p&&p&第五个M(左边是C,这是“小-大”结构,因此左边的C要被减掉,也就是00+());&/p&&p&第六个X(比左边M小,因此是“大-小”结构,目前算式为:00+(&br&&/p&&p&第七个C(比左边X大,因此是“小-大”结构,算式改为:00+()+(100-10)&/p&&p&第八个I(比左边C小,因此是“大-小”结构,目前算式为:00+()+(100-10)+1&/p&&p&第九个X(比左边I大,因此是“小-大”结构,目前算式可改为:00+()+(100-10)+(10-1)&/p&&p&最后可以得到MMMCMXCIX所代表的数字就为:&/p&&p&00+()+(100-10)+(10-1)= 3999&br&&/p&&p&&b&【e.g. 2: CXXXIV CMXLV DLXXXIV, &/b&&b&,这是千位以上的数】&/b&&/p&&p&罗马数字还有一个特点:如果数字超过千位,那么就将其按“千”进行分段。因此就可以被分为:134,945,584。三段每个都可以根据上面e.g.1的方法进行处理,最后可以得到相同的结果。&/p&&p&&b&【习题:如何利用这个方法运用程序设计将任何数字改写成罗马数字?】&/b&&/p&&p&
我们用罗马数字表示法来进行数据存储,行不行?答案是:可以的!但是真麻烦。。。【大家可以开个脑洞,如果用罗马数字来进行数字表示,我们现在的计算机会变成什么样子?】&/p&&p&
当然十进制也是很好的表示法,而且它对四则运算十分简单(要不干嘛小学一年级就可以学?)。但用它来做计算机中的数字表示法也有一个极大的缺点——所需要的基本元素太多(0~9共10个数字),这样会导致计算机制造的复杂度大大增加。&/p&&p&
最后聪明的工程师们找到了二进制,它只有0和1两种状态,却可以描述世界上所有的数。下面给出两个例子:&/p&&p&&b&【e.g.3 &img src=&/equation?tex=%282%29_%7B10%7D%3D%B2%7D& alt=&(2)_{10}=(10)_{2}& eeimg=&1&&,括号下面的10代表十进制下的数,2代表二进制下的数】&/b&&/p&&p&&b&【e.g.4 &img src=&/equation?tex=%_%7B10%7D%3D%%29_%7B2%7D& alt=&(1023)_{10}=()_{2}& eeimg=&1&&】&/b&&/p&&p&
并且在电子元件当中,存在有电流/无电流两种状态,因此和二进制数的每一位可以进行完美耦合。那么我们就称每个元器件(对应二进制表示中的一位)为“比特”(bit)。那么8个bit成为1个byte(1 byte = 8 bits),接着计算机中常用的数据量表达式就可以由1024为间隔进行联系:&/p&&img src=&/equation?tex=1TB%3D1024GB%3DMB%3DKB%3DB%3D8%2ABit& alt=&1TB=1024GB=1024^2MB=1024^3KB=*1024^4Bit& eeimg=&1&&&br&&p&
当然在TB上还有PB(&img src=&/equation?tex=1PB%3D1024TB& alt=&1PB=1024TB& eeimg=&1&&),但这个单位在普通个人计算机上没什么使用价值,只在超级计算机上才会有用。&/p&&p&
好,现在我们明确了一件事:我们要使用二进制作为计算机内部数字的表达方式,这种表达方式可以用电器元件的开/关来进行改变。&/p&&p&
那么从哪里找这些“开关”呢?这时,物理学家们研制出来了一种东西——电子管:&/p&&img src=&/v2-3ed058604bced45fc0bbaf4_b.png& data-rawwidth=&240& data-rawheight=&291& class=&content_image& width=&240&&&p&
用这些大个的电子管,人们就成功研制出来了第一台计算机——ENIAC(Electronic Numeric Integral and Computer,电子数字积分计算机)。它大概长这个样子:&/p&&p&&img src=&/v2-2c17d5be44b96f3ddfc87_b.png& data-rawwidth=&485& data-rawheight=&366& class=&origin_image zh-lightbox-thumb& width=&485& data-original=&/v2-2c17d5be44b96f3ddfc87_r.png&&
那时的计算机需要通过手指不断拨动来进行操作(有兴趣的同学可以自行查找资料看看ENIAC等初代计算机是如何使用的)。没有图形界面。。。整个计算机就是一个屋子。。。况且这台计算机的运算速度,可能还没有我们普通的一块手机快。那么从1946年的ENIAC,到目前的超级计算机,期间都发生了什么?&/p&&p&
计算机的体系架构以及硬件中非常专业化的知识,由于我个人能力有限,在此不做说明。如果找到知乎上有有趣的专栏、问题,我会在最后进行收录。在这里只给一个最重要的发展,就是晶体管的研制成功,淘汰了电子管。晶体管长这个样子:&/p&&img src=&/v2-98af7fff6cf79b00d0c63ff_b.png& data-rawwidth=&311& data-rawheight=&247& class=&content_image& width=&311&&&p&当然,如果把晶体管不断的缩小、缩小到了一个芯片上,这时,我们称其为“集成电路”(Integrated Circuit):&br&&/p&&img src=&/v2-cdd650caafd_b.png& data-rawwidth=&515& data-rawheight=&364& class=&origin_image zh-lightbox-thumb& width=&515& data-original=&/v2-cdd650caafd_r.png&&&p&当人们能把越来越多的晶体管(transistor)放到CPU芯片上的时候,CPU的速度就会越来越快。当然这也有引发了一个问题:CPU的发热问题(过多的晶体管发热会过烫,从而烧坏电路)。如何在速度与放热中进行平衡,是目前芯片制造的一大难题。&/p&&p&
我们介绍了计算机的数字表示法、电子管的发展(电子管-》晶体管-》集成电路),下面就要介绍计算机中最重要的基本概念/架构——冯诺依曼计算机。&/p&&p&&b&2. 计算机体系基本结构——冯诺依曼(von Neumann)计算机&/b&&/p&&p&
冯诺依曼将计算机分成了五大块:&/p&&p&&img src=&/v2-4cb599e3ff8ba0eff984_b.png& data-rawwidth=&340& data-rawheight=&227& class=&content_image& width=&340&&
和目前的计算机相比,这五个部分可以看作:&/p&&p&【输入设备】:键盘、鼠标、摄像头、外置传感器等等&/p&&p&【输出设备】:音响、显示屏等等&/p&&p&【外存储器】:硬盘、内存等等&/p&&p&【运算器+控制器+内存储器】:CPU的核心结构&/p&&p&
当然目前还有显卡等一系列帮助CPU更好处理日常任务的“辅助卡”,另外还有网卡、声卡等等。显卡目前NVIDIA是做的比较好的厂家,它们的GPU架构与CPU的比较为:&/p&&p&&img src=&/v2-323a3bda6dceded88d142_b.png& data-rawwidth=&554& data-rawheight=&263& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&/v2-323a3bda6dceded88d142_r.png&&可以看出GPU中加入了非常多的ALU(代数逻辑单元),可以执行大批量的计算任务,因此在各种科学计算中已经开始采用GPU与CPU结合的方式来运行程序。NVIDIA的CUDA框架也为开发者使用GPU铺设了一条道路。&/p&&p&
关于这五大块的设计与其中细节的分析,都有非常多的知识可以去探索。由于本文目的不在此,因此不再赘述。有兴趣者可自行研究。&/p&&p&
在下面会岔开一下,讲讲什么是程序设计,在结合程序设计语言,讲讲目前编程语言的层级结构与具体的实现方法。&/p&&p&&b&3. 什么是程序设计?&/b&&/p&&p&
用大白话说,程序设计就是:“设计一套流程,让计算机按照这条流程运算就能帮助我们解决某一特定问题。”我们有了计算机、可以在计算机中用二进制表示数字、我们还有了冯诺依曼的计算机结构。下面我们就可以拿计算机来做一些事情了。但首先我们要问自己:&b&使用计算机解决问题和人解决问题有哪些本质的区别?&/b&&/p&&p&
最重要的区别就是:计算机是一个大傻瓜,你必须让它“不会引起歧义”的接受每一个确切的指令,它才会按照你的意思去做。另外,计算机只会6个东西:四则运算+判断+循环。除此之外,什么都不会。。。。你面对的就是这么一个愚蠢的、不会变通到极点的东西,怎么办?&/p&&p&
这时,你必须将自己的语言变得足够精确(这里的精确是严格意义上的数学精确,除了数学,计算机不会第二种语言)。因此,乔布斯说过:“编程将教会你如何更好的思考。”&/p&&p&
那么什么是程序设计?你找到了一个问题,你想通过计算机进行解决,你在头脑中想出来了一种解决方案,你把它按照顺序写好,你把它转化成计算机能听懂的严格语言。之后,你就可以通过编程语言将你的这套顺序(算法)写进计算机里,并进行运算得到结果。这个过程就叫程序设计。&/p&&p&
那么下面我们要分两个部分进行程序设计的深入研究。第一部分就是“程序设计语言”,如何将你的“算法”输入到计算机中去,并能让计算机看得懂你在干嘛(毕竟它只能读懂01。。。。。),第二部分就是“算法”如何提出以及相应的“数据结构”是怎么一回事,这里的题目是著名计算机科学家、图灵奖获得者N. Wirth所提出的,他也创造了PASCAL语言(当时参加NOIP的时候用的就是这门语言)。&/p&&p&&b&4. 程序设计语言&/b&&/p&&p&首先安利一个视频,讲编程语言的发展:&a href=&/?target=http%3A///video/av4752673/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&「英文字幕」编程的艺术(The Art of Writing Software)&i class=&icon-external&&&/i&&/a&。这个视频是Computer History Museum(坐落于硅谷)做的,里面有Donald E. Knuth(计算机程序设计艺术作者)、UML创始人以及其他许多计算机发展的重要人士。&/p&&p&程序设计语言是计算机编程、信息产业的核心工具。下图是程序设计语言的一个基本分类与每类之间的层次关系:&/p&&p&&img src=&/v2-daa9fdacbcef9_b.png& data-rawwidth=&352& data-rawheight=&358& class=&content_image& width=&352&&一般情况下1级语言只有非常专业的硬件制造才会学到。在此我们不做阐述。从机器语言开始说,计算机能听懂的语言就是二进制,“。。。。”这一大长串的东西。给大家看看如果我们用机器语言来写程序会是什么样子?&/p&&p&&img src=&/v2-1ee7cbe500c31aef45e47c_b.png& data-rawwidth=&554& data-rawheight=&369& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&/v2-1ee7cbe500c31aef45e47c_r.png&&这时我们作为人类的懒癌又开始发作了。和机器码打交道没意思,我们能不能用一个比较简单的语言来进行代码编写,再使用一个工具将我们编写的代码转换成机器码让机器知道我在说什么?答案是:我们人类做到了!它就是在机器语言往上的一层语言,称为“汇编语言”。&/p&&p&汇编语言长的是什么样子呢?下图就是一个例子:&/p&&p&&img src=&/v2-eed832164beffd496cc85ce69bc1128e_b.png& data-rawwidth=&649& data-rawheight=&334& class=&origin_image zh-lightbox-thumb& width=&649& data-original=&/v2-eed832164beffd496cc85ce69bc1128e_r.png&&还好,我们开始有了“MOV=MOVE”,“OR(或运算)”,“ADD(相加)”等看上去不那么“机器化”的词语了。但是这里有一个很大的问题:我们如何在计算机中表示A~Z以及数字的?这就牵扯到了计算机符号标准的问题。为了简单起见,在这里我们只介绍英文的ASCII码,中文相关的码有空再在专栏中进行专门介绍。&/p&&p&ASCII码(我们前面讲过了1byte=8bits,那么8bits可以存储的信息有:&img src=&/equation?tex=2%5E8%3D256& alt=&2^8=256& eeimg=&1&&个,ASCII码正好有255个,因此我们使用1byte的信息就能完全存储A~Z,a~z,以及0~9或者其他各种符号)。下面两张表格表示的就是从0~255之间的ASCII码:(图片来自百度)&/p&&p&&img src=&/v2-dbeb55d670cc_b.png& data-rawwidth=&790& data-rawheight=&560& class=&origin_image zh-lightbox-thumb& width=&790& data-original=&/v2-dbeb55d670cc_r.png&&&img src=&/v2-9c0b19db2e2ced99a7fd88_b.png& data-rawwidth=&576& data-rawheight=&563& class=&origin_image zh-lightbox-thumb& width=&576& data-original=&/v2-9c0b19db2e2ced99a7fd88_r.png&&那么我们根据ASCII码,就可以将我们写的汇编语言转换成机器能看懂的“汇编语言”。紧接着我们使用“汇编器”将我们的汇编语言转换到机器能读懂的“指令”,这个过程我们称为“编译”。程序设计语言按是否需要编译分为两种:(1)编译语言(例如C,C++,Fortran,Pascal等)(2)解释语言(例如PHP、Python、Perl等)。因此,我们从机器语言跳出来了一些,到了汇编语言。&/p&&p&但到了这里我们就满足了么?当然不会,我们人类怎么会去勤奋的学习汇编语言呢?我们多希望能找到一套完全符合我们说话规范的程序语言,我们直接通过“说话”就可以让计算机完成我们的需求,那该多好啊。别急么,慢慢来。&/p&&p&在汇编语言层次以上就出现了高级语言,最早的高级语言是1956年设计的Fortran语言。1972年,贝尔实验室的D. M. Ritchie在B语言的基础上,开发了C语言。目前已经成为所有计算机语言的基础(一些新兴的计算机语言例如Python、PHP,其底层都是C语言)。&/p&&p&那么C语言的基本结构是什么样的呢?我们分成顺序结构、分支结构、循环结构进行说明:&/p&&ul&&li&顺序结构:&br&&/li&&/ul&&br&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&n&&a&/span&&span class=&o&&=&/span&&span class=&n&&a&/span&&span class=&o&&+&/span&&span class=&mi&&1&/span&&span class=&p&&;&/span&
&span class=&n&&b&/span&&span class=&o&&=&/span&&span class=&n&&b&/span&&span class=&o&&+&/span&&span class=&mi&&1&/span&&span class=&p&&;&/span&
&span class=&n&&printf&/span&&span class=&p&&(&/span&&span class=&s&&&Hello World!&&/span&&span class=&p&&);&/span&
&/code&&/pre&&/div&&ul&&li&分支结构:&/li&&/ul&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&n&&If&/span& &span class=&p&&(&/span&&span class=&n&&condition&/span& &span class=&n&&is&/span& &span class=&nb&&true&/span&&span class=&p&&){&/span&
&span class=&p&&}&/span&
&span class=&k&&else&/span& &span class=&p&&{&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&k&&switch&/span& &span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&)&/span&&span class=&o&&:&/span&&span class=&p&&{&/span&
&span class=&k&&case&/span& &span class=&nl&&I&/span&&span class=&p&&:&/span&
&span class=&k&&case&/span& &span class=&nl&&II&/span&&span class=&p&&:&/span&
&span class=&k&&case&/span& &span class=&nl&&III&/span&&span class=&p&&:&/span&
&span class=&k&&default&/span&&span class=&o&&:&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&ul&&li&循环结构:&/li&&/ul&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&n&&For&/span& &span class=&p&&(&/span&&span class=&n&&i&/span&&span class=&o&&=&/span&&span class=&mi&&1&/span&&span class=&p&&;&/span& &span class=&n&&i&/span&&span class=&o&&&&/span&&span class=&mi&&100&/span&&span class=&p&&;&/span& &span class=&n&&i&/span&&span class=&o&&++&/span&&span class=&p&&){&/span&
&span class=&p&&};&/span&
&/code&&/pre&&/div&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&n&&While&/span& &span class=&p&&(&/span&&span class=&n&&i&/span& &span class=&n&&is&/span& &span class=&nb&&true&/span&&span class=&p&&){&/span&
&span class=&p&&};&/span&
&/code&&/pre&&/div&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&Do{
while (condition is true);
&/code&&/pre&&/div&&p&针对每一个程序设计语言,它的学习思路都是:&/p&&p&了解顺序结构、分支结构、循环结构的写法---》看看函数/过程的写法---》【如果程序设计语言包含面向对象特性】看看类/对象/接口的写法---》看看是否有标准库(例如C++中STL库)---》网上有没有其他的一些package,SDK等等。&/p&&p&所有的程序设计语言几乎都非常类似。但是尽管如此,它们还是有一些区别的。所有程序设计语言我们可以把它们分成如下四类:(以下材料摘自&a href=&/?target=http%3A///link%3Furl%3Dsw4HjB_V_WVHoJ05wZ-ShEIk1qozhq7LWBO8M5GPKTJdI_Uw_xO6-C5Sejqfbw1HTHwEUqJWcDmRJSlymNpzNfinayN-cjFPkeAuj0khBvqbELSLUS56TgW7GmhhKjmd& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&高级语言_百度百科&i class=&icon-external&&&/i&&/a&)&/p&&p&&img src=&/v2-5cff5dd7fadb55accd3ddd9a65fb4bc7_b.png& data-rawwidth=&798& data-rawheight=&301& class=&origin_image zh-lightbox-thumb& width=&798& data-original=&/v2-5cff5dd7fadb55accd3ddd9a65fb4bc7_r.png&&尽管有不同的语言,但它们的目的都是一样的:&b&将你头脑中的“所思”变成计算机可以处理的“所想”,并得到你想期望得到的结果。&/b&&/p&&p&下面我们将采用N.Wirth对程序的理解,对程序当中最重要的两块:算法、数据结构进行描述。&/p&&br&&p&&b&5. 程序=算法+数据结构&/b&&/p&&p&什么是算法?什么又是数据结构?我们先看百度上的定义:&/p&&p&【算法】:算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。(&a href=&/?target=http%3A///link%3Furl%3DHTffj8dt7N5I7PDGm5rktZqPOIZW5Btu36Rpa2nEvGd0ZbAObEVdZ-b6sWnpY5dKpgevMzb0bjiCbFRC-ViO0PjKJZzJwS3tC9dqfoeVq-e& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&算法_百度百科&i class=&icon-external&&&/i&&/a&)&/p&&br&&p&【数据结构】:数据结构是计算机存储、组织数据的方式。(&a href=&/?target=http%3A///link%3Furl%3DHbYqecuuv1NoYGRK5lZfjsM5gZFDARDqPKeAQGO086fRKXzAGCcXDlRpc2XOEyzL3Y2ojVh5k39UfVbmqEEAprqzONKZpiWWV8xkGpzWf5mLtqEgYTTh5keGd5hu1Idr& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&数据结构(计算机存储、组织数据方式)_百度百科&i class=&icon-external&&&/i&&/a&)&/p&&p&本文不打算介绍算法与数据结构的详细内容。因为它们实在太繁杂、也有太多出色的教材了。(参考资料一样在文章末尾)&/p&&ul&&li&当然它们是计算机科学以及程序设计中的灵魂,有着“牵一发动全身”的地位。下面想着重讲述的,是:(1)算法和数据结构究竟在程序设计中有什么样的地位?(2)为什么我们要学习它们?(3)应该怎样来学?(4)如何检验我们的学习成果?&br&&/li&&br&&li&针对第一个问题。我们在处理任何问题的时候,首先要搞清楚以下几点:(1)整个问题当中所有的已知量是什么?未知量是什么?(2)它们之间可能存在什么样的关系?(3)如何用数学表述从已知量到未知量的过程?(4)在计算机中如何记录这种过程?。第三个点所要解决的就是处理问题的“算法”;而第四点所要解决的就是处理问题时所使用的“数据结构”。&br&&/li&&li&针对第二个问题。为什么要学习它们?因为学习算法、数据结构会让我们了解以下问题:&br&&/li&&/ul&&br&&p&(1)前人在某些特殊问题上已经存在那些算法?&/p&&p&(2)这些算法的描述运用了何种数据结构?&/p&&p&(3)在计算机中这种数据结构如何进行存储的?&/p&&p&(4)算法的时间复杂度、空间复杂度如何?&/p&&p&(5)算法的鲁棒性如何?&/p&&p&(6)算法的最优/最差运行时间、占据内存会有多大?&/p&&p&(7)算法离最优化的瓶颈在什么地方?可能的克服方式有哪些?&/p&&p&(8)数据结构针对不同问题应该如何选择?哪种数据结构能更好的描述我所接触到的问题?&/p&&ul&&li&针对第三个问题。应该如何来学习算法?我认为只要针对每个算法和数据结构,问自己以上8个问题。多去把算法在计算机上进行演练,并针对不同的测试组(大小或混乱度)进行多次测试,自己对算法、数据结构的把握将会越来越好。More practice make you better.&/li&&li&针对第四个问题。如何检验我们的学习成果?我的答案是:&b&&u&多做OJ(Online Judge),多去参加比赛&/u&&/b&(TopCoder, Baidu, Google等大公司都会有各种编程比赛。一方面是为了宣传自己,另一方面也是从中筛选出算法设计和编程能力强的人,这些人将会得到实习机会甚至提前面试机会)&/li&&/ul&&p&今后如果有时间会对算法、数据结构进行细致的讨论。&/p&&br&&p&&b&6. 计算机中的数学&/b&&/p&&p&要说计算机中所使用的数学与数学系所学的数学有何不同之处的话,就不得不提高德纳(Donald E. Knuth)这个人。此人是著名的《计算机程序设计艺术》(The Art of Computer Programming,TAOCP)的作者。1938年出生的高德纳,在1974年(仅36岁)获得了有“计算机界诺贝尔奖”之称的图灵奖。同时他也是目前运用最多的排版软件Tex的设计者。他在斯坦福大学开设了一门数学课,称为“具体数学”(Concrete Mathematics)。因为Concrete同时还有混泥土的意思,因此许多工程学院的学生也跑来听高德纳的课。结果发现讲的内容与他们完全不搭界。。。。有关这门课的讲义还被汇总成了一本书,名字就是《Concrete Mathematics》。书的封面如下:&/p&&img src=&/v2-cea40e4eab_b.png& data-rawwidth=&258& data-rawheight=&366& class=&content_image& width=&258&&&p&计算机中所需要的数学很大程度上是与算法、数据结构联系在一起的。由于在计算机中我们处理的是数据,那么这就牵扯到:(1)数据将如何表示【数据结构】(2)数据之间如何处理【算法】。而且由于计算机只能处理0,1,因此计算机讨论的数学属于离散数学范畴。如果学习计算机理论的话,还要学习数理逻辑以及计算理论等高深的数学知识(虽然好想学,但没时间啊)。。。&/p&&p&对数据结构的研究有:表(List)【栈与队列及其操作】--& 树(有层级的数据,比较重要的有二叉树)--& 图(表达数据之间的关系,比较著名的算法有:(1)Kruskal最小生成树算法(2)Dijkstra最短路径(3)网络流的相关算法)&/p&&p&对算法的研究可以粗浅的分成两块:(1)算法本身的研究【时间复杂度、空间复杂度、鲁棒性、与其他算法之间的比较、最优复杂度、最差复杂度】(2)对某一个问题进行算法研究【排序、查找、搜索、树(图)等数据结构中的专门算法、人工智能算法(现在比较热门的)】&/p&&p&具体的算法在这篇文章中就不进行详细讨论了,以后会专门发文讨论比较有趣和重要的算法(也欢迎大家提出自己感兴趣的算法~帮助我更好的组织文章。)&/p&&p&-----------------------------------------下篇预告-----------------------------------------&/p&&p&7. 互联网的提出、发展与未来&/p&&p&8. 网络编程&/p&&p&9. 移动互联网与App&/p&&p&10. 信息产业分工(技术部分)&/p&&p&11. 未来的信息产业——路在何方?&/p&
【写在前面的话】:21世纪全球信息化的速度将越来越快。随着人工智能和移动互联网的兴起,越来越多的人开始投身于信息产业中。我们如何迎着这股浪潮找到属于自己的风口浪尖?首先得制作自己的“冲浪板”——也就是信息产业所需要的基础知识。在知乎上类似的…
&img src=&/50/v2-1ca84ef52638dbcbd3dc81bd45b4124c_b.jpg& data-rawwidth=&800& data-rawheight=&499& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/50/v2-1ca84ef52638dbcbd3dc81bd45b4124c_r.jpg&&&p&原文链接:&a href=&/?target=http%3A///archives/1614.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&你又可以大幅提升项目性能啦! - Blog&i class=&icon-external&&&/i&&/a&&/p&&p&在之前的UWA性能检测与分析报告中,研发团队只能通过加载模块的整体耗时来查看该模块的性能瓶颈。在今天推出的新版本中,我们又前进了一大步:&strong&通过对资源管理进行定量分析,让大家看到每个资源的加载/卸载、每个GameObject的Instantiate/Destroy等具体耗时情况,从而让优化更显直观具象!&/strong&&a href=&&&下面让我们一起来了解这些新特性吧!&/a&&/p&&h2&&strong&新功能特性详细说明&/strong&&/h2&&p&UWA本次新功能的特性主要为&strong&资源加载、GameObject Instantiate/Destroy、GameObject Active/Deactive、资源管理汇总四大功能模块&/strong&,下面小编将一一为大家说明。&/p&&h2&&strong&一、资源加载&/strong&&/h2&&p&重点分析项目通过Resources和AssetBundle的加载开销,说明如下:&/p&&p&&strong&1. AssetBundle资源加载&/strong&&/p&&p&在AssetBundle加载页面中,用户可以看到&strong&每个具体资源在项目检测过程中的具体CPU耗时&/strong&,同时我们在之前版本的基础上还明确了资源的&strong&加载母体AssetBundle信息&/strong&,这样可以帮助研发团队更加方便地定位和优化。&/p&&br&&img src=&/v2-a7b1057ace60080ae71edc63e902ec99_b.png& data-rawwidth=&1513& data-rawheight=&737& class=&origin_image zh-lightbox-thumb& width=&1513& data-original=&/v2-a7b1057ace60080ae71edc63e902ec99_r.png&&&p&&strong&2. Resource加载&/strong&&br&支持用户在Resource加载页面中对耗时选项进行排序,其资源加载耗时的Top10即可一目了然。&br&&/p&&br&&img src=&/v2-1fc32af1bffff7fcf5aead9_b.png& data-rawwidth=&1513& data-rawheight=&831& class=&origin_image zh-lightbox-thumb& width=&1513& data-original=&/v2-1fc32af1bffff7fcf5aead9_r.png&&&p&&strong&特别说明:&/strong&该新功能不仅可以让用户看到整体加载耗时和加载次数,同时还可以通过图表来显示具体每次加载的位置和耗时。如下图,资源文件cite_girl(图中右上角)是通过AssetBundle.Load来加载的,可以看到在项目检测过程中,该资源被频繁加载,且每次加载耗时主要集中在100~200ms之间。&br&&/p&&img src=&/v2-4f05595f2fefc7df6ab591bf9e73db14_b.png& data-rawwidth=&1514& data-rawheight=&533& class=&origin_image zh-lightbox-thumb& width=&1514& data-original=&/v2-4f05595f2fefc7df6ab591bf9e73db14_r.png&&&p&下图中的SpeedRaceUI和UIscene_BJT是通过Resources.Load来加载的,可以看到在项目检测过程中,该资源被频繁加载,前者加载耗时主要集中在300ms左右,后者则主要集中在150ms左右。&br&&/p&&img src=&/v2-cef6678abc9e3ba_b.png& data-rawwidth=&1514& data-rawheight=&430& class=&origin_image zh-lightbox-thumb& width=&1514& data-original=&/v2-cef6678abc9e3ba_r.png&&&br&&h2&&strong&二、GameObject Instantiate/Destroy&/strong&&/h2&&p&GameObject实例化和销毁耗时同样是研发团队非常希望掌握的一个关键点。在UWA今天更新的版本中,我们将会让研发团队&strong&明确任何一个GameObject在实例化和销毁时的CPU占用情况。大家不仅可以看到最为耗时的GameObject,同时还可以看到其每次触发的时间点。&/strong&&/p&&p&下图中的YX_DCJM_02,在游戏过程中被频繁实例化,且每次耗时均将近100ms,对此,研发团队完全可以考虑将其缓存,以避免后续0.1s的开销。&br&&/p&&img src=&/v2-6ee2eea48da748aa06cb77b1a008d99a_b.png& data-rawwidth=&1514& data-rawheight=&742& class=&origin_image zh-lightbox-thumb& width=&1514& data-original=&/v2-6ee2eea48da748aa06cb77b1a008d99a_r.png&&&img src=&/v2-f4eccfb317b19e49e8d468d02b5f498c_b.png& data-rawwidth=&1514& data-rawheight=&531& class=&origin_image zh-lightbox-thumb& width=&1514& data-original=&/v2-f4eccfb317b19e49e8d468d02b5f498c_r.png&&&br&&h2&&b&三、GameObject Active/Deactive&/b&&/h2&&p&GameObject Active/Deactive是研发团队非常容易忽视的,大多数团队认为状态的切换开销甚微,&strong&但正是由于这些“疏忽”导致了某些GameObject的Active/Deactive切换造成了大量的CPU耗时。&/strong&&/p&&p&下图则为游戏检测过程中,shadow的Active/Deactive的操作由于大量次数的累积,都是属于一个较高的耗时。&/p&&img src=&/v2-a3cbe40de0b7dfc2908c15e_b.png& data-rawwidth=&1514& data-rawheight=&737& class=&origin_image zh-lightbox-thumb& width=&1514& data-original=&/v2-a3cbe40de0b7dfc2908c15e_r.png&&&img src=&/v2-107bf125c5dcd8_b.png& data-rawwidth=&1514& data-rawheight=&738& class=&origin_image zh-lightbox-thumb& width=&1514& data-original=&/v2-107bf125c5dcd8_r.png&&&img src=&/v2-a7e6e859ce64d37b5b84bfa_b.png& data-rawwidth=&1514& data-rawheight=&433& class=&origin_image zh-lightbox-thumb& width=&1514& data-original=&/v2-a7e6e859ce64d37b5b84bfa_r.png&&&p&&strong&通过这些功能中的数据,研发团队可以从以下几点进行针对性优化:&/strong&&/p&&ul&&li&针对加载频繁且耗时的资源,可以详细对其资源进行检测,查看是否有进一步优化的空间(比如纹理可检查其分辨率、格式等);&/li&&li&当研发团队明确了加载或实例化的瓶颈后,可针对具体资源、GameObject进行缓存,从而降低其CPU耗时。&/li&&/ul&&br&&h2&&strong&四、资源管理汇总&/strong&&/h2&&p&以UWA的优化经验来看,二八定律同样适用于项目的开发管理,即80%的性能问题集中在20%的资源中。为此,我们将&strong&需要注意的Top10的问题直接反馈给用户(新版本中的“资源管理汇总”界面)&/strong&,用户通过对这些重点对象的快速处理,能在短期时间内达到立竿见影的优化效果。目前主要包括:&/p&&p&&strong&(1)AssetBundle的加载次数Top10&/strong&&br&&/p&&img src=&/v2-bac14c8154fb8fcc7abc1_b.png& data-rawwidth=&2348& data-rawheight=&1383& class=&origin_image zh-lightbox-thumb& width=&2348& data-original=&/v2-bac14c8154fb8fcc7abc1_r.png&&&p&&strong&(2)资源加载的次数和耗时Top10&/strong&&br&&/p&&img src=&/v2-be21236b9efdb0e9da17c74e7cb91d2d_b.png& data-rawwidth=&2366& data-rawheight=&1392& class=&origin_image zh-lightbox-thumb& width=&2366& data-original=&/v2-be21236b9efdb0e9da17c74e7cb91d2d_r.png&&&p&&strong&(3)GameObject 实例化/销毁次数和耗时Top10&/strong&&br&&/p&&img src=&/v2-06a4cecabcebacf7_b.png& data-rawwidth=&2360& data-rawheight=&1389& class=&origin_image zh-lightbox-thumb& width=&2360& data-original=&/v2-06a4cecabcebacf7_r.png&&&img src=&/v2-95f2c463dd1fe947da843dea73051eeb_b.png& data-rawwidth=&2362& data-rawheight=&1108& class=&origin_image zh-lightbox-thumb& width=&2362& data-original=&/v2-95f2c463dd1fe947da843dea73051eeb_r.png&&&p&&strong&(4)GameObject Active/Deactive次数和耗时Top10&/strong&&br&&img src=&/v2-082f15d9d5b9090e8bdc2_b.png& data-rawwidth=&2363& data-rawheight=&1383& class=&origin_image zh-lightbox-thumb& width=&2363& data-original=&/v2-082f15d9d5b9090e8bdc2_r.png&&&img src=&/v2-fa4bb0da8fedfa523d46daa392e4cda5_b.png& data-rawwidth=&2365& data-rawheight=&1098& class=&origin_image zh-lightbox-thumb& width=&2365& data-original=&/v2-fa4bb0da8fedfa523d46daa392e4cda5_r.png&&&/p&&h2&&strong&五、其他更新&/strong&&/h2&&p&&strong&1. 截图功能更新&/strong&&/p&&p&在当前版本中,我们将项目的运行&strong&截图从原来的 5秒/张 提升为 1秒/张&/strong&,从而反映更详细全面的项目运行情况,助您更犀利地洞察每一个性能瓶颈,捕捉任何可以优化的机会!&br&&/p&&img src=&/v2-7c61f145cca5ff98d46dcd9bd2dfc03f_b.png& data-rawwidth=&1384& data-rawheight=&633& class=&origin_image zh-lightbox-thumb& width=&1384& data-original=&/v2-7c61f145cca5ff98d46dcd9bd2dfc03f_r.png&&&p&&strong&2. iOS SDK 更新&/strong&&br&在当前版本中,我们大力完善了SDK的兼容,主要包括:&/p&&ul&&li&增加了截图功能对Metal的支持,不再限制打包项目时所选择的Graphic API&/li&&li&增加了对使用sLua和ToLua项目的支持&/li&&li&增加了对使用sLua,ToLua和uLua的项目的集成检测功能,用户可以一键检测SDK的集成是否成功&/li&&/ul&&h2&&strong&关于UWA&/strong&&/h2&&p&由侑虎科技开发的游戏/VR应用性能优化平台,目前提供 &a href=&/?target=https%3A///%23feature& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&1)性能检测与优化&i class=&icon-external&&&/i&&/a& 和 &a href=&/?target=https%3A///%23assetbundle& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&2)资源检测与分析&i class=&icon-external&&&/i&&/a& 两大工具。同时,我们也会万象更新地为大家开发更省心的功能,希望通过它们可以减少开发者反复测试定位问题的时间,从而将更多的精力集中在项目开发和解决问题中,能为大家项目研发省下的任何一分一秒,都是UWA团队的骄傲。&/p&&p&官网:&a href=&/?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&&i class=&icon-external&&&/i&&/a&&br&官方技术博客:&a href=&/?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&&i class=&icon-external&&&/i&&/a&&br&官方技术QQ群:(非水群,仅限技术交流)&/p&
原文链接:在之前的UWA性能检测与分析报告中,研发团队只能通过加载模块的整体耗时来查看该模块的性能瓶颈。在今天推出的新版本中,我们又前进了一大步:通过对资源管理进行定量分析,让大家看到每个资源的加载/卸载、…
&img src=&/50/v2-beb90efa1e7e6f57ca308d68dd005a6b_b.jpg& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/50/v2-beb90efa1e7e6f57ca308d68dd005a6b_r.jpg&&在国内的游戏中,直接关乎游戏体验的Camera ,Character,Controller往往不受重视,而这些在主机游戏中却是重中之重,这次一起来看下神秘海域中角色控制和动画方面的技术。&br&&br&完整的视频链接在&p&&a href=&/?target=http%3A///play/1012300/Animation-and-Player-Control-in& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Animation and Player Control in Uncharted: Drake's Fortune and Uncharted II: Among Thieves&i class=&icon-external&&&/i&&/a&&/p&&img src=&/v2-75ac178f537ff33a4dd6_b.png& data-rawwidth=&625& data-rawheight=&468& class=&origin_image zh-lightbox-thumb& width=&625& data-original=&/v2-75ac178f537ff33a4dd6_r.png&&&br&&p&虽然是GDC的老视频,但还是可以带来很多启发。下面简单分享一下。&/p&&p&Uncharted2和Uncharted1的对比,滑步,悬空&/p&&img src=&/v2-f03b38c4fe62dbfdc9e1042_b.png& data-rawwidth=&635& data-rawheight=&459& class=&origin_image zh-lightbox-thumb& width=&635& data-original=&/v2-f03b38c4fe62dbfdc9e1042_r.png&&&br&&h2&&b&Non Standard Animation Features&/b&&/h2&&p&其实是一些应该作为标准的features&br&&/p&&img src=&/v2-c4d1e41e87b0d9645205ccec39f2c12c_b.png& data-rawwidth=&626& data-rawheight=&473& class=&origin_image zh-lightbox-thumb& width=&626& data-original=&/v2-c4d1e41e87b0d9645205ccec39f2c12c_r.png&&&br&&p&&b&Animation
Layering&/b&&/p&&img src=&/v2-47ccf552d11a98923b85d_b.png& data-rawwidth=&627& data-rawheight=&475& class=&origin_image zh-lightbox-thumb& width=&627& data-original=&/v2-47ccf552d11a98923b85d_r.png&&&br&&p&作为最重要的Animation Feature&/p&&p&比如可以同时换弹夹,又可以同时跑动或者roll。&/p&&img src=&/v2-b8b61bdeac_b.png& data-rawwidth=&628& data-rawheight=&463& class=&origin_image zh-lightbox-thumb& width=&628& data-original=&/v2-b8b61bdeac_r.png&&&br&&p&&b&Partial
Sets&/b&&/p&&p&一些动作只需要动对应的partial sets,比如换手枪子弹。&/p&&img src=&/v2-c13e116bcde358b51e72cd_b.png& data-rawwidth=&628& data-rawheight=&470& class=&origin_image zh-lightbox-thumb& width=&628& data-original=&/v2-c13e116bcde358b51e72cd_r.png&&&p&个人理解应该类似于Unity中的Animator mask。&/p&&br&&p&&b&Reference Nodes&/b&&/p&&img src=&/v2-444e14fb0c96f80ee30b7_b.png& data-rawwidth=&629& data-rawheight=&461& class=&origin_image zh-lightbox-thumb& width=&629& data-original=&/v2-444e14fb0c96f80ee30b7_r.png&&&p&主要是用来攀爬的时候,作为动作的一个目标点。&br&&/p&&p&&b&Flipping&/b&&/p&&img src=&/v2-7e26f0140f8ade159471_b.png& data-rawwidth=&630& data-rawheight=&466& class=&origin_image zh-lightbox-thumb& width=&630& data-original=&/v2-7e26f0140f8ade159471_r.png&&&br&&img src=&/v2-1a389f112bcc4ca61d1569bbdfc9f9d0_b.png& data-rawwidth=&624& data-rawheight=&469& class=&origin_image zh-lightbox-thumb& width=&624& data-original=&/v2-1a389f112bcc4ca61d1569bbdfc9f9d0_r.png&&&br&&p&只需要做出一个方向的Animation 就可以了&/p&&p&&b&Basic Movement&/b&&/p&&p&基本的移动是超级重要的一个点&/p&&img src=&/v2-da333e421ddfeb_b.png& data-rawwidth=&629& data-rawheight=&472& class=&origin_image zh-lightbox-thumb& width=&629& data-original=&/v2-da333e421ddfeb_r.png&&&p&在一代中,用两个球叠起来作为玩家,然后用一些盒子来作为场景,先把功能实现,然后再把动画合进去,称之为Sphere man in Box World。看似很不错,用两个球来作为角色,但当把角色放进去的时候会有些坑爹,会产生很多滑步。 &/p&&img src=&/v2-38ca0e9c65dafad110364_b.png& data-rawwidth=&626& data-rawheight=&465& class=&origin_image zh-lightbox-thumb& width=&626& data-original=&/v2-38ca0e9c65dafad110364_r.png&&&p&在二代中,有了八方向的IdleToRun State,当玩家推动摇杆,角色并不会立即响应移动,先行进行转身,大概是0.25s,然后是一个blend的过程&/p&&p&通过动画来驱动玩家的位置,这样就可以完全的避免滑步。&/p&&img src=&/v2-3cf7ebf22da09325b9bb_b.png& data-rawwidth=&626& data-rawheight=&471& class=&origin_image zh-lightbox-thumb& width=&626& data-original=&/v2-3cf7ebf22da09325b9bb_r.png&&&br&&p&从Animation Control movement 到Joystick Control movement&/p&&img src=&/v2-2f39da6dba_b.png& data-rawwidth=&627& data-rawheight=&469& class=&origin_image zh-lightbox-thumb& width=&627& data-original=&/v2-2f39da6dba_r.png&&&p&四种方向的转身,90, 180, 270,&/p&&img src=&/v2-d6a445d8ba1_b.png& data-rawwidth=&601& data-rawheight=&450& class=&origin_image zh-lightbox-thumb& width=&601& data-original=&/v2-d6a445d8ba1_r.png&&&br&&p&还有就是通过Layering 生成多种动画。&/p&&img src=&/v2-9dcdd94f94e14c649e93_b.png& data-rawwidth=&633& data-rawheight=&465& class=&origin_image zh-lightbox-thumb& width=&633& data-original=&/v2-9dcdd94f94e14c649e93_r.png&&&br&&p&脸部有97根骨骼,手部有10多根,整个身体有10多根。&/p&&p&最终的结果是,手部的动画只有4到5个,脸部的动画只有10多个,在95%的基础动画并没有脸部或者手部的动画,&/p&&p&节省了超级多的内存。&/p&&img src=&/v2-0c3ab4ef6ecd3c9bd8f3b_b.png& data-rawwidth=&1028& data-rawheight=&579& class=&origin_image zh-lightbox-thumb& width=&1028& data-original=&/v2-0c3ab4ef6ecd3c9bd8f3b_r.png&&&p&左边是最基础的BaseAnimation,最右边的是装弹,射击的手部的动作,最终合成的Final Animation。&/p&&p&如果没有Layering,这做起来会非常困难。&/p&&p&&b&Additive Animations&/b&&/p&&img src=&/v2-02508fccafed1bc68cb77d2b947eac49_b.png& data-rawwidth=&631& data-rawheight=&472& class=&origin_image zh-lightbox-thumb& width=&631& data-original=&/v2-02508fccafed1bc68cb77d2b947eac49_r.png&&&p&最左边的动画只有一帧,右边是Additive,得到了中间的Idle,这样,我们只要做各种一帧的Idle,就可以得到很多种的Idle。&/p&&img src=&/v2-b555ea4c7b1ce24650bd1_b.png& data-rawwidth=&626& data-rawheight=&470& class=&origin_image zh-lightbox-thumb& width=&626& data-original=&/v2-b555ea4c7b1ce24650bd1_r.png&&&p&&b&IK&/b&&/p&&p&通过Additive可以得到很多的动画,但是引出了新的问题,动画的不精确性。比如下面的持枪动画。&/p&&img src=&/v2-3f6c6dc6618bca8d04c9024efc890d64_b.png& data-rawwidth=&627& data-rawheight=&472& class=&origin_image zh-lightbox-thumb& width=&627& data-original=&/v2-3f6c6dc6618bca8d04c9024efc890d64_r.png&&&br&&p&解决方法是Two bone IK&/p&&img src=&/v2-5b8f5f0e3f87b6b9a328dd902f50157d_b.png& data-rawwidth=&630& data-rawheight=&470& class=&origin_image zh-lightbox-thumb& width=&630& data-original=&/v2-5b8f5f0e3f87b6b9a328dd902f50157d_r.png&&&p&还是Additive,脚步出现了滑动,这时候就需要锁脚IK&/p&&img src=&/v2-51a83c06c8e87cd504db5b_b.png& data-rawwidth=&630& data-rawheight=&472& class=&origin_image zh-lightbox-thumb& width=&630& data-original=&/v2-51a83c06c8e87cd504db5b_r.png&&&p&另一个问题就是根据地势的高低不同来确定脚的位置。&/p&&p&首先通过Ray-Mesh cast来确定脚下的位置,然后通过IK来确定骨骼的位置。&/p&&img src=&/v2-2de8c49bd7b2b62a34c2411de8bcb41e_b.png& data-rawwidth=&638& data-rawheight=&466& class=&origin_image zh-lightbox-thumb& width=&638& data-original=&/v2-2de8c49bd7b2b62a34c2411de8bcb41e_r.png&&&p&&b& Remapping&/b&&/p&&img src=&/v2-b2c82e43476_b.png& data-rawwidth=&631& data-rawheight=&472& class=&origin_image zh-lightbox-thumb& width=&631& data-original=&/v2-b2c82e43476_r.png&&&br&&p&只要制作出了一种Movement,就可以用在不同的movement身上,这只需要配置,都不需要程序员插手。&/p&&img src=&/v2-86bf2e13a22e_b.png& data-rawwidth=&631& data-rawheight=&462& class=&origin_image zh-lightbox-thumb& width=&631& data-original=&/v2-86bf2e13a22e_r.png&&&p&同样的形况还有各种持枪的行为。&/p&&p&下面是一种movement的配置。&/p&&img src=&/v2-630d13a3c510a5a394a7bce7fba895ac_b.png& data-rawwidth=&630& data-rawheight=&471& class=&origin_image zh-lightbox-thumb& width=&630& data-original=&/v2-630d13a3c510a5a394a7bce7fba895ac_r.png&&&p&最后讲了内存的情况,估计在PS3上非常吃紧,一直在强调。&/p&&img src=&/v2-b1225fdcaecc24b_b.png& data-rawwidth=&631& data-rawheight=&475& class=&origin_image zh-lightbox-thumb& width=&631& data-original=&/v2-b1225fdcaecc24b_r.png&&
在国内的游戏中,直接关乎游戏体验的Camera ,Character,Controller往往不受重视,而这些在主机游戏中却是重中之重,这次一起来看下神秘海域中角色控制和动画方面的技术。 完整的视频链接在
&img src=&/50/v2-52ce95cf2ae61ff_b.jpg& data-rawwidth=&1324& data-rawheight=&609& class=&origin_image zh-lightbox-thumb& width=&1324& data-original=&/50/v2-52ce95cf2ae61ff_r.jpg&&&p&相信各位小伙伴之前都听过一句话,叫做边玩儿边学。又有多少小伙伴被这句话给骗了呢,哪里来的玩儿呢,最后全部变成枯燥无味的学了!但是今天效率君给大家介绍的这款软件真的是让大家边玩儿边学,而且是你玩儿的越好就学的越好!他就是——CodeCombat!&/p&&img src=&/v2-52ce95cf2ae61ff_b.png& data-rawwidth=&1324& data-rawheight=&609& class=&origin_image zh-lightbox-thumb& width=&1324& data-original=&/v2-52ce95cf2ae61ff_r.png&&&p&CodeCombat 是一款有趣的开源编程游戏,它使用代码来操控游戏人物,让你一边沉浸在游戏乐趣中一边学习编程技术(Javascript 、Python 等)。从最初小白入门级的单人关卡到后来高难度的多人对战,各个层次的程序猿都可以乐在其中并从各种战斗中不断吸取编程知识。&br&&img src=&/v2-7c47d0a14f11f_b.png& data-rawwidth=&1314& data-rawheight=&607& class=&origin_image zh-lightbox-thumb& width=&1314& data-original=&/v2-7c47d0a14f11f_r.png&&&/p&&br&CodeCombat 的创始人 George 在开始学习编程时,也曾使用了知名的&a href=&/?target=https%3A///zh& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Codecademy&i class=&icon-external&&&/i&&/a&,但他还是觉得太乏味了然后放弃,他了解到自己的朋友们也遇到了这样的情况。后来他想明白了背后真正的原因:人们想要有趣且高效的学习,但得到的却是缓慢且乐趣不足的课程。&br&&br&因此,George 和小伙伴们一起创造了 CodeCombat,希望能让想学习编程的人可以真正享受这一过程,而不是将编程当作枯燥的码代码!&img src=&/v2-dca1e37b4fd8b37a21de2d63ce514853_b.png& data-rawwidth=&1306& data-rawheight=&596& class=&origin_image zh-lightbox-thumb& width=&1306& data-original=&/v2-dca1e37b4fd8b37a21de2d63ce514853_r.png&&&p&CodeCombat 整体的画风与效率君之前推荐的不思议迷宫很相似,可爱卡通风格看起来很棒,音效处理也非常带感。而且整个游戏关卡足足有九千多关,足够你玩。虽然是老外开发的,但是支持中文,小白都能玩儿的特别顺溜!不管是从玩游戏还是学习的角度来讲,都是一个非常棒的选择!&/p&&p&如果你迫不及待的想体验一番的话,请戳这儿→→→→→→→&a href=&/?target=https%3A//www.codecombat.cc/play/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CodeCombat: Learn to Code by Playing a Game&i class=&icon-external&&&/i&&/a&&/p&&p&对了,oeasy老师还录了关于CodeCombat的通关视频,有哪儿不会的也可以通过老师这儿来学!&a href=&/?target=http%3A///course/introduction.htm%3FcourseId%3D%23/courseDetail& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&玩游戏也能学编程-CodeCombat - 网易云课堂&i class=&icon-external&&&/i&&/a&&/p&&p&&b&我是效率君,更多福利干货,欢迎关注我的公众号“我们都是效率控”!&/b&&/p&&img src=&/v2-e1e7e910b32e77bfc53cf2_b.jpg& data-rawwidth=&666& data-rawheight=&704& class=&origin_image zh-lightbox-thumb& width=&666& data-original=&/v2-e1e7e910b32e77bfc53cf2_r.jpg&&
相信各位小伙伴之前都听过一句话,叫做边玩儿边学。又有多少小伙伴被这句话给骗了呢,哪里来的玩儿呢,最后全部变成枯燥无味的学了!但是今天效率君给大家介绍的这款软件真的是让大家边玩儿边学,而且是你玩儿的越好就学的越好!他就是——CodeCombat!Code…
&img src=&/50/v2-8eabeea8e2873_b.jpg& data-rawwidth=&900& data-rawheight=&500& class=&origin_image zh-lightbox-thumb& width=&900& data-original=&/50/v2-8eabeea8e2873_r.jpg&&&p&&i&本文作者肖伟涛,4年游戏行业经验,在线教育PM一枚,专注用户场景的搭建和需求拆分。&/i&&/p&&br&&p&今天我们来聊一个普遍且比较有共性的运营问题。如果聊完你们觉得还不错,以后我们可以以类似的方式来试着每周聊一次。&/p&&img src=&/50/v2-df412c3850f69dbc7e6a78bea1b5f9b1_b.jpg& data-rawwidth=&900& data-rawheight=&500& class=&origin_image zh-lightbox-thumb& width=&900& data-original=&/50/v2-df412c3850f69dbc7e6a78bea1b5f9b1_r.jpg&&&p&印象中,几乎大部分运营或者产品都会在培养用户付费习惯的过程中,踩过或大或小的坑,甚至对于一些运营小朋友而言,面对这方面的问题时都是一脸懵逼的:&strong&什么是培养用户付费习惯?我应该从哪些地方入手来培养用户的付费习惯呢?&/strong&&/p&&br&&p&所以今天,我们要花费一点时间,来聊一聊这个问题:&strong&如何更好地培养用户的付费能力和习惯&/strong&。我会试着基于核心业务流程和产品的体验流畅度默认没有问题的前提下,从推进用户付费的这个维度上,分别从以下3个角度来聊:&/p&&p&&strong&1. 如何提高用户对(付费)产品的认知;&/strong&&br&&/p&&p&&strong&2. 如何促进用户产生首次付费的行为;&/strong&&/p&&p&&strong&3. 如何提高用户对产品的复购率。&/strong&&/p&&br&&h2&&strong&一、提高用户对&/strong&(付费)&strong&产品的认知&/strong&&/h2&&br&&p&现在需要付费的产品日益剧增,面对这一现象,大多数情况下,用户可能会对付费的可操作性产生或大或小的诸如——这款付费产品的价值是什么?付费和不付费的差别是什么的问题。那么在实际操作中,关于如何提高用户对于付费产品的认知,我们是可以从产品的&strong&核心价值&/strong&、&strong&使用场景&/strong&以及&strong&用户管理&/strong&这三个方面进行一些操作的。&/p&&br&&strong&1、强调核心价值&/strong&&p&在一些场景中,用户可能会忽略付费产品的核心价值,从而对付费行为产生误解。以最常见的在线教育为例,对于这类产品的用户而言,服务才是关键,而视频只是辅助材料,我们所能做的就是放大服务的价值,而并非只是售卖自己的课程。&br&&/p&&br&&p&比如某在线课程的相关介绍:本课程通过3周的学习,将带你从零开始完成小程序的开发。除了有视频和对应的素材之外,全程班主任辅导,并且每周六晚老师将进行线上答疑,所以如果同学们在课程中有什么问题,请到小黑板上提交哦。&/p&&p&&strong&在这个例子重点传递出了这个课程的核心价值是老师对学生的一系列服务,而并非一些视频而已,用户也会更加明了自己付费能够获得的重点内容是什么&/strong&。&br&&/p&&br&&p&在此基础上,我们还可以尝试附加产品操作价值所延伸出来的易于触动用户的“精神价值”。比如:&/p&&blockquote&&ul&&li&&p&你以为我卖的是一杯咖啡?不,&strong&我卖的是一种态度&/strong&!&/p&&/li&&li&&p&你以为我卖的是一本书?不,&strong&我卖的是一种价值观&/strong&!&/p&&/li&&li&&p&你以为我卖的是家具?不,&strong&我卖的是生活&/strong&!&/p&&/li&&li&&p&你以为我卖的是手机?不,&strong&我卖的是情怀&/strong&!&/p&&/li&&/ul&&/blockquote&&br&&p&这几句话通过将实物和其对等的精神价值结合,映射出事物可以给人带来的精神体验,增大了用户付费转化的可能性。如果你的产品比较更多地涉及到用户付费的场景,比如在线教育、电子书、知识付费等,不妨试一试加强对产品本身的核心价值的强调和输出,或许会轻松不少。&/p&&br&&strong&2、嵌入使用场景&/strong&&p&大多数情况下,需求产生的原因是来源于某些场景的。倘若我们将这些需求的解决方案还原到场景中,在某种程度上也足够使用户更清晰地感知到产品的使用效果。&br&&/p&&p&比如“&strong&脑白金&/strong&”能够风靡,主要原因是“今年过节不收礼,收礼只收脑白金 ”这句话,稳稳地抓住了大多数用户都不可能避免的&strong&给长辈送礼&/strong&这样一个场景,这与“xx营养品,使用xx种名贵原料,经过xx道工序,有xx种疗效”相比,是不是更有感染力呢?&br&&/p&&br&&p&除此之外,互联网圈内一些产品也有此种行为,比如:&/p&&blockquote&&ul&&li&&p&“APP上随手一点,美味外卖送到门口”vs“饿了别叫妈,叫饿了么”;&/p&&/li&&li&&p&“共享单车,方便快捷很环保”vs“怕堵?怕挤?赶时间?出门就骑ofo小黄车!”&/p&&/li&&li&&p&“喜马拉雅,各种好玩的音频随时听”vs“上班堵车,听喜马拉雅”&/p&&/li&&/ul&&/blockquote&&br&&p&&strong&所以,能够时刻从产品的使用场景去思考,直接抛出这款产品可以为用户在实际中能够解决的痛点,这是一种良好的手段和习惯&/strong&。&/p&&br&&strong&3、管理用户预期&/strong&&p&&strong&什么是用户预期?&/strong&简单来说,就是用户预期想看到打折促销的商品,点击页面后却看到新的商品,用户会马上关掉页面,直观感受上有不好的体验,进而对产品产生负面印象。&br&&/p&&br&&p&&strong&那么如何管理用户预期呢?&/strong&在实际操作中,最常见的手段是在进行产品宣传的时候,直击用户需求的核心,让用户明白自己付费后可以获得的效果有哪些,感觉到满意和幸福,进而付费的转化达到事半功倍的效果。&/p&&br&&p&但据我所知,有些时候宣传上难免会有误差,所以更有效的方法是通过实际体验、试用会员等“粗暴”的方式让用户直观地感受实际效果,在用户切实体会到某些“甜头”后,达到了自己使用的预期,那么为之付费的动力就会提高很多。&/p&&br&&strong&4、加入身份认同&/strong&&p&除了前面所提及的方法,我们还可以&strong&通过加入身份认同这一个带有官方属性的方法来增加产品的附属价值&/strong&。&br&&/p&&br&&p&比如得到商城中《智能时代》音频的介绍页中所讲:&/p&&p&吴军博士预言,智能时代只有2%的人能受益,其他98%的人都将会被机器取代。怎样成为这2%的领跑者呢?听吴军博士亲自讲述。&br&&/p&&br&&p&看到这部分的时候,于我本身而言,我所产生的身份认同就是&strong&买了之后我就是那2%,和其他98%是不一样的&/strong&,然后我就理所当然地下单支付了。&br&&/p&&p&&strong&通过官方给予的身份认同的方式,将用户的独特性展示出来,让用户觉得“我和别人一样”或者“我和别人不一样”,进而放大这部分的价值,从而提升用户的付费转化&/strong&。&br&&/p&&br&&h2&&strong&二、促进用户产生首次付费的行为&/strong&&/h2&&br&&p&&strong&首次付费有另外一个名字:破冰。&/strong&显而易见,它在引导用户长久付费的过程中起着重要的作用。那么如何促进用户产生首次付费的行为呢?我将从&strong&参照物&/strong&和&strong&降低用户顾虑几率&/strong&这两个角度来聊。&/p&&strong&1、找好参照物&/strong&&p&在某些场景下,用户无法下定决心付费,某种程度上很可能是&strong&选择&/strong&的问题。比如:是不是适合我的选择或者是不是最优化的选择等。面对这种现象,我们可以尝试通过&strong&对比参照物&/strong&的方法——&strong&与一个用户已经有固定位置的事物关联起来,以此来消除用户心中的不确定感,增加熟悉感&/strong&。&br&&/p&&br&&p&常见的诸如:在线教育的黄埔军校、IT界的少林寺、中关村—中国的硅谷等,这些以大学、少林寺、黄埔军校等带有对比或者相像特征的物体为参照物,来对自己的产品进行对比和定位,从而使得用户能够迅速地在脑中确定产品的大概位置。与此同时,这也可以让自己的产品充满新鲜感和熟悉感。&/p&&br&&p&在找寻参照物的时候,需要注意这两点:&/p&&blockquote&&ul&&li&&p&需要把握产品需要展示的点,最好按照优先级进行;&/p&&/li&&li&&p&参照物需要是是用户所熟悉的,避免给用户带来阅读障碍。&/p&&/li&&/ul&&/blockquote&&p&常用的表达方式为:【我和XX很像】、【我和XX不一样】、【我比XX更先进】、【我比XX更稳定】。&br&&/p&&br&&strong&2、解决后顾之忧&/strong&&p&付费决定的阻力,还有一部分源自于&strong&担心&/strong&。最常见的比如:&/p&&blockquote&&ul&&li&&p&没有效果怎么办?&/p&&/li&&li&&p&没有达到预期效果怎么办?&/p&&/li&&li&&p&如果不想要了怎么办?&/p&&/li&&/ul&&/blockquote&&br&&p&面对这种现象,我们所能做的可以是,在引导用户付费的时候,设计更多的备案来打消用户的顾虑,比如“选错了也没关系,我们能保障您的利益”。且在现实场景中,最常见的“套路”有以下几种:&/p&&br&&p&&strong&全额退款&/strong&&/p&&p&不论是线上还是线下付费场景中,基本上这个已经是最给力的了,对于用户来讲,仿佛是一颗“定心丸”,某些时候比打折更能受到用户的接受。&br&&/p&&p&&strong&无限次反复回听&/strong&&br&&/p&&p&在语音直播产品中,这一点比较常见。一下没听懂?没关系,语音可以永久保留,放心听,随便听。而且常常带有“&strong&无限&/strong&”、“&strong&永久&/strong&”这些集聚诱惑力和感染力的关键词。&/p&&p&&strong&学到会为止&/strong&&br&&/p&&p&这些字眼一般出现在驾校等培训类产品中,解决了用户学了没学会、学了没考过的痛点,免去了用户的后顾之忧。&/p&&p&&strong&补贴优惠&/strong&&br&&/p&&p&免费、限免、满减、折扣、优惠券等各种表现方式,能在促进用户付费的过程中给其“最后一击”。&/p&&br&&h2&&strong&三、提高用户的复购率&/strong&&/h2&&br&&p&在用户付费之后,可能依然存在留存转化以及不续费等问题。这个阶段,私以为以强调用户的“当前所得”和让用户觉得“物有所值”为主。具体我总结了以下几种方法,或许可以一试。&/p&&br&&strong&1、放大用户的“放弃成本”&/strong&&p&相比起“获取更多”,人们更厌恶“损失现有”,通过放大这个点来增加用户的“放弃成本”。比如:&/p&&blockquote&&ul&&li&&p&&strong&账户有效期&/strong&:您的超白金会员将于2月31日到期,到期后您的24K镀金炫酷头像框将被收回;&/p&&/li&&li&&p&&strong&优惠券过期&/strong&:您有一张价值3000元的优惠券即将过期,请及时使用。&/p&&/li&&/ul&&/blockquote&&br&&p&这种方法更适用于试用期、有效期结束的时机,也包括已经发放给用户的优惠券、折扣券、特价购买权限、已生成的优惠订单等场景。&strong&在这个过程中,需要注意提醒的方式和时间频次,给用户增加一种紧迫感的同时,也会促进其对商品的消费和二次消费&/strong&。&/p&&br&&strong&2、提高使命感&/strong&&p&使命感其实可以提升用户付费的价值,让用户有“我花这个钱不是为了我自己”的价值观。这也能让用户对自己的付费行为有更深的印象和更低的付费阻力。比如:&/p&&blockquote&&ul&&li&&p&&strong&共享单车&/strong&:您本次骑行x公里,比自驾车/搭乘公交少了xxx碳排放,约等于多种了x棵树;&/p&&/li&&li&&p&&strong&含公益内容商品&/strong&:每消费100元,就等于给希望小学捐了xx元;&/p&&/li&&li&&p&&strong&电子书&/strong&:你刚购买的书一共xx页,同等大小的纸质书需要砍伐xx棵树,感谢你为绿化做的贡献。&/p&&/li&&/ul&&/blockquote&&br&&p&对于含有新能源、环保理念、公益内容的产品,就可以尝试将这个点进行放大,&strong&通过提升用户的使命感,进而满足其荣誉感,最后自然而然地再次使用或者消费该产品&/strong&。&/p&&br&&strong&3、尝试关注潜在用户&/strong&&p&没能培养起来的潜在付费用户,我们也需要注意及时引导和跟进。将未成功转化付费人群进行一个简单的分类,&strong&对其未在第一时间进行付费的原因进行分析,并在合适的时间点进行后续有针对性地引导,从而形成第二波的付费流&/strong&。&br&&/p&&br&&strong&4、追踪分析数据&/strong&&p&除了上面提及到的一些手段外,还可以通过分析与用户付费习惯相关的数据进行追踪和引导。&br&&/p&&p&比如:&/p&&blockquote&&ul&&li&&p&&strong&当日注册转付费的比例方面的数据&/strong&,就可以帮助我们判断是否需要强化付费产品对新注册用户的转化效率;&/p&&/li&&li&&p&&strong&多次付费率的比例相关的数据&/strong&,则可以帮助我们比较直观地展示用户习惯是否已经养成,从某种程度上来讲,也可以得出付费产品是否能给用户带来超值的感受的相关结论。&/p&&/li&&/ul&&/blockquote&&br&&p&好了,今天关于“培养用户付费”的思考就到这里了,希望可以带给你一些启发。也特别感谢三节课学员群里的同学们,你们进行的大量讨论也给我提供了很多思路,在此将一些同学的思考分享出来,供}

我要回帖

更多关于 剑灵这个游戏怎么样 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信