Unity3D Editor 中加载移动平台的 AssetBundle 资源显示出错的解决方法

注意:本文的测试环境为 Mac OSX 、Unity 4.6.9,Unity 5 在 AssetBundle 上做了诸多调整,因未实际测试不保证测试效果会相同。


在 Unity3D 项目开发的过程中,我们肯定会遇到需要使用 AssetBundle 的时候,而且这货还确实应用之处满多的,今天咱们不展开聊 AssetBundle 能干嘛了 ,咱们把重点放到 Unity Editor 加载移动平台的 AssetBundle 资源之后,显示出现错误的问题。我们直接来看一下对比图,快速了解一下我们要解决的问题:

asset bundle-miss-shader assetbundle-with-shader

两个效果图一对比,我们马上就明白了,我们碰到的问题是左侧这个显示成粉色/紫色的这个图片呈现出来的,而右侧这个图呈现的就是我们想要的效果。

第一步,让我们来明确这个问题的定义:

  1. 首先需要说明的一点,这个问题只在 Unity Editor 下出现,在 iOS 和 Android 平台的设备上运行并不会出现这个问题,也就是该问题不影响游戏在移动设备真机上运行,只是让我们在开发的过程中感到很迷惑和无奈;
  2. 对于 Unity 系统 built-in 的那些 Shader 也不会出现这个问题,只针对我们自行编写的 Custom Shader 会出现这个问题;

第二步,让我们来确定如何重现这个问题,通常找到重现问题的方法也就找到了问题的根源所在了:

  1. 新建一个 Custom 的 Shader,咱们可以直接把 Unity 官方提供的 Shader 源码包给下载下来,然后直接修改其中的 Diffuse Shader,咱们不做任何其他改动,就简单的改两个 Property 的 Name 就好了;
  2. 将新建的 Custom-Diffuse Shader 应用于场景中某个 3D 对象的 Material 上,然后将该对象保存为 Prefab 文件;
  3. 将该 Prefab 文件打包成 AssetBundle 资源文件,打包选项为 BuildAssetBundleOptions.CollectDependencies|BuildAssetBundleOptions.CompleteAssets,编译目标设置为 Android 或者 iOS ;
  4. 新建一个空的 Unity 工程,将上一步中打包出来的 AssetBundle 文件放到 Assets/StreamingAssets 目录下,然后通过 WWW 或者通过读取文件内容字节数组后创建 AssetBundle,然后将该 AssetBundle 资源中的 Prefab 读取出来并实例化到场景中,最终我们看到的效果就是上面左侧图片呈现的情况。

第三步,找到重现的方法了,接下来就是探究问题根源了,我们可以先做几个假设,问自己几个问题:

  1. 如果不使用自己编写的 Shader,直接给 Prefab 中的 3D 对象设置一个 built-in 的 Shader,是不是就不会出现这个问题了?
  2. 如果自己编写的 Shader 中加入 Fallback “Diffuse” 代码片段之后,是否可以挽回这个显示成粉色/紫色的情况,转而使用 Unity built-in 的 Diffuse Shader 进行渲染呢?

经过测试之后,上面两个问题的答案如下:

  1. 使用 Unity built-in 的 Shader 确实不会出现丢失 Shader 导致显示错误的问题;
  2. 加入 Fallback “Diffuse” 代码片段后的 Custom Shader 不会出现丢失 Shader 之后显示成粉色/紫色的情况,但是会直接使用 Unity built-in Diffuse 的 Shader 进行渲染,跟我们在 Custom Shader 中编写的渲染逻辑半毛钱关系都木有。

至此,我们大体可以确定就是我们打包到指定 BuildTarget 平台上的 AssetBundle 中的 Prefab 资源中使用的 Shader 是成功被打包进去了,因为从上面的第二个问题中,我们能确定 Fallback 语句是生效的,如果我们想确认得更明确一些,我们可以把 Fallback 中指定的 Shader 更换为其他的 built-in 的 Shader 再试试看效果,相信我木有错滴。

既然我们现在已经确定了 Shader 是成功编译后打包进了 AssetBundle 中,那么我们可以看看直接读取 AssetBundle 资源然后初始化 Prefab 之后,这个出问题的 3D 对象使用的 Shader 是个什么情况,以及正常情况下的 Shader 应该是啥情况:

shader-in-assetbundle-for-ios shader-in-assetbundle-for-osx

上面两个图片是我们已经找到问题之后针对出现渲染错误和正确渲染两个情况打包的两个 Shader 在 Editor 中运行时通过点击3D 对象的 Material 组件 Inspector 面板右侧的 Edit 按钮进入的 Shader 的 Inspector 面板。由此我们可以看到我们在 OSX 系统下的 Unity Editor 中使用针对 iPhone 平台打包的 AssetBundle 中的 Shader 在运行时有一个警告输出,而使用针对 OSX 平台打包的 AssetBundle 中的 Shader 就一切正常。

那么我们再来看看这个警告的信息是啥意思呗,No subshaders can run on this graphics card,这个信息也很明确,就是说在你当前的这个显卡上没法执行这个 AssetBundle 中打包的 Shader 中的 subshader。噢,原来如此,针对移动平台打包的 Shader 应该是针对移动设备显卡进行适配和优化的,因为它们通常都是基于 OpenGL ES 标准的,而 Windows 和 OSX 分别是机遇 Direct X 和 OpenGL 的,这也就说得通了。

但是我们还会问一个问题,那就是我明明已经将我的 Unity Editor 的 Build Setting 设置为了目标移动平台,例如 iOS 或者 Android 了啊,为啥加载 AssetBundle 中的 Shader 进行显示时,这个 Unity Editor 就不能按照在手机上的机制来加载这个 AssetBundle 中的 Shader 资源并进行渲染呢?好吧,你把我问住了,实际上我也并不知道为什么 Unity 没有这么做,跪了。那我们就放狗搜索一下吧,最终我找到了两篇不错的文章,咱们先来看这篇点睛之文,这个讨论中有一个名字叫 superpig (超猪)的 Unity 官方的哥们写了以下两个回复:

Just to be clear: this is not one single bug.

The pink material stuff just means there was a problem setting up the material and/or shader. There’s a bunch of ways this can happen. Two of them include:

  • Loading bundles on one platform that were built for another. For example, if you build your bundles for iOS and then try loading them on PC, it won’t work because PC needs the Direct3D versions of the shaders and the bundle won’t contain those (because there is no Direct3D on iOS). To fix this you just need to make sure that the bundles you are loading were built for the platform you are loading them on.
  • Failing to load the bundle that contains your shader (or loading it after the one with the material in). As of Unity 5.0 the AssetBundle pipeline will calculate the dependencies between the bundles, but it won’t automatically load the bundles for you (because in general it has no idea where to get them from). To fix this you just need to load all the required bundles, and you need to do it in the correct order. The AssetBundleManager demo project on the Asset Store demonstrates how you can use the AssetBundleManifest to implement your own automatic dependency loading.

We can and will improve the error reporting around these scenarios, but in both cases there is no engine ‘bug’ per se – just a relatively unhelpful failure behavior.

So, if you are still facing this issue, and neither of the mistakes described above fix your problem, please file a bug report instead of assuming that somebody else has done it – because it is very likely that their problem is not the same as yours exactly, and their problem will get fixed, but yours will not because it’s actually a different case.

——————– 我是两个不同论坛回复内容的分割线 ——————

Switching the platform to Android won’t work. If your Editor is running on Windows, you need a Windows version of the bundle. If it’s Mac, you need a Mac version. It doesn’t matter which platform is your active build target platform.

我把重点的内容标红了一下,看完了这两段回复之后,我们终于搞清楚了 Unity 对于 AssetBundle 中编译打包的 Shader 是个什么处理机制了,这就因为着我们在 Unity Editor 中如果需要正确加载 AssetBundle 中 Shader 并进行渲染的话,我们就需要使用针对我们 Unity Editor 所在的宿主系统环境进行打包,例如我们使用的是 Windows 系统下的 Unity Editor 那么就需要使用针对 Windows 平台打包的 AssetBundle,对于 OSX 系统也是一样的。

至此我们就可以再赶紧验证一下看看素不素这个鬼样子的,建议在资源很少的工程中单独进行实现,因为我知道你们的 Unity Editor 现在肯定是在某个移动平台的 Build Setting 下的,这样贸然打包一个非移动平台的 AssetBundle 会直接触发 Unity Editor 整个的 Switch Platform 操作,我想你肯定不会想这样的,我们都已经被 Unity Editor 这个切换平台耗费过很多生命了。最终测试通过,确实如这位「超猪」先生所说的。


本文原本到这儿呢,就应该结束了,对不对捏?嗯,是的,但是我还有些话需要说,那就是我自己在碰到这个问题的时候我第一时间也放狗搜索了,找到了很多类似的解决方案,大部分都说可以通过在加载 AssetBundle 资源成功之后,将其中的 Material 资源读取出来,然后将这些 Material 使用的 Shader 重新设置一遍,然后就可以了(其实在放狗之前,我自己已经发现可以通过自己手动地在 Editor 中对这些显示出错的 Material 指定一下 Shader 就可以让其正确显示了)。那么这个问题的根源是啥呢?把这个归结为 Unity 的 Bug?显然,这样是一种很不负责任的做法,因为我只用了一个很简单的测试就把这个 Hack Fix 给推翻了,并且确定了这并非 Unity 的问题。

测试这个 Hack Fix 是否真正触及到问题的根源很简单。

首先,我们准备一个工程用于创建 AssetBundle 资源,名为 CreateAssetBundle,在这个工程里头我们只放我们需要打包的 Model、Texture、Material 和 Shader 等资源文件,然后创建一个使用了这些资源的 Prefab 文件,再将我们创建出来的 Prefab 文件打包成为 AssetBundle 文件,这样我们就准备好了一个可用的 AssetBundle 文件了,对伐。

接下来,我们创建一个新的空工程,只把上一步中打包出来的 AssetBundle 资源放到 Assets/StreamingAssets 目录下,然后我们读取这个 AssetBundle 资源,取出里头的 Prefab 资源,在场景中实例化一下,并且使用下面这段 Hack Fix 代码:

#if UNITY_EDITOR_OSX || UNITY_EDITOR
		var mats = bundle.assetBundle.LoadAll (typeof (Material));
		foreach (Material mat in mats) {
			var shaderName = mat.shader.name;
			var shaderInRuntime = Shader.Find (shaderName);
			if (shaderInRuntime != null) {
				mat.shader = shaderInRuntime;
				Debug.Log (string.Format ("Found the shader: {0} used in mat: {1}", shaderName, mat.name));
			} else {
				Debug.Log (string.Format ("Cant not find the shader: {0} used in mat: {1}", shaderName, mat.name));
			}
		}
#endif

然后你会发现,WTF,根本就是然并卵嘛,说好的自行车呢?那么我们再来问问自己,这段代码最核心的是啥?

就是使用 Shader.Find (string name) 方法重新按照我们 Prefab 中指定使用的 Shader 名称在整个程序内容空间中查找了一次 Shader,然后如果成功找到的话,就将其重新设置给我们从 AssetBundle 中读出来的 Material 对象,对伐?那么为何网上那么多的人都说这个解决了他们的问题呢?而且然后就没有然后了呢?

咱们来想想我们为啥会碰到出现在 Editor 中出现加载了 iOS 或者 Android 平台的 AssetBundle 资源呢?也就是我们还是在开发的过程中,我们已经将某一部分资源针对移动平台打包了,这些资源中会把我们在工程中的 Shader 文件一并编译打包,但是我们的工程中的 Shader 文件并不会移除,所以在 Editor 中运行游戏时,当我们出现了因为 Editor Host 不支持针对移动平台编译的 AssetBundle 中的 Shader 渲染的情况时,我们通过了一个上面代码中的 Hack 的手段,使用了 Shader.Find 方法,而且这个方法查找到的就只是工程中未编译的 Shader,根本就不会去我们加载的 AssetBundle 中加载,实际上是在运行时将游戏中的 Materail 中使用的 Shader 偷换成了我们工程中的 Shader,而这些 Shader 并未编译成某个移动平台的,在 Editor Host 环境下肯定是可以正常渲染的,否则我们早都发现渲染不对了。这就是为何我需要创建一个新的空的工程来测试我们打包出来的 AssetBundle 资源,这样我们就可以保证我们在工程中不会有同名的Shader,如此一来这个 Shader.Find 方法肯定是找不到同名的 Shader 了,因为我们这个工程就只有一个 AssetBundle 资源,由此我们就找到了整个问题的各个根源,同时也对网上很多解决方案中提出来的 Hack 方法也提出了疑问并做出了自己的解答。

不过话再说回来,如果为了省事避免维护多个不会使用到的平台的 AssetBundle (通常我们的游戏都只会在 Android 和 iOS 平台发布,实际上 Windows 和 OSX 平台下的 AssetBundle 就没有什么必要维护了),这个 Hack 还是可以用的,但是我们还是要搞清楚为啥这个东西是可用的,下次如果碰到类似的问题或者不是 Shader 的问题,至少也可以提供一个正确的思考方式和参考。

Alfred2 有道翻译 Workflow 不可用的解决方法

一直在使用的 Alfred2 有道翻译的 Workflow 今天突然就不能使用了,刚开始以为是网络的问题,多次确认之后排除了网络的原因。想着可能是有道翻译的 API 更新了,使用以前的 API 调用会失败,然后就想着看看这个 Workflow 中使用的是哪个 API,那么怎么查看这个 Workflow 究竟用的是哪个 API 呢?

我们一步步来吧,首先打开 Alfred2 的设置页面,选中 Workflows Tab 页:

Alfred2 Settings -> Workflows Tab然后双击标题为 yd 的 Script Filter,或者右键选中标题为 yd 的 Script Filter,然后选择 Configure 菜单项,进入 yd Script Filter 的配置界面:

Alfred2 Youdao Workflow Configure

然后我们会看到一些命令啥的,不要管它咯,直接点击右下方那个 Open workflow folder 按钮,打开这个有道翻译的 Workflow 资源存放目录,如下:

Alfred2 Youdao Workflow Folder

从上一个设置页面中,我们可以看到 translate.php 文件应该是真正干活的脚本,所以我们打开目录中的 translate.php 脚本文件,然后我们就可以看到这个脚本是如何通过访问有道的开放 API 来完成翻译的工作的。

translate.php

用红色标注出来的两个参数就是这个 Workflow 不再工作的原因,可能是因为有道翻译的这个 Workflow 使用的人太多,而大家都是直接从 alfredworkflow 上下载的,Workflow 中的 API Key 就是这个 Workflow 的作者当时自行申请的一个 Key,而有道对于每个 API Key 有一个每日访问次数限制为 1000,所以很有可能就是因为现在使用 keyfrom=SeekBetterMe&key=164530784 这两个参数的人太多导致 API 访问次数超限了,所以有道翻译已经不再返回查询结果了。

那么既然找到问题了,我们只需要自己申请一个新的给自己用的 API Key 就好了。找到有道翻译 API 的首页

有道翻译 API 首页

点击我是开发者,进入调用数据接口页面,填写正确的网站信息,马上就可以获取一个专属于自己的 API Key,然后将其替换到 translate.php 文件中就可以了。

申请有道翻译 API Key

然后保存 translate.php 文件,重新呼出 Alfred2 有道翻译的 Workflow 就可以了。

读《卡拉马佐夫兄弟》

「一粒麦子不落在地里死了,仍旧只是一粒;若是落在地里死了,就会结出许多粒麦子来。」
—— 佐西马长老

已经忘了是何时听说过陀思妥耶夫斯基这个名字了,初次听闻这个名字只是觉得好长好难记,后来一而再地从不同的人口中听闻陀思妥耶夫斯基此人,并且多次听到他人对其的赞赏,便买了《卡拉马佐夫兄弟》来读一读。

俄罗斯人名都很长很复杂,例如书中的主人公为一家父子四人,父亲——费多尔·巴夫洛维奇·卡拉马佐夫,长子——德米特里·费多罗维奇·卡拉马佐夫,次子——伊凡·费多罗维奇·卡拉马佐夫,幼子——阿历克赛·费多罗维奇·卡拉马佐夫,这已经让我很头疼了,在读前 100 来页的时候,出场人物已经很多,加上各种更加长的女性角色的名字,而且俄罗斯人因为名字长貌似都有简短的昵称,书中也是全称和昵称穿插着出现,真心有的时候看了半天都不知道到底在说谁,有的时候就真的翻回去看这到底是谁的名字来着。

全书读起来不是很轻松,也许是翻译的年代稍微远一些,行文造句上可能跟现在我们平时的口语有些不同,再加上书中有大段大段的关于宗教和哲学的论述,读来确实有些吃力。

通篇读下来,幼子阿辽沙如天使般的爱人们,宽容这世间一切的罪,次子伊凡背负中沉重的精神负担而不得解脱,在新科技和社会主义等新生事物的冲击下怀着对传统社会宗教价值观的深深的怀疑,长子生活糜烂至极,却又偶尔率真诚实,内里并非一个十分可恶之人。而他们那可怜的老父亲,如小丑般活着,如笑话般死去,并给整个家庭带来了沉重的罪孽。

整部小说虽说情节设定非常棒,但是我认为最精彩的还是伊凡关于宗教的论述,伊凡谈到了一个假想,假想耶稣再次复活了,回到了世俗社会中来,在宗教大法官烧死上百个异教徒的广场上就这么悄悄地复活了,他回道了世俗社会中。

但是他却被宗教大法官给逮捕了,在狱中宗教大法官对复活的他说道:
「『是你么?真的是你么?』他没有得到回答,便又急速地接着说,『别出声,别回答吧。你又能说出什么来呢?我完全知道你要说的话。你也没有权利在你以前说过的话之外再添加什么,你为什么到这里来妨碍我们?你确实是来妨碍我们的,你自己也知道。但你知道不知道明天将会发生什么?我不知道你是谁,也不是到你是不是真的仅仅像他,但是到了明天,我将加以裁判,把你当做一个最凶恶的邪教徒放在火堆上烧死,而今天吻你脚的那些人,明天就会在我一挥手之下,争先恐后跑到你的火堆前面添柴,这个你知道吗?是的,你也许知道这个。』他在深刻的沉思中加了这句话,目不转睛地紧盯着他的囚犯。」

伊凡说,这就是罗马天主教最主要的特点:「既然你已经把一切都教给了教皇,那就一切都已经在教皇的手里,你现在根本不必来,至少目前你不该来碍事。」

宗教大法官认为是他们给人们带来了幸福,而耶稣在离开他们的时候已经把这个权利交给了他们,如今也不可能再从他们手里夺回去。

「他们恰恰认为他和他的人们的功绩,就在于他们终于压制了自由,而且他们这样做,是为了使人们幸福。『因为只是到了现在(他自然指的是有宗教裁判制的时代),才破天荒第一次可以想到人们的幸福。人造出来就是叛逆者,难道叛逆者能有幸福么?已经有人警告你了,』他对他说,『你没有少受到警告和指示,但是你不肯听这警告,你不承认那条可以使人们得到幸福的唯一的道路,幸而你离开的时候,把这事情交付给了我们。你答应,你用话语证实,你给予我们系绳和解绳的权利,你自然已经不能再想从我们手里夺取这个权利。你为什么跑来妨碍我们啊?』」

接下来关于自由和面包的论述也是如此精彩。

「哎,他们没有我们是永远也不能喂饱自己的!在他们还有自由的时候,任何的科学都不会给予他们面包,结果是他们一定会把他们的自由送到我们的脚下,对我们说:『你们尽管奴役我们吧,只要给我们食物吃就行。』他们终于自己会明白,自由和充分饱餐地上的面包,这两者是不可兼得的,因为他们永远也不善于在自己之间好好地进行分配!他们也将深信,他们永远不能得到自由,因为他们软弱,渺小,没有道德,他们是叛逆成性的。你答应给他们天上的面包,但是我再重复一句,在软弱而永远败德不义的人类的眼里,它还能和地上的面包相比么?就算是为了天上的面包,有几千人以至几万人跟着你走,那么几百万以至几万万没有力量为了天上的面包而放弃地上的面包的人,又该怎样呢?是不是只有几万伟大而强有力的人是你所珍重的,而那其余的几百万人,那多得像海边沙子似的芸芸众生,那些虽软弱但却爱你的人,就只能充当伟大和强有力的人们脚下的泥土呢?」

全篇中诸如以上精彩的论述还有不少,这也是我首次在阅读小说的过程中不断地被震到的一本书。书中对于人物性格特点的刻画更是细致入微,例如对拉基金的那种小人行径和可恶嘴脸就表现得淋漓尽致,实为一部好书,虽说读起来有些累人,也值了。

2015 年 12 月读书笔记

《失乐园》

真心好看的一本小说,毫不避讳如外科解剖般细致的大段落性描写,恰如其分又极端写实的心理活动的呈现,让久木和凛子直接在你的眼前活了。

你可以看到他俩在酒店里,在出租屋里,在度假别墅里做爱,你能感受到久木与妻子在餐桌上的沉默和尴尬,你能感受到凛子和丈夫在家中的冷暴力。

二人在一次次突破世俗伦理的束缚之后,最终成功的走到了一起。但是两人却选择了在这幸福的最高点赴死,不是向那冰冷坚硬的伦常示威,而是向那琐碎的生活和必然衰减的热情抗议。两人深知结合之后,随着时间的推移,家务琐事的牵绊,二人之间的这种热情和默契会日渐磨灭,正如他们与自己的原配之间那般,也无奈找不到破解之道,最终选择在激情燃烧得最为旺盛的刹那走向毁灭,双双赤裸狠狠地抱在一起,满足地离开了这个让他们失望透顶的世界。

《把时间当作朋友》

得知李笑来这个人已经有些年头了,之前只是知晓他是新东方的名师,喜欢写博客,然后就没有了,大概我还一直有订阅他的博客。

再次关注到他,就是因为成功的比特币投资者这个巨大的光环吧。我就是这么俗,哈哈。关注了他的微信公众号之后呢,想着有必要读读这本屡次出现在他文章里头的这本听起来很正能量和主旋律的书(我就是这么装逼,书还没读呢,就先给人定性了),读了之后,有点相见恨晚。

书中反复讲了很多很棒的道理,也非常刻薄地指出了我们绝大多数人的致命弱点,打脸真的好疼,至少我很疼。

疼完了之后呢,我开始尝试去做一些事情了,我继续坚持每天的晨跑(当然北京的这个天气,想必大家也都知道,雾霾天是个很操蛋而且高发的天气,所以会造成一些小间断),然后开始写每天的流水账时间日志。

效果好不好,目前还不能说,我想先坚持个一年再回来看。不论做什么计划,关键在于实践和坚持嘛,书里头就是这么说的,所以,咱们走着瞧。

《甘南纪事》

这是我读的杨显惠先生的第二本书,第一本是《夹边沟纪事》,读完了非常震惊和感动,深为杨先生这种非虚构类文学作品的风格吸引。在叙实之余不落入一种纯文本性的记录和纯对话式的段落,而是适当地通过一些虚拟想象还原每个故事的主人公和出场人物的心理状态和活动变化,又不过分渲染这些私人的揣度,这是一种恰到好处的还原和超越。

此次读《甘南纪事》显然较之前读《夹边沟纪事》要来得轻松许多,心情也没有那么沉重。书中不是穿插一些甘南地区的水美山美,朴实多彩的甘南藏人的风土人情,都让自己有点沉醉其中了,有机会定要去扎尕那探寻一番在书中多次出现的白石头山。

书中多次指明了村民调解委员会在藏人生活中的重要性,特别是在村民公共事务中扮演的重要角色,其中关于僧侣、老人,甚至以前的头人等等在委员会中处理相关事务时所遵循的社会组织原则以及所体现出来的智慧,甚至可以说是迷人的。而这些流传下来的传统和智慧,与现今的社会组织结构难免会产生一些冲突,例如公安局这个角色在藏民们心中和生活中扮演的是一个什么角色,以及藏民们是如何对待各种新型的事物,例如保暖内衣和防风服等等,书中那些淳朴可爱的藏民们会用他们每天的生活给你最真实的答案。

《你的灯亮着吗?》

这本书我第一次看到的是一个在网上流传的 PDF 版本,当时自己拿到打印店去打印了全书,自己也读了一部分,应该是把电梯的那个案例的部分给读完了,也许后面的部分没有继续读下去,也许读完了之后完全忘光光了,因为这次重新再读一回,发现自己隐约能记起来的也就是电梯的案例。

关于这个案例,在我自己身上还有个小事情蛮有趣的。08 年 10 月份前后,腾讯来我们学校校招,然后笔试通过之后,我就去参加面试了,面试的时候,面试官是个年轻帅气的小伙子,然后他先让我尝试着解决一个算法编程问题,我尝试了十分钟左右,没有什么思路,然后面试官考虑到时间有限(当时计划我是下午4点半开始面试,实际上我面试的时间已经6点多了,实际上我已经饿了),换了一个开放式的题目就是这个电梯的案例。我想了大概几秒钟吧,我觉得我还是应该坦白告诉面试官这本书我读过,我要是直接把书里头的内容给搬出来,这个就是抄袭,我也不能确定我能怎么样把我看过这本书的事实掩盖住,又不露痕迹地展现我自己独立思考的能力自己和看问题的视角的独特性。最终,我很快地就告诉我的面试官,我说这本书我看过,希望能换一个题目,面试官笑了笑,然后给我换了另一个开放式的题目。这回的题目是一个智力题,然后我就被我的智商打败了,最终我就这么灰头土脸地结束了我的腾讯校招面试了。

所以这次重新读这本书的过程中,其实我有多次已经读不下去了,但是我还是不断地告诉自己必须读下去,最终读完了。我想说的是,本书的趣味性并不是那么高,有几个还蛮有趣的案例分析但是不多,文中也有不少比较别致的观点,但是说真的读起来确实蛮无趣的。也许以后得某天再读会有新的感受和收获吧。

《21 世纪资本论(精华本)》

原本以为这是全本,后来读了总感觉特别不对,很多的结论和数据扑面而来,完全消化不了,主要阐述的观点貌似是这样的「21 世纪里头,继承遗产的重要性将会更为突出,社会将会再次形成明显的阶级分层,而且财富将会更加集中化」,大概就是这样吧。不建议读这个所谓的精华本,我是在「多看阅读」上面读的,完全不建议,想读的话还是找全本来读吧。