BY 树下肥猴undefined
***************************************************
前言
***************************************************
前言:
什么是CTD?
CTD,就是Crush To Desktop 的简称,也就是在游戏的运行过程中,由于各种不同的原因,游戏进程被挂起或强制中止,而导致退出游戏。
造成CTD的主要原因有哪些?
1. 游戏本身系统机制问题(或者说游戏本身的设计缺陷。说起这个,猴纸一会再吐槽)。
2. Mod的问题。如数量太多,脚本过多,内容相互冲突等。
3. 机子性能瓶颈,装mod却不切实际,如显存与高清。
4. 存档问题。
5. 其它的未知原因。
在正式讲这个问题之前,我要先声明一点:
CTD是无法完全解决的,这个在四代就已经被证明过。
无数大神,高手经过多少努力,也无法完全根除这个顽症。
而在五代,猴纸通过查阅官网、S网,CK等技术文章,加上自己的试验和分析,认为五代在游戏本身的系统机制上,并没有很大的创新和进步。并且由于现阶段操作系统正处于32位和64位混杂的现实情况下,以B社历来那坑爹的内存机制管理模式,这个问题有可能被进一步放大!
造成这个原因的祸首,正是上古系列的最大优点,开放性!
既然无法根除,那我们就想点办法,减少其发生的机率。下面入正题。
***************************************************
第三章 第1节 优化游戏,减少跳出。
***************************************************
一、对游戏运行环境进行优化:
这里我给大家解释一个误区:所谓的4G补丁!
这里也是B社坑爹的一个原因。
他的内存管理机制相当的不好!非常容易溢出。
我用内存监视器hookWriteMemory和MemView等专业开发工具对上古五进行了长达一周的数据采样,基本上开着这两货玩游戏,其内存释放我都不想吐槽了,尼玛坑爹的是在一个Stack里我发现了三种不同的数据类型,8位FLOAT,8位INT,16位的FLOAT!(当然,这可能是MOD造成的)。
不过现在十号补丁打上后,从监测数据来看,比七号时好很多了,内存的释放及时多了。
另外为了证明我的想法,我采取了很多办法,无论我采取什么办法,游戏的内存使用值永远达不到4G,这还包括了当前的显存使用值!
这几个是很典型的例子,他们使用了包括官方4G补丁在内的所有4G补丁,却并没有起到作用,这是为什么?
http://bbs.3dmgame.com/forum.php?mod=viewthread&tid=2896525
http://bbs.3dmgame.com/forum.php?mod=viewthread&tid=2672544
http://bbs.3dmgame.com/forum.php?mod=viewthread&tid=2680987
http://bbs.3dmgame.com/forum.php?mod=viewthread&tid=3283371
答案很简单:上古五是32位软件。(不必和我争,如果它是64位软件,你们的32位XP和WIN7根本就运行不了!B社出作品,必然要考虑到兼容性,这点上官方一查就知道!)
我这么一说,很多人会恍然大悟,由其是有计算机相关知识的。
举个例子:我有时玩下设计,机子上装了两个软件,一个是32位的CS3,一个是64位的MAX,很明显对比就是,我用CS3同时打开N多图片,到一定内存占用值时必死无疑!另一个MAX,最高开到6G都行!
这是由软件的寻址大小决定的,天生的,没法改!
不明白的请跳转到这里看:
http://wenku.baidu.com/view/ce7780eb6294dd88d0d26ba1.html
不过这个人说的是理论值,在现实值中,一个32位的应用程序,能使用最大的内存大小为3.25G-3.75G之间,这还要算上游戏占用的显存值,部分显存也是要计入寻址编码的。
所以说,再大的内存,你也只能用这么多。
并且通常在WINDOWS的默认设置中,32位的应用程序,所能调用内存的值默认是2048(包括在64位系统中运行32位程序也是如此!),现在,我们就来解开这条限制!
但是我建议WIN7 64,32位系统,同时内存在4G以上的同学,做下面这一步:
本帖隐藏的内容1. 以管理员身份运行CMD(在开始菜单输入CMD,然后在CMD图标上点右键,先管理员运行。)
2. 在CMD中输入以下命令:
bcdedit(空格)/set(空格)IncreaseUserVa(空格)3072回车
重启计算机
【它的作用是将单进程内存上限可强制修改为3GB】
(适用于3.25G以上内存)
想要恢复则输入bcdedit(空格)/deletevalue(空格)IncreaseUserVa回车
重启计算机【恢复默认】
注意三点:
一是值只能是2048和3072(为什么不能更高你去问微软,微软官方网站有这条命令的说明!)
二是刚好4G内存的同学注意了,在玩游戏时,不要使用太占内存的软件,要知道,操作系统也是要占一定内存的。
三是别回来问我,为什么游戏才使用2G多一点的内存?用不到3G?我再说一遍,当前已经使用的显存也要计入寻址空间!
微软官方网站相关说明:http://msdn.microsoft.com/en-us/library/ff542202.aspx
此方法对32、64位WIN7,4GB内存以上配置有效,我自己用的就是!用hookWriteMemor监测过,确实能使用多点内存,减少因为内存释放不及时造成的CTD。
(另外32位系统的同学要注意了,见过不少同学4G以上内存装个32位系统的。见到这些同学我都不好怎么说,加上显卡的显存,你的操作系统只能识别到3.75G左右。即使用了网上的各种方法,例如PAE寻址-这个需要主板硬件支持!所能起的作用也有限。还是那句话,32位系统天生残疾,没辙!那么这些同学在用完这个命令后就要注意了,WIN7最少要占800M内存左右,XP是400M左右,在玩游戏时尽量把别的东西都关了吧!64位系统的话,使用这条命令可能会使你在运行一些64位的程序时也会受到限制,不过没有关系,到时用恢复命令就好了。而且64位软件现在相对较少。)
这是在系统层面改变进程,不修改游戏任何配置,无毒副作用。
另外,还可以采用的方法有:清理磁盘碎片,把游戏装到SSD上,这两招对使用了超高清的高清包的同学有明显好处,减少磁盘读取时间。
补充说明一点,别把WIN7的虚拟内存关掉,哪怕你的内存再大都好。
我的是8G,我哥们的16G,我们两个都没关,原因是有些应用程序必须要使用到虚拟内存,例如PS等软件。
担心老头五这玩意也有这么个设定,毕竟新游戏用D9核心,B社什么坑爹的事做不出来,反正我没关过。
有关过又很稳定的朋友记得回来告诉猴子一声。
*******************************************
二、对游戏本身进行优化:
1. 对ini文件中的游戏参数进行优化:
游戏一共有9个和游戏有关的ini文件。
CK官网链接,有兴趣的请跳转:http://www.creationkit.com/INI_files
(其实是10个官网上也算少了一个,在游戏的Skyrim目录下还有一个叫Skyrim的文件夹,那还有一个Skyrim.ini,这货有什么作用我一直搞不懂,希望知道的告诉我!)
我们只根据官网的说明讨论以下两个ini文件,他们会被游戏使用(Used by the game):
在我的文档\My Games\Skyrim目录下面有两个:
Skyrim.ini和SkyrimPrefs.ini
这两个ini的文件其实起的效果差不多,根据CK官网的介绍,以SkyrimPrefs.ini的设置为优先, SkyrimPrefs.ini里的设置会覆盖Skyrim.ini的相同参数的设置。
关于ini的手工设置教学请参考这两篇大作,写得很好:
《上古卷轴5:天际》优化设置 SkyrimPrefs.ini 详细解析。
http://bbs.3dmgame.com/thread-2558987-1-1.html
感谢红烧茄子兄的努力与试验
浅见:虽然是来自辐射三的INI设置,但是只要上古五的INI文件有的参数,所起的作用是一样的,大家可以参考,对比一下,明白每个参数的作用。再次感谢茄子兄的努力,我也是拜读了他的大作不下十次。
Skyrim.ini优化 12.18大更新
http://bbs.3dmgame.com/thread-2571468-1-1.html
感谢CMD本人兄的努力与试验
对于缓冲的见解很独到。
[原创] 优化的真正核心—上古卷轴5:天际SkyrimPrefs.ini设置解析
http://bbs.3dmgame.com/thread-3051967-1-1.html
感谢超频爱好者版主的努力。
对于ini参数在游戏中画面的影响有很独到的见解。
猴子为什么在这方面不提出自己的见解,是因为以上几位基本上把ini对游戏的影响说到位了,猴子在这方面并不比他们强,甚至不如人家。
猴子是实在人,这是教学贴,需要的是严谨,就不提出一些子虚乌有见解来哗众取宠了。请谅解。请移步拜读几位的大作!
大家在看完上面的大作后,对ini设置有一定了解后,想动手设置的话,我给大家推荐一个工具,方便大家设置:
天际INI详细配置工具(Skyrim INI Tweaker)
http://bbs.3dmgame.com/thread-2643799-1-1.html
xiaoma3000版主的汉化
对于实在是不想自己动手的同学,请下载这个软件:
【ARROW&KNEE MOD TEAM™】『上古卷轴5优化工具』增加流畅减少顿卡跳出,更新v1.1修复BUG!支持原版、DLC!
http://bbs.3dmgame.com/thread-3282704-1-1.html
BoneAsh的力作,懒人专用,一键搞掂。使用方法我在一楼说了,请自行查阅!
*****************************************************
2. 优化ini中的Papyrus脚本设置(很重要,这方面很多人在认识上有误区!)
其实这也是在ini中设置,为什么猴纸要单独分开来讲?
这是因为有关这项设置,有很多人被误导了。
包括N网的一些设置,N网也是个鱼龙混杂的地方,有高手,也有2B,外国的月亮并不比国内的圆!
我们先来看几个反例:
上图:
原贴在此,有兴趣的可以移步(严正声明,猴纸只是就事论事,不针对任何人!)
http://bbs.3dmgame.com/forum.php?mod=viewthread&tid=3288581
http://bbs.3dmgame.com/forum.php?mod=viewthread&tid=3098214
http://bbs.3dmgame.com/forum.php?mod=viewthread&tid=2896525
http://bbs.3dmgame.com/forum.php?mod=viewthread&tid=2576942
这里都要求在我的文档\My games\Skyrim\Skyrim\Skyrim.ini,找到[Papyrus]组,在其下添加命令行:
iMinMemoryPageSize=100000
iMaxMemoryPageSize=5000000
iMaxAllocatedMemoryBytes=1800000000
为什么猴子如此断定这些设置并不一定有效,反而有可能会起到反效果呢?
首先,我们来说说Papyrus的运行机制:
A. 先给同学们科普一下编程知识:
机器语言:我们平时玩的游戏也好,用的软件也好,在电脑的眼里,就是一个个0和1的数字。如0111(4位)、11001101(8位),这些二进制代码才是电脑可以执行的命令,我们称之为机器语言。
汇编语言:比机器语言高级的是汇编语言,基本上所有程序开发,在编译时,都要将我们写好的程序先编译成汇编语言。
高级语言:简单的说这是为了方便程序员开发的一种平台,使我们不用10101001这样来撸代码,也不用使用冗长的汇编语言来开发。
一般的程序开发,在开发结束后,会最终编译成电脑可直接运行机器码。
=========================================
B.我们来了解一下上古的脚本运行机制有何不同?
而上古的脚本函数则不然,就算我们这些Modder在开发完毕后,使用CK进行编译后得到的可执行脚本PEX文件,仍然不能直接被电脑所识别和运行,他们仍然要在游戏内核中进行最终编译!
上图:
从上图可以看出,CK只是对源码文件进行了最初的编译,这种编译,仅仅是为了让游戏能识别,这种代码,是不能被计算机直接运行的。
=========================================
所以,在最终被游戏调用时,游戏内核还要对脚本PEX文件进行最后编译,以转换为可执行代码。我将其称之为二次编译(2nd Debug):
而我在这里要说的,就是对ini里的参数进行优化,影响我们可以干预的那两步。提高系统性能。
CK官网对ini里的Papyrus参数进行了如下说明:
http://www.creationkit.com/INI_Settings_(Papyrus)
我把这些给翻译了。
PS:[感谢:L版大大(ID:loveltzzm)和我们组的Kevin兄台(ID:巨型小兽兽 )、PIC妹纸(ID:pichuchiu )的大力帮忙]
[翻译这东西真他喵的不是人干的活。英文好的不一定了解进程机制,猴纸是计算机专业可是英文又一般般,合众人之力搞了出来,费老大劲了!undefined]
原文对照:(做成表格,方便大家)
Individual Settings
个性化设置
本帖隐藏的内容
参数名称 | 默认值 | CK官网说明 | 译文 | 补充说明 |
fUpdateBudgetMS | 1.2 | This setting controls how much time the main Papyrus update loop gets. This loop mainly controls function dispatch. If a lot of function calls are being made and a lot of scripts are running, increasing this value may improve script performance at the cost of reduced game framerate. However most of the time the VM won't take this entire time slice and increasing the value will have no effect. | 此设置控制主要PAPYRUS更新循环时间。这个循环主要控制功能的调度。如果有很多的函数调用和脚本运行,增加这个值可能会提高脚本性能,代价是游戏帧率降低。然而,大多数的时间VM将不会调用整个时间段,增加这个值,将不会有任何影响。 | Debug循环时间,只对存在于整个循环的部分代码段生效!建议增大。 |
fExtraTaskletBudgetMD | 1.2 | This setting controls how much time taken out of another game thread is taken up by running script tasklets (the code that runs the raw script byte code). This time is on top of the time that the tasklets normally get in their own thread, but because that thread is shared they may end up being starved if other systems are highly stressed. If the game is not stressed, this time will not be used. Increasing this value may improve script performance in high-stress situations at the expense of framerate. | 此设置"脚本控制子任务"(这里指脚本源码的编译运行进程)调取另一个游戏线程所花费的时间。此时间优先于所有脚本获得线程的时间。但由于所用线程被共享,所以当其他部分系统资源吃紧时,这些脚本可能会被终止。如果游戏不吃资源,这段时间则不会被调用。增加此数值可以提高系统在资源极度吃紧情况下脚本运行的表现,但代价是游戏帧率会降低。 | 指上图中的最终编译线程调用游戏其它线程。建议增大提高脚本的编译容错率。以少量帧数来换取游戏稳定是值得的! |
fPostLoadUpdateTimeMS | 500.0 (on PC), 2000.0 (on Xenon and PS3) | This setting controls how much time is added onto the load screen to do additional script processing in case the cell being loaded into needs to set itself up. Adjusting the time will adjust your visible load screen time. Adjust this setting if a cell with very complicated scripting is not getting quite set up in time by the time the player loads. This also may depend on the story manager since quests may not start until the load screen finishes if they are started up right before the player hits a load door. If the quest initial stage has a lot of scripting then it may need the extra time to run before the load screen is pulled down.
Default: 500.0 (on PC), 2000.0 (on Xenon and PS3) | 这项设置控制在进入载入画面时所要额外增加的时间,用以帮助处理额外的脚本,尤其是正在加载的单元需要独立建立此脚本的时候。这项时间的调整将会影响可视载入画面的总时间。如果一个单元内的脚本过于复杂,以致当玩家载入时不能及时建立,那么这项设置最好进行调整。这项内容的变化还同时取决于游戏事件控制器,因为如果玩家在刚好开启一道载入门时开启任务,那么该任务在载入画面结束之后才可能开始,而且在载入画面完全结束前,这些任务不会在后台展开。所以如果该任务的初始阶段有大量脚本要运行,那么载入画面在结束前会需要一些更多的时间来做处理。
默认值:500.0(电脑),2000.0(XBOX和PS3) | 建议增大,这样在游戏中进入一个含有大量的脚本代码的房间和地牢时,能足够的时间进行编译!减少因为编译未完成就进行游戏而导致的跳出! |
iMinMemoryPageSize | 128 | This is the smallest amount of memory the VM will allocate for a single stack page, in bytes. Smaller values will waste less memory on small stacks, but larger values will reduce the number of allocations for stacks with many small frames (which improves performance). | 这是VM分配到单一分页文件的最小内存量,单位是bytes.这是设置最小内存量。在小型栈区的时候,"较小的值会浪费更少的内存,但较大的值将减少拥有许多小页面的栈区的分配数量(从而提高性能)。 | 单一栈区的最小内存用量,这里默认是128b,建议适当增大。以适合进行大量计算的脚本代码的变量存储! |
iMaxMemoryPageSize | 512 | This is the largest amount of memory the VM will allocate for a single stack page, in bytes. Smaller values may force the VM to allocate more pages for large stack frames. Larger values may cause the memory allocator to allocate differently, decreasing performance for large stack frames. | 这是VM分配到单一分页文件的最大内存量,单位是字节。较小的值,可能会迫使VM分配更多的页面给大的分页文件,较大的值可能会导致内存分配器分配不同的,低效的页面给较大的分页文件。 | 这个值进行合适的设置,并不是越高越好,过大的值会起到反效果!原因在官方说明中已经进行解释。单一栈区的最大内存用量。 |
iMaxAllocatedMemoryBytes | 76800(76kb) | This is the maximum amount of memory the VM will allocate in total for stack frames. If an allocation would push memory usage over this limit, the VM will instead wait for more memory to be freed. Increasing this value may improve performance in high-stress situations with lots of scripts running, but will use more memory. Note that it is possible to exceed this value temporarily while loading a save game due to slightly different allocation ordering. | 这是VM分配的总的分页文件的最大的内存量。如果一个已分配的页面将促使内存使用量超过此限制,VM将等待更多的内存被释放。增加该值可以提高运行很多脚本的高压力的情况下的性能,但是会使用更多的内存。值得注意的是,由于加载游戏存档时的分配顺序略有不同,可能会暂时替代这个值。 | 所有脚本编译时栈区的最大内存用量总和!建议增大,以减少在高压力下,因为等待内存释放而需要的时间! |
bEnableLogging | 0 | This setting turns logging on and off. If off, no logging will occur, even traces, and so it will override the bEnableTrace value. The in-game log display will still work, but nothing will be written to disk. Turning this off may improve performance due to less disk activity.
Default: 0
| 此设置打开或者关闭游戏日志。如果关闭,将不会有日志记录,而且它的值将影响到bEnableTrace的设置。但是游戏中的日记记录功能还是会继续运行,只是不会记录到硬盘。关闭这个功能将提高游戏性能,由于磁盘活动减少。
默认值:0 | 游戏日志文件LOG的开关。 |
bEnableTrace | 0 | This setting turns on and off the script trace commands. System error and warning messages will still be logged to disk. If bEnableLogging is false, this setting is ignored as nothing will be written to disk anyway. Trace commands will NOT be visible in the in-game log display if this setting is off. Turning this off may improve performance due to less disk activity. | 此设置打开和关闭脚本跟踪命令。系统错误和警告消息仍然会被记录到磁盘上。如果bEnableLogging是关闭的,这个设置将被忽略,因为反正什么都不会被写入到磁盘。在游戏运行中,如果这个设置是关闭的,跟踪记录在游戏日志中是无法显示。关闭这个选项可能会提高性能,因为磁盘活动减少。 | 日志文件中是否使用脚本在编译和运行的实时跟踪。Trace是程序员常用的调试手段。使用此命令的前提是bEnableLogging必须为1。 |
bLoadDebugInformation | 0 | This setting enables or disables the loading of additional debug information - essentially line number information. If this setting is off, error messages cannot generate line number data. Turning this on will allow line numbers to be available in error traces at the cost of increased memory usage. | 此设置启用或禁用加载额外的调试信息 - 基本上是行号信息。如果此设置为关闭,错误消息无法产生行号数据。开启这一功能将允许在错误信息中使用行号信息,代价是增加内存用量。 | 是否在日志的错误信息中记录出错的脚本代码的行号。使用此设置会加大内存负担,但是便于在日志文件中找到出错的脚本代码! |
bEnableProfiling | 0 | This setting enables or disables the script profiler. If off, none of the script profiling commands will be available. Turn this setting on to allow profiling information to be collected and logged. If on, script performance will degrade slightly. | 此设置为启用或禁用脚本分析器。如果关闭,脚本分析命令将不可用。启用此设置将允许分析信息的被收集和记录。如果启用此设置,脚本的性能会略有降低。 | 启用脚本分析 |
uTraceStatusOfQuest | 0 | This setting sets a quest to track for script changes by form ID (converted to decimal). The quest that this setting specifies will spit out a Papyrus stack trace to the log every time a Papyrus script tries to change something with it like starting, stopping, setting a stage, or showing an objective. | 设置一个任务来跟踪哪个FORMID(转换为十进制)产生脚本变化。这设置中指出的任务会分出一个Papyrus stack去记录下每次Pupyrus脚本试图改变的某些东西时的变化,如启动,停止,设置一个场景,或显示一个目标。 开发人员使用较多。 | 一般人基本不会使用到这个,这里不详述。 |
那么,我们来根据官方给出的参数解释,我们来点评一下之前那个错误的设置:
[Papyrus]
iMinMemoryPageSize=100000
错误1.这个设置必须为2的N次方,便于编译器寻址,100000是2的多少次方?
错误2.这个值设置太大,会导致每个栈区的空闲空间多,反而会增加寻址时间,之前那几个反例中有个同学提到无限读盘,就是这个原因。
iMaxMemoryPageSize=5000000
错误1.官方说明中已经明确指出,这个值设置太大,会导致VM分配出来的栈区是低效的。估计这个“N网大神”没分清楚栈区和内存的区别!
错误2.一个栈区你就分配500000b/1024/1024=4.76Mb的容量去存那最多1Kb不到的数据?你内存多吃饱撑的?
iMaxAllocatedMemoryBytes=1800000000
错误:增大此项,无可厚非,但是这也太大了,会导致栈区不能被及时回收,造成数据冗余,内存溢出!
1800000000/1024/1024=1716.61Mb=1.7G???内存全用来跑脚本啦?游戏的显示模块,交互模块昨办?
还记不记得我在上面说过的32位程序最多能调用多大内存?
在上面的例子中,有一个同学说是引用了N网的设置,我在这很明确的说,那货绝对不是程序员出身,放这种设置出来害人,N网有大神,也有2B!
这是那个同学给出的N网原址:http://skyrim.nexusmods.com/mods/202,N网那货连帖子都删了。
引申阅读:什么是堆栈?
有兴趣的同学可以看看:http://baike.baidu.com/view/93201.htm#1
现在我们来进行正确的设置:
打开我的文档\My Games\Skyrim目录下的Skyrim.ini
在[Papyrus]下进行如下修改(没有这些字段的直接添加!)
默认设置,调乱了的同学直接复制下面这段,或者直接删除 | 推荐设置 | 说明 |
[Papyrus]
fUpdateBudgetMS=1.2
fExtraTaskletBudgetMS=1.2
fPostLoadUpdateTimeMS=500.0
iMinMemoryPageSize=128
iMaxMemoryPageSize=512
iMaxAllocatedMemoryBytes=76800
bEnableLogging=0
bEnableTrace=0
bLoadDebugInformation=0
bEnableProfiling=0
| [Papyrus]
fUpdateBudgetMS=800(我用2.4)
fExtraTaskletBudgetMS=800(我用2.4)
fPostLoadUpdateTimeMS=2000
iMinMemoryPageSize=256
iMaxMemoryPageSize=512
iMaxAllocatedMemoryBytes=2457600
bEnableLogging=0
bEnableTrace=0
bLoadDebugInformation=0
bEnableProfiling=0
| [Papyrus]
fUpdateBudgetMS此项可根据实际情况更改
fExtraTaskletBudgetMS此项可根据实际情况更改
fPostLoadUpdateTimeMS建议使用XBOX的设置
iMinMemoryPageSize适当增大为256Bytes,以适应多变量脚本
iMaxMemoryPageSize保持不变,以免编译进程中存在太多的低效栈区!
iMaxAllocatedMemoryBytes2400Kb足矣,以免内存回收不及时,再次吐槽那个1.7G的设置!
bEnableLogging在不需要打开日志文件时为0
bEnableTrace为0
bLoadDebugInformation为0
bLoadDebugInformation为0
bEnableProfiling为0
|
这里再说一个误区,是刚才有个同学在回复中问的:
问所谓的内存清理MOD有没有作用?
他给了我一个网址,说是从这下的:
http://bbs.3dmgame.com/thread-3269251-1-1.html
N网原址:
http://skyrim.nexusmods.com/mods/21392/
让我们用工具拆开这个MOD来看看代码:
这个什么All_you_need_Skyrim_performance_mod不要再用了,就是一个坑爹货。
清理内存,我给大家支两招:
1.在控制台使用PCB命令。
2.在我的文档\My Games\Skyrim\SkyrimPrefs.ini中的[BackgroundLoad]字段添加以下参数
[BackgroundLoad]
bSelectivePurgeUnusedOnFastTravel=1
改这个有点用
快速旅行时清理不用的内存。
这样设置,能在脚本编译和运行时稍微增大资源支持。保持游戏稳定。当然,本身就有错误的脚本不在此例,这个我会在后面讲到。
总结,合理的设置能优化游戏运行,减少CTD,反之,则会起到反效果。
对于一些盲目相信N网的人,我只能保留意见。
这让我想起了身边的一个朋友,两口子拼死拼活,把孩子送出去念一个根本不入流的大学,那个累啊~只能说,人的观念不一样,他们就是相信外国月亮特别圆~无语~这个社会的通病。
BY 树下肥猴 undefined
****************第三章 第1节完***************