第一篇:Unity中简单的优化物理系统
这个篇文章的主要目标是给予你一个关于在Unity中简单的优化物理系统
我的游戏物理系统有什么错误吗? 怎么去处理游戏物理系统? Unity 物理系统有什么缺陷吗? Unity 是怎样处理物理系统的? 我在 Unity 物理系统上做了什么控制?
在我开始使用游戏物理系统之前我应该关心什么事情? 我应该在时候避免使用物理系统?
我看到了帧速率在下降,这是否是物理系统导致的?
当涉及到物理系统时,便会有以上这些问题,或许你会有更多像上面类似的问题。
是的,是的,我知道!我们全怪那个平果,它为什么要在那一天降临到牛顿的头上?为什么呢,上帝? 物理学也许不是每个人最爱的科目,但是物理学在游戏开发行业中真的是一个非常重要的角色。
想象一种情况,在紧要关头你最终决定提出做一个大事情。一个让人瞩目的,一个使用逼真的物理和图像的大游戏。
设计已经创建出来,架构已经完成,一切看上去似乎已经准备就绪。但是你最终坐了下来,开始在最棘手的部分上工作,“物理系统”!
此时,似乎所以东西都崩溃了;你无意中看到了很低的FPS,奇怪的移动,碰撞器/触发器 出现了问题,高CPU使用率等等。
不恰当或者不正确的使用物理系统可能会把一些游戏玩家吓跑。这不只是关于不恰当的使用物理系统的问题了;这是关于一个游戏可玩性高不高的问题了。
这些都是不容易解决的问题。物理系统是游戏开发过程中最困难,也是最重要的一部份,这是无法避免的!
人们可能会说:“好的物理系统需要一个超快的CPU!”。但是,请相信我,这句话不一定都是对的。多数情况下,可以通过由浅入深进入Unity的海洋中学习Unity 的物理系统是怎样工作的,以便我们实现更好的物理系统。
在我还是一个程序小鲜肉的时候,我便要处理100多个与物理相关的事情。这让我花了近一年的时间记录下了处理物理相关的关键点。
因此,我决定写这篇文章。帮助大家跳跃这个学习阶段的痛苦,成为一个专业的物理系统开发者。
我不打算讲关于物理系统在Unity中是如何工作的,然而我将会在怎么优化你的物理系统中列出技巧和要点。所以,如果你是一个新手,我建议你先去大概了解一下Unity 物理系统。
物理学是一个非常非常庞大的、广泛的概念,我决定分成不同的部分,尽可能做到简单。
接下来,这是一个漫长有趣的过程,请你赶紧系好你的安全带,让我们开始吧!
降低固定时间步(Fixed Timestep)在Unity文档的说明如下: “一个不受帧速率影响的时间间隔,用于指定在 FixedUpdate()函数中执行物理计算每一帧的时间间隔”
默认值为 0.02(每秒),这显示了每 20ms(毫秒)物理更新将会被执行一次。所有 FixedUpdate()也会每20ms调用一次。
你需要不停的改变这个值,以获得理想的效果。 例如:
“如果你打算做一个简单的卡牌游戏,这不需要使用太多的物理系统。然而最好减少调用物理引擎的次数。但是这操作要很细心一点;如果你减少过多的物理引擎调用的次数,你也许不会得到你想要的物理效果。”
让我们通过下面的案例更好的理解 Fixed Timestep 吧! 步骤 1)创建 3-4 个 球体。让他们保持一些距离:
步骤 2)创建物理材质(通过在Assest文件夹中按下右键->Create->Phycics Material),并且设置摩擦系数(Friction
Amount)的数值为 0,然后设置弹力系数(Bounciness)为 1,再设置弹力混合(Bounce combine)为最大值:
步骤 3)将该物理材质添加到球体碰撞器的物理材质卡槽中去: 步骤 4)为球体添加刚体组件(这将意味着此物体时物理对象): 步骤 5)创建一个平面,并且为其创建一个物理材质(先使用默认值),添加到平面上:
步骤 6)让创建的球体位于平面的上方,并且设置球体的重力选项盒为勾选状态。
步骤 7)点击 Play 按钮,并且查看一下结果。
这个球在做一下一上的动作。(不好意思,污了一下下。) 那么,这与固定时间步(Fixed Time Step)有什么关系呢? 上面只是一个简单的设置,现在我让我们开始玩耍 Fixed Time Step 的值吧!
找到 Edit>>Project Settings >> Time,在那里,你能找到 Fixed Time Step,它的默认值为 0.02(正如我之前提到的那样)。
现在让我们设置它为 0.1,然后按下 Play 按钮开始游戏。 你有发现有什么不同吗?
首先你会注意到,这些球的运动非常的慢。 然后,你会看到球体穿过了平面而不是反弹回来。 你会问为什么?(不需要弹跳如此的快呀!啊哈哈)
好的,如果你设置 Fixed Time Step 为 0.1,这就意味着物理更新将在每100ms(毫秒)执行一次,这很快就会注意到,将无法检测到碰撞。
这表明,过多的降低 Fixed Time Step 的也是不恰当的。现在让我们改变 Fixed Time Step 的值为一个更为实际可行的值 0.03-0.04。(具体根据球体的需要来定)现在,如果你开始游戏,你不会看到任何改变。只要看上去还行,那就OK。如果你细心的检查一番,物理碰撞检测会有一点点不同的。
看看下面的图片: 提示
如果你不能跟上步骤来,那么请你参考一下Unity的官方文档。适当的理解 Unity 物理引擎是必须的。
物理碰撞检测会有点延迟,只会在当前帧结束之后才反弹回去。这在你游戏处于正常FPS下可能观察不到,但是这可能会影响到物理效果。但只要你的需要满足了,这也是没什么关系的。
这将有什么帮助呢?
任何时候你从物理计算中节省下来的计算资源,都可以让给渲染和其他计算密集的处理,所以就可以让你的游戏更加出众。
通过设置 Maximum Allowed Timestep 在物理系统中保持检查! 在Unity文档中的定义如下:
“一个不受帧速率影响的时间间隔,当帧率为最低峰值的时候,物理计算和 FixedUpdate()事件将不会被执行”
那么,这意味着什么呢?
让我们先在正常的游戏下,去理解它(Maximum Allowed Timestep)。
如果你的游戏在运行的时候能保持在 60 FPS,这就意味着每一帧会执行 0.01666秒。意味着每一帧需要花费 16.7ms(毫秒)。现在,让我们把 Fixed TimeStep 设置为 0.01,这表明物理更新将每 10ms 执行一次。
这表明,在每一帧中至少会调用一次物理更新,因为 10ms<16.7ms.现在让我们假设由于某种原因帧率降低到了 30 FPS。
那么,每一帧将会执行 0.0333秒(也就是33.3ms)。也就意味着在每一帧中会调用3次物理更新(因为一次物理更新花费10ms)。这意味着如果帧率继续下降,每帧内的物理调用还会更多。
这将会导致程序崩溃。为了解决这个问题,下面引入 Maximum Allowed TimeStep。
它的默认值为 33ms(可能是作者搞错了,明明就是0.33333秒 = 333。33ms啊)。正如 Maximum Allowed TimeStep 定义:每当物理更新超过指定的时间,物理更新将会停止。因此,这便为其他进程节约了资源。
在我们的案例中,如果每一帧执行时间增加到 40ms,这将会调用更多的物理更新。但是现在我们设置 Maximum Allowed TimeStep 为 0.033,也就是33ms,物理更新将会在 33ms 后停止调用,也就是执行3次物理更新后,便会停止调用,尽管每帧的执行时间超过 50ms 也会如此。
因此为其他沉重的进程节省下一些资源。 这听起来非常的棒,不是吗?
但还是有会一些限制的负面影响。每当发生性能故障,动画和物理便会放慢(意味着画面卡顿,延迟)。
因此,要牢记Maximum Allowed TimeStep 同样是一个重要的因素,如果使用得当,将会得到非常好的效果。
总是有 1-1-1 的比例
放大一个没有物理的对象是没有问题的(就是没有与物理相关组件的物体对象),但是当一个物体时一个物理对象时,我建议你不要对该物体进行缩放。缩放会导致奇怪的碰撞检测,也会影响到物体的下落方式。
例如: “一块大石头在没有任何空气阻力的情况下会很快的落到地面上(如从塔上或其他地方掉下来)。但是如果它周围的物体都放大了,那会让下落看起来速度很慢”。
还有一个选项是调整重力加速度的值让他看起来变得正常,但是这不是最正确的做法。正确的做法应该是保持使用1-1-1的缩放比例,因为Unity的物理引擎在这种情况下工作的最佳。
给你的对象设置恰当的质量 和缩放一样,质量也需要保持精确。 让一架飞机的质量为 1kg 正确吗?
如果你考虑到度量系统准则,Unity的 1 个单位等于 1 kg 质量。同样的,Unity的 物理系统是无量纲的。但是,如果你假定 Unity 的一个单位的长度为米,那么,一个质量的单位为 kg。
你可以得到更完美的结果。并且,Unity在努力解决高浮点数问题,所以尽量削减取值范围是比较理想的解决方案。
这意味着,如果假设你的飞机重 1kg,那么你的轮子必然不会超过 1/1000 kg。
尽可能避免使用网格碰撞器(Mesh Collider)
对任何物理引擎来说,基于网格的碰撞检测都比原始的碰撞检测需要更多的计算量,这是一个事实。Unity在内部使用了 Nvidia 的 PhysX,因此这是没有什么不同的。
一般来说,“对于不同碰撞检测的相对成本从高到低的排序为:三角形网格、凸包(具体可以百度百科)、胶囊体、球体、盒子(六面体)、平面、点”
通常,网格碰撞器(Mesh Collider)被标记为凸包(也建议大家这么标记),它将被限制到255个三角形。只有在两个网格碰撞器被标记为凸面(Covex)时才能相互发生碰撞检测。
在 Unity 文档中的说明: ”使用网格碰撞器时会有一些限制。没有标记为凸面(Convex)的网格碰撞器只支持在一个没有刚体组件的游戏对象(GameObjecet)上发生碰撞,如果你想要在一个刚体上使用一个网格碰撞器,这必须要标记为凸面“
理想情况下,应该尽量避免使用网格碰撞体,因为他们会比传统的碰撞器(球体,立方体,胶囊体)带来更多的计算负载,所以最好还是少用。
替代方案是什么呢?
一个简单的替代方法就是让对象的子物体使用原始(传统)碰撞器把它们组合起来(如上图所示)。这样会减少一定的计算量,因为原始(传统的)碰撞器计算速度比较快。
对于复杂的网格,你通常可以使用 Blender(小巧的建模软件)或者其他工具来将它们分解成一些小部分。然后可以用传统碰撞器直接替换掉这些小部分的网格。
我希望我已经给你一个确切的优化描述,但是不幸的是,每个网格都是不一样的,对于我给出一个确切的描述是非常困难的。
后续很快就会来到
这个列表会很长,而且看上去会没有尽头,所以让我们先休息一
下,后续的博客会继续介绍其他的提示。
同时我也不希望你一下看太多关于物理的东西而产生不适。 请继续保持关注,然后先从上面几个点开始优化。如果你有更好的替代方案,请也和我们分享一下。如果对上面讨论的内容有任何问题,或者有任何疑问,请在评论区留言,我会很高兴能提供任何帮助。总结:该篇文章大体讲了一下几个关键字:Fixed TimeStep、Maximum Allowed TimeStep、Mesh Collider、Convex。
这些东西都能在官网组件手册中找到一些详细的说明,如果看不懂该文章所说的内容,还请大家自行去看一看官网的组件手册(还记得我给你说的 Unity 圣典吗) 第二篇:Unity之工作总结
图片格式
----------1 DrawCall -----------2 图片格式:
NGUI生成的图集的图片格式是PNG格式,但是无论是什么格式的图片 Unity都会自己生成一套格式,并且打包的时候不会用文件夹下面的格式,而是Unity自己格式。
如果你用的UITexture 你可以对每一张图来修改格式,比如颜色数比较少的图片可以使用16bit,如果没有透明,可以使用pvr或者etc 这样图片会小很多。如果是UISprite 只要有透明的 就必须使用RGBA32 要不然UI会很难看。
除去 UITextuer和Atlas的图片之外(因为有透明),其余的贴图必须是2的幂次方。因为只有2的幂次方图片,并且没有透明通道的才会被压缩。Ios会被压缩成pvr格式,Andriod会压缩成etc格式。压缩之后会小很多。
人物贴图 场景题图 特效贴图 一定要是2的幂次方。
贴图透明通道分离,压缩格式设为ETC/PVRTC 最初我们使用了DXT5作为贴图压缩格式,希望能减小贴图的内存占用,但很快发现移动平台的显卡是不支持硬件解压DXT5的。因此对于一张1024x1024
大小的RGBA32贴图,虽然DXT5可将它从4MB压缩到1MB,但系统将它送进显卡之前,会先用CPU在内存里将它解压成4MB的RGBA32格式(软件解压),然后再将这4MB送进显存。于是在这段时间里,这张贴图就占用了5MB内存和4MB显存;而移动平台往往没有独立显存,需要从内存里抠一块作为显存,于是原以为只占1MB内存的贴图实际却占了9MB!
所有不支持硬件压缩格式都有相同的问题。解决方案:
现在Andriod硬件最广泛支持的时Etc ,IOS上支持的时PVRTC。但这两种格式都是不带透明(Alpha)通道的,因此我们需要将每张原始贴图的透明通道分离出来,写进另一张贴图的红色通道里,这两张特图都采用Etc/Pvrtc压缩。渲染的时候 将两张贴图都送进显存。同时 我们修改了NGUI的shader 在渲染时第二张贴图的红色通道写入到第一张贴图的透明通道里恢复原来的颜色:
1.2.3.4.5.6.} fixed4 frag(v2f i): COLOR { fixed4 col; col.rgb
=
tex2D(_MainTex,
i.texcoord).rgb;col.a
=
tex2D(_AlphaTex, i.texcoord).r;return col * i.color;
这样,一张4MB的1024x1024大小的RGBA32原始贴图,会被分离并压缩成两张0.5MB的ETC/PVRTC贴图(我们用的是ETC/PVRTC 4 bits)。它们渲染时的内存占用则是2x0.5+2x0.5=2MB。
DrawCall 当两个renderQueue相邻的DrawCall使用了相同的贴图、材质和shader实例时,这两个DrawCall就可以合并。但需要注意的是DrawCall合并不见得会提高性能,有时反而会降低性能
如果是UIGeometry为了渲染绘制准备数据,那么UIDrawCall其实是定义了渲染绘制需要的基本组件。这里拿煮菜做个比喻帮助理 解:UIGeometry好比为煮菜准备食材,UIDrawCall好比是煮菜的工具(锅,炉子等),UIPanel就是大厨了决定着什么时候该煮 菜,UIWidget(UILabel,UISprite和UITexture)是这道菜怎么样的最终呈现。
UIWidget分别用UpdateGeometry和WriteToBuffers对UIGeometry的ApplyTransform和 WriteToBuffers进行封装调用,ApplyTransform是根据UIPanel的坐标调整Vertices的坐 标,WriteToBuffers将UIGeometry的Vertices,UVs和Colors添加进UIPanel的Vertices,UVs和 Colors的BetterList中。
这里还有一个细节就是:UIGeometry中的Vertices,UVs和Colors的BetterList的buffer什么时候得到,因为这些都 是UIWidget或其子类的信息,所以在UIWidget的子类UILabel,UISprite和UITexture中OnFill函数生成 UIGeometry的BetterList的buffer。
UIWidget这个脚本中的两个函数:WriteToBuffers,OnFill,UpdateGeometry。
WriteToBuffers和OnFill这两个函数都是将Vertices,UVs和Colors等add进参数的List中去,查看 WriteToBuffers的调用出发现其参数是UIPanel的Vertices,UVs和Colors,而OnFill的参数是 UIGeometry的Vertices,UVs和Colors。
WriteToBuffers只是对UIGeometry的封装调用,也就是说将UIGeometry的Vertices,UVs和Colors等信息add进UIPanel的对应List中。
UIGeometry的脚本,一直有一个疑问:UIGeometry的Vertices,UVs和Colors的List没有看到add方法的执行,只有在WriteToBuffers被add。直到看到了OnFill才恍然大悟,虽然UIWidget的OnFill是虚函数,没有具体实现,看了下 UISprite重写的OnFill函数,就是把Vertices,UVs和Colors 添加到UIGeometry的Vertices,UVs和Colors中。所有UI组件的Vertices,UVs和Colors都汇集到UIPanel的Vertices,UVs和Colors去了,然后 UIPanel指定给UIDrawCall渲染就行了
UIWidget的一些实现细节,MakePixelPerfect():对gameObject的localPosition和locaScale进行微调和纠正。SetDirty():调用UIPanel的SetDirty()对组件的变更进行重建(rebuilt)。Uiwidge
UIGeometry& UIDrawCall 的关系:
UIWidget 中有两个变量UiDrawCall mDrawcall 和UIGeometry mGeo 的verts uvs cols 的BetterList,然后UiWidget 的UpdateGeometry函数对UIGeometry 的ApplyTransform()和WriteToBuffer()调用进行更新.每一个UIwidget都有一个UIGeometry 但是不都有一个UIDrawCall,而是通过Batch合并达到减少DrawCall的数量,UiDrawCall是有UiPanel生成的。
DrawCall的数量优化
根据上述描述可以得出一个结论:使用相同material的连续的Uiwidget(UILable UiSprite)公用一个UIDrawcall。通过这个结论我们可以得到一个解决DrawCall过多的问题,UIPanel生成DrawCall时是Fill()方法。Fill 方法对UiWidget.list进行检测把使用相同Material的连续的Uiwidget合并生成一个DrawCall ,UIWidget.List 的排序是根据UiWidget的Depth进行的。所以解决方案有两种:
1.修改
UiWidget(UiLable UIwidget)的
Depth,限定
UIwidget.List的排序 2.重写Uiwidget的CompareFunc()方法。(重写UIWidget的CompareFunc也是可以的,按照Material的name优先排序,只有当material一样是才考虑depth进行排序:)
3.无重叠时自动重排。绘制顺序按照Hierarchy
采用第二种方式减少DrawCall: Material leftMat = left.material;Material rightMat = right.material;if(leftMat == rightMat){
if(left.mDepth >
&
<
right.mDepth)return-1;else
1;else
return
0;}
rightMat!=
null)return
if(left.mDepth if(leftMat!=null
right.mDepth)return
string.Compare(leftMat.name,rightMat.name);if(leftMat!= null)return-1;if(rightMat!= null)return 1;
return(leftMat.GetInstanceID()< rightMat.GetInstanceID())?-1 : 1;
夹层问题:
因为Material使用的Shader使用了透明,这样就不能做深度测
试,也就是Mesh的“深度”是不影响的,这样最终的显示就跟Shader的 renderQueue有关了,即renderQueue越大,显示的越靠前面(重叠的图层,renderQueue越大,越靠前)。当然现在只有增加一 个DrawCall(如多使用一个UIPanel或用另外一个Material)来做到Material的夹层效果。
特效层级:
粒子系统的渲染顺序列默认为3000 而NGUI的渲染顺序默认是从3000开始,当有嵌套的Panel或者Deoth更高的panel时,NGUI的渲染顺序会高于3000
解决方案:
1.修改Ngui中的panel脚本中的默认RenderQueue 调整到3000以下,这样就不会挡住粒子特效。当窗口显示在特效上面时把窗口的RenderQueue调整到3000以上,就解决了。
2.使用另外一个摄像机显示特效,但是Ui窗口切换时不太好控制 3.修改例子特效的shader中的RenderQueue的值(需要考虑特效中的层级关系)一级界面 二级界面..浮动窗口
1.不同图集
项目中做到复杂一些的界面,经常会用到多个图集,以技能界面为例,项目中常用的图片放到共用图集中,这是一个图集,技能界面本身独有的元素,比如跟技能职业相关的背景,算作第二个图集,还有一些技能图标,图标单独归类到一个图集中,再一个就是字体的图集。基本一个界面如此分法,最多需要4个图集。NGUI的图集之间的 处理,默认是靠调整控件的Z值来区分的,但是这里他可以调整同一个图集每个一个控件的Z值,其实不是很好。经常会出现图层相互遮挡的情况,尤其对于控件比较多的界面,一段时间回过来再修改界面的时候,整个要崩溃。
解决方案:在UIPanel中,为每一个Material添加一个layer的变量,当同一图层靠depth来决定前后关系,不同图层靠 layer来决定前后关系,在绘制UIDrawCall的时候,根据layer对跟节点做一定偏移。这样就能从Z值中解放出来。如果大家也有碰到图层的问题,
可以参考这样的做法,以此种方法来处理图层关系,简单,做过项目的圈套UI,还未有不能解决的情况。
UI自适应
Scaling Style 的作用是制定UiRoot的缩放类型,如果是PixelPerfect ,Minimum Height 和Maximum Height 才起作用,scaling style 选择的是
Pixelperfect 要对Minimum Height和Maximum Height进行设置。(如果是PixelPerfect缩放类型,当屏幕的分辨率大于Maximum Height,则以Maximum Height 为基础缩放,反之,如果屏幕分辨率小于Minimum Height 则以Minimum Height为基础进行缩放。例如,如果屏幕高度为1000,而设置的Maximum Height值为800,则UI界面整体放大为原来的1000/800=1.25倍。)FixedSize : 跟Manual Height有关
FixedSizeOnMobiles :跟Manual Height有关
只是针对IOS和Android上的判断,也就是说只有IOS和Android平台下FixedSizeOnMobiles才起作用.FixedSize或FixedSizeOnMobiles,则缩放只以Manual Height为参考,屏幕分辨率的高度值不同于此设置值时,则根据其比例(即Screen Height / Manual Height)对整棵UI树的进行“等比”缩放(宽度的缩放比也是此比例值)。
注释:如果设置FixedSize,UIWidget.height(以UiRoot默认值进行高度缩放)是不会改变的,不管实际屏幕分辨率的像素是多少,Anchor Stretch的背景图片高度始终是manualHeight.UIRoot下的UIWidget的height参数一直都是实际的值
UIRoot 是基于高度进行缩放的如何做以宽度适配。
UIRoot是基于高度放缩的,即放缩的比例是以高度为参考的,所以UIRoot有一个manualHeight的参数。那么对于横版游戏显然不行,要是 能实现基于宽度放缩。所以可以通过设置一个“manualWidth”的参数来做。比如我们项目中使用的是 1024 作为UI的宽屏尺寸,通过换算设置manualHeight的值:
int height = Mathf.Max(2, Screen.height);manualHeight = Screen.height * 1024 / Screen.width;//基于宽度的屏幕分辨率自适应
注释:UIRoot其实就做了一件事情:根据Screen.height和UIRoot.activeHeight的比例来调整UIRoot的 loaclScal,从而保证UIWidget(UISprite,UILabel)可以按照其本身的大小进行设置,而不用经过复杂的换算过程。
资源分离打包与加载
资源分离打包与加载是最有效的减小安装包体积与运行时内存占用的手段。一般打包粒度越细,这两个指标就越小。但打包粒度也并不是越细就越好。如果运行时要同时加载大量小bundle,那么加载速度将会非常慢——时间都浪费在协程之间的调度和多批次的小I/O上了。此需要有策略地控制打包粒度。一般只分离字体和贴图这种体积较大的公用资源。
关闭贴图的读写选项
Unity中导入的每张贴图都有一个启用可读可写(Read/Write Enable)的开关,对应的参数是TextureImporter.isReadable。选中贴图后可在Import Setting选项卡中看到这个开关。只有打开这个开关才可以对贴图使用Textuer2D.GetPixel,读取或改写贴图资源的像素,但这就需要系统在内存中保留一份贴图的拷贝,以供Cpu访问,但是一般游戏运行过程中不会有这样的需求,因此我们对所有贴图都关闭这个开关,只在中做贴图导入后处理(比如对原始提贴图分离透明通道)时需要打开这个选项。这样,上文提到的1024x1024大小的贴图,其运行时的2MB内存占用又可以少一半,减小到1MB。Texture图片空间和内存占用分析
纹理大小影响:
可以将其他(非二的幂-“NPOT”)纹理大小用于 Unity非二的幂纹理大小通常占用的内存稍多一点,由 GPU 进行读取的速度可能较慢,因此考虑到性能,最好尽可能使用二的幂大小。如果平台或 GPU 不支持 NPOT 纹理大小,则 Unity 会缩放纹理并将其填补为下一个二
的幂大小,这甚至会使用更多内存并使加载更慢
Iphone: 空项目
空间占用量42.3M
ipa包10M 10张1200*520 无压缩Texture 单张图占用量2.8M 空间占用两70.2M ipa包 22.9M 10张1200*520压缩成1024*1024 PVRTC4 单图占用量0.5M 空间占用量47.3M ipa包 13.2M 10张1024*1024 无压缩Texture
单图占用量4M 空间占用量82.M
ipa包14.6M 10张1024*1024压缩为PVRTVC4格式 单张图占用量0.5M 空间占用量 47.3M ipa包 11.6M 综上所述:
1.2的N次方大小的图片会得到引擎更大的支持,包括压缩比率,内存消耗 打包压缩大小,而且支持的力度非常大。
2.减小图片的占用大小和内存方式有:图片大小变化(Maxsize),色彩位数变化(16位色 32位色),压缩PVRC格式
3.U3D对于图片的格式是自己生成的,而并不是你给它什么它用什么格式。一张1024*1024图在无压缩的格式下,他会被U3D无压缩文件像是存放,也就是说U3D 里的Texture Perview 里显示的占用大小**M 不只是内存占用的大小,还是空间占用大小。
Unity 图片压缩格式介绍:
U3D 的内部机制为自动生成图片类型来替代我们的图片在图片的压缩方式需要进行谨慎的选择。几种比较主要的压缩格式:
RGBA32 BIT/AutomaticTurecolor(256*256 256k)
格式为无压缩最保真格式,最消耗内存和空间的格式。RGBA16 BIT/
格式为无压缩16位格式,比32位节省一半的空间和内存,与Automatic16 相同。RGBA Compressed PVRTC 4bits格式为PVRTC 图片格式,它相当于把图片更改了压缩方式新生成了一个图片来替换
原来的图片格式
贴图格式:
3D游戏中贴图的的分类: UI贴图
ui是按照 1280*853比例出的图
3D场景贴图 主要是因为多重采样的缘故。3D游戏一般来说都是受摄像机远近大小改变而采取不同的采样大小,如果不设置多重采样的话,在远处有非常多的白色噪点。
2D游戏
所有都不需要勾选多重采样,具有3D性质的贴图,我们都需要勾选上GENERATE MIP MAPS,这样会使贴图大小增加25%这样。
正方贴图与非正方贴图也要区分: 非正方贴图只有16位的压缩(相当于真彩色减半),所以最好游戏中都是正方的贴图。正方贴图: IOS:
普通不透明: RGB PVRTC 4 BITS
普通透明: RGBA PVRTC 4 BITS(256*256 32kb)Androis: 普通不透明: RGB ETC 4 BITS(256*256 32kb)
普通透明:因为没有通用的兼容模式,所以一般情况是用RGBA 16 BITS 或是针对不同的GPU选择 DXT5/ATC8 BITS/ETC2 8BITS。如果技术支持,可以采用 RGB ETC 4 BITS 加一张Alpha 8的贴图来实现透明效果。
非正方形:
一般采用16位压缩,16位色会带来颜色损失,如果本来美术就按16位色画的话,就不会带来损失。日本的很多2D游戏都是采用那个16位来画的。少渐变 和艳色。
不透明贴图: RGB 16 BIT(256*256 128KB) 透明贴图: RGBA 16 BIT(256*256 128KB) 高清不压缩贴图:
RGBA 32 BIT(256*256 256kb)
对于不重要的贴图,模糊度低的贴图,建议不仅要采取像素压缩,
还要直接压缩其大小。如光照贴图压到512或256。如背景原本1024的图直接压到256。玩家不注意到就可以了。
注意:
U3D所有图片的压缩格式都会以另一种方式存储,不会以你给的方式存储,只有你指定了某种格式,他才会转换成你要的格式。而且在Andriod 里的并不一定有效,因为Andriod的机型多,GPU的渲染方式也不一样,RGBA16 适应于所有机型
GameObject数量
场景中GameObject的数量也是衡量性能的重要指标,频繁的创建 和销毁GameObjec 是非常耗时,场景中存在的GameObject会占用内存,如果GameObject上挂有物体的话,每个GameOject的脚本都需要实力化。
整理图集
整理图集的主要目的是节省运行时内存(虽然有时也能起到合并DrawCall的作用)。从这个角度讲,显示一个界面时送进显存的图集尺寸之和是越小越好。一般有如下方法可以帮助我们做到这点: 1)在界面设计上,尽量让美术控件设计成九宫格拉伸,即UiSprite的类型是Sliced.这样美术素材可以切出一张很小的图片在unity中做拉伸。当然一个九宫格也就意味着其定点数量会从4个增加到16个(如果九宫格的中心格子采用Tiled做平铺类型的话,定点数会更多),构建DrawCall的开销会更大。但一般只要DrawCall安排合理就不会出问题 2)同样在界面设计上 尽量设计成对称的形式,这样在切图的时候美术切图的时候就可以只切一部分,我们在Untiy中将完整的图案拼出来,比如一个圆形图案我们可以只切四分之一,不过与上述第一点类似这样会增加定点个数,同时也会增加场景中GameObject的个数,因为GameObject的数量增多时会占用跟多的内存,所以只对尺寸较大的图案采用这种方法。3)4)确保不要让不必要的贴图素材驻留内存,更不要在渲染时将无关的贴图素材送进显存。为此需要将图集按照界面分开,按模块划分图集,一个界面中的UISprite也不要使用别的界面的图集。数量庞大 且数量不固定的物品不要使用图集 要采用
UITexture 减少图集中的空白地方。完全透明的像素和不透明的像素所占用的空间是一样的,因此在像素量不变的情况下,要尽量减少图集中的空白。比如有时一张1024x1024的图集中,素材所占的面积还没超过一半,这时可以考虑将这张图集切成两张512x512的图集。(可能有人会问为什么不能做成一张1024x512的图集,这是因为iOS平台似乎要求送进显存的贴图一定是方形。)当然,两张不同图集的DrawCall是无法合并的,但这并不是什么问题。5)
根据各个UI控件的设计安放Panle,隔开DrawCall 在合并DrawCall时需要注意,如果将会移动变化的UI控件和一个静止不变的UI控件的DrawCall合在一起,当其中一个UI控件(UiWeight)的位置 大小 或颜色等属性发生变化时,UIPanle就需要重建这个Panle上的所有DrawCall。有时重建一个DrawCall会消耗不少的CPU,它需要计算这个DrawCall上的所有顶点信息,包括顶点位置 UV和颜色等,如果很多的控件都集中在同一个DrawCall上,那么其中一个控件上有一点点变化,这个DrawCall上的所有的顶点就都需要遍历一遍。而如果我们的UI又大量的采用九宫格拉伸,使控件的顶点数量就会变得更多。因此重建一个DrawCall 的开销会更大。
因此需要将UI控件分组,将一段时间内会发生变化的控件----比如怪物头顶的血条和伤害跳字放在同一个Panle上,并且这些Panle上只有这些控件,其余基本不变的控件放在别的控件Panle上,这样两类控件就隔开到不同的DrawCall在不同的Panle中,当一个控件发生变化而导致DrawCall重建时,就不需要遍历那些没有变化的控件。因为在美术设计上,一段时间内在变化的控件总是少数,所以优化效果十分明显,节省的CPU占用率能达到25%。
优化锚点内部逻辑,使其只在必要时更新
在上一点优化了Panel的DrawCall重建效率之后,我们发现NGUI锚点自身的更新逻辑也会消耗不少CPU开销。即使是在控件静止不动的情况下,控件的锚点也会每帧更新(见UIWidget.OnUpdate函数),而且它的更新是递归式的,使CPU占
用率更高。因此我们修改了NGUI的内部代码,使锚点只在必要时更新。一般只在控件初始化和屏幕大小发生变化时更新即可。不过这个优化的代价是控件的顶点位置发生变化的时候(比如控件在运动,或控件大小改变等),上层逻辑需要自己负责更新锚点。
降低贴图分辨率
这一招说白了其实就是减小贴图素材的尺寸。比如对一张在原画里尺寸是100x80的贴图,我们将它导入Unity后会把它缩小到50x40,即缩小两倍。游戏实际使用的是缩小后的贴图。不过这一招是必然会显著降低美术品质的,美术立马会发现画面变得更模糊,因此一般不到程序撑不住的时候不会采用。
界面的延迟加载和定时卸载
如果一些界面的重要性较低,并且不常被使用,可以等到界面需要打开显示的时候才从bundle加载资源,并且在关闭时将自己卸载出内存,或者等过一段时间再卸载。不过这个方法有两个代价:一是会影响体验,玩家要求打开界面时,界面的显示会有延迟;二是更容易出bug,上层写逻辑时要考虑异步情况,当程序员要访问一个界面时,这个界面未必会在内存里。因此目前为止我们仍未实施该方案。目前只是进入一个新场景时,卸载上一个场景用到但新场景不会用到的界面。
避免频繁调用GameObject.SetActive 我们游戏的某些逻辑会在一帧内频繁调用GameObject.SetActive,显示或隐藏一些对象,数量达到一百多次之多。这类操作的CPU开销很大(尤其是NGUI的UIWidget在激活的时候会做很多初始化工作),而且会触发大量GC。后来我们改变了显示和隐藏对象的方法——让对象一直保持激活状态(activeInHierarchy为true),而原来的SetActive(false)改为将对象移到屏幕外,SetActive(true)改为将对象移回屏幕内。这样性能就好多了。
NGUI性能消耗点汇总
使用LinkedList 代替BetterList。
BetterList是一个数组 LinkedList是一个链表。对链表的操作要快于对数组的操作。
NGUI节点查找非常耗时。
代码中非必要的堆分配 1)
我们应避免使用foreach循环 :一般建议是避免使用foreach循环,尽量使用for或者while循环,我在Unity论坛遇到很多人提到这个建议。这背后的原因咋一看似乎是合理的,foreach只是语法封装,因为编译器处理代码的流程大体是下面这样:
foreach(SomeType s in someList)s.DoSomething();转换为:
using
(
SomeType.Enumerator
enumerator
=
this.someList.GetEnumerator()){
while(enumerator.MoveNext()){ SomeType 会
创
建
一
s 个
=
(
对
SomeType象
,
一
)个
enumerator.Current;s.DoSomething();} } 每次使用foreach时 都
enumerator
System.Collections.IEnumerator的接口实例。但是创建在堆栈上还是堆上是都可能的 几乎所有的System.Collections.Genric(list Dictionary, LinkedList)命名空间中的集合类型都可以从GetEnumerateor函数执行一个结构。
2)应该避免使用闭包和LINQ吗?
匿名方法和lambda表达式会引起内存泄露吗?答案是:这取决于C#编译器,有两种区别很大的方式来处理
int result = 0;void Update(){ for(int i = 0;i < 100;i++){
System.Func myFunc =(p)=> p * p;result += myFunc(i);} } 如你所见,以上代码似乎每帧要创建100次委托函数myFunc,每次
调用它执行一次计算。但是Mono只在第一次调用Update()方法时分配堆内存(在我的系统上只用了52字节),在之后的帧也没有更多的堆分配操作。这是怎么了?使用代码反编译器(将会在下篇文章解释)可以看见C#编译器只是简单的把myFunc 替换为类的一个静态System.Func 类型字段,包括 Update()函数也是。这个字段的名字很奇怪但是也有一些意义:f__am$cache1(不同系统上可能会有差别),也就是说,托管方法只分配一次,然后就被缓存了
现在我们在托管定义方式上做一些小小的改变: System.Func myFunc =(p)=> p * i++;
通过把“p”替换为“i++”,我们已经局部定义方法转变成一个真的闭包(闭包是函数编程的一大支柱。它把数据和函数联系到一起,更准确的说是非局部变量在函数之外定义。)在myFunc中,p是一个局部变量但i是一个非局部变量,属于Update()方法。C#编译器现在不得不将myFunc转换成可访问、甚至是可修改,包含非局部变量的方法。它通过声明一个全新的类表示myFunc创建的引用来实现这一功能。For循环每次执行都要分配一个类的实例,瞬间产生大量的内存泄露(在我的电脑上每帧26KB)闭包概念在C#3.0 的时候被引入主要原因是LINQ。如果闭包回引起内存泄露
3)协程
通过StartCoroutine()运行一个协程,会隐式分配Unity Coroutine类(系统上占用21字节)和Enumerator(占用16个字节),所以在游戏运行时尽量少用StartCoroutine()
4)字符串
C#和Unity内存问题必须会提到字符串。从内存角度,字符串很奇怪,因为,他们是堆分配且不变的。当你连接两个字符串时(无论是变量还是常量):运行时不得不分配至少一个新的字符串对象存储新的结果。String.Concat()有效地通过调用FastAllocateString()分配新对象,但是必定会产生多余的堆分配(上面例子在我的系统上占用40字节)。如果你需要在运行时修改或者连接字符串,最好使用 System.Text.StringBuilder
5)装箱 尽量减少装箱 6)库方法
各种库方法也会隐式分配内存。捕捉它们最好的方法是分析。我之前已经写过的 foreach-循环,大多数标准泛型集合不会导致堆分配。Dictionary 也是。然而,有点神秘地,Dictionary .KeyCollection和Dictionary .ValueCollection是类,不是结构体,这意味着“foreach(K key in myDict.Keys)......”会分配16个字节。
查找堆分配的两种方式 1.使用Unity profiler 2.反编译自己的代码
在CIL中查找内存分配
CIL代码的优势在于堆分配代码不会被隐藏。相反,完全可以在反编译的代码中找到堆分配的三种指令。
1)
newobj :通过构造函数创建一个指定类型的未初始化对象。如果对象是值类型(结构体等),则在堆栈创建。如果是引用类型(类等)则在堆上分配。可以从CIL代码知道对象类型,所以,可以很容易知道在哪分配。
2)
newarr :在堆上创建一个数组。元素类型在参数中指定。 3)
box :装箱(传递数据)专用指令,在第一部分已经介绍过。 Unity脚本执行顺序和编译顺序 1)脚本执行顺序
Unity 在后台会把每个脚本的 Awake、Start、Update、LateUpdate、FixedUpdate 等等,所有的方法合并到一起。然后按照 代码的执行顺序进行执行。
编译顺序
首先从脚本语言类型来看,Unity3d支持3种脚本语言,都会被编译成CLI的DLL 如果项目中包含有C#脚本,那么Unity3d会产生以Assembly-CSharp为前缀的工程,名字中包含”vs”的是产生给
Vistual Studio使用的,不包含”vs”的是产生给MonoDevelop使用的。
对于每一种脚本语言,根据脚本放置的位置(其实也部分根据脚本的作用,比如编辑器扩展脚本,就必须放在Editor文件夹下),Unity会生成4中后缀的工程。其中的firstpass表示先编译,Editor表示放在Editor文件夹下的脚本。
Assembly-CSharp-filepass-vs.csproj
Assembly-CSharp-Editor-filepass-vs.csproj Assembly-CSharp-vs.csproj Assembly-CSharp-Editor-vs.csproj 根据官方的解释,它们的编译顺序如下:
(1)所有在Standard Assets、Pro Standard Assets或者Plugins文件夹中的脚本会产生一个Assembly-CSharp-filepass-vs.csproj文件,并且先编译;
(2)所有在
Standard Assets/Editor、Pro Standard
Assets/Editor或者Plugins/Editor文件夹中的脚本产生Assembly-CSharp-Editor-filepass-vs.csproj工程文件,接着编译;
(3)所有在Assets/Editor外面的,并且不在(1),(2)中的脚本文件(一般这些脚本就是我们自己写的非编辑器扩展脚本)会产生Assembly-CSharp-vs.csproj工程文件,被编译;
(4)所有在Assets/Editor中的脚本产生一个Assembly-CSharp-Editor-vs.csproj工程文件,被编译。
之所以按照这样建立工程并按此顺序编译,也是因为DLL间存在的依赖关系所决定的。好了,到此为止,我们可以很容易地判断出上面举的实例中,脚本的编译顺序(实际上,我已经把顺序写在了脚本的文件名中了)一个Unity3d的工程中,最多可以产生多少个工程文件呢?
4*3*2=24
4个文件 3中编译器 2种平台 1 个工程 IOS平台崩溃的几种情况。
1.在协程中要判断对象是不是为空(list GameObject)在每次调用的时候都学要调用(因 为协程不能保证即使调用如果对象已销毁但是依然使用时会卡死)。
2. Delegate的判断(IOS 尽量使Event)
3. 如果引用静态的static Compent的组件会出现卡死 4. Unity中的OnEnable Start Awake Disable Destory()都回延迟一帧 5. Unity在Ios对反射的支持不完整。
6. Awake 和Start函数执行时机, Awake 函数在这个脚本在场景中加载时就会调用,需要注意的是,Start函数也不是一定立即执行的,它是在该脚本第一次调用Update函数之前调用的,也就是说,如果这个脚本一开始的状态是disable的,那么直到它变成enable状态,在Update函数第一次执行前,才会执行Start函数。
7.Linq TO XML
untiy中配置文件需要注意的点: pc端不区分文件大小写。 Andriod不区分大小写 Ios移动端区分文件大小写。 需要注意文件名称大小写。 资源优化(内存优化):
1.代码中申请的内存,一般是New 或者Instantiate操作 Instantiate中也是调用了New 2.及时设置释放标识符 变量设置为Null 超出变量作用域 Destory()3.及时Gc释放内存 需要注意
Gc时会造成游戏短时间的卡顿,影响游戏体验 需要选择合适的时间Gc 4.尽可能的重用资源(贴图 材质 网格)
5.一般图片资源占用的内存最大,优化效果最明显(降低贴图分辨率,在效果和大小之间找一个平横点)
6.程序中的内存池 对象池 必要时主动释放内存 7.做AssetBundle资源的关系以来打包 动态加载 卸载
8.C#中Struct数据在栈上 Class在堆上 局部数据尽量用Struct 减少Gc的频率 9.按C++ 的思想来管理内存,比如使用的内存池,对象池 手工卸载 主动Gc 注意在内存和帧率之间做好平衡。
10.www 下载时需要注意变量声明和要注意申请的内存堆上的
无用内存
11. Unity资源(加载/更新) 1.Resources
-打包集成到.asset文件里面及引用的资源as后se一个文件里面面可读不可写无
-只能用WWW类下载
StreamingAssets文件夹也是一个只读的文件夹,但是它和Resources有点区别,Resources文件夹下的资源会进行一次压缩,而且也会加密,不使用点特殊办法是拿不到原始资源的。但是StreamingAssets文件夹就不一样了,它下面的所有资源不会被加密,然后是原封不动的打包到发布包中,这样很容易就拿到 里面的文件。所以StreamingAssets适合放一些二进制文件,而Resources更适合放一些GameObject和Object文件。StreamingAssets 只能用过www类来读取。
最后凡是在Hierarchy视图对象引用过的资源文件也会被无条件打包到发布包中。如果有一部分文件可能没有在Resources文件 夹下也没有在StreamingAssets文件夹下,也没有被Hierarchy视图游戏对象引用,那么这类资源是不会被打包到发布包中的。
3.PersistentDataPath无
-清除手机缓存文件会一并清理这里的东西
-随意弄,可作为本地目录让WWW下载、也可以自己用FileInfo乱整
4.WWW.LoadFromCacheOrDownload
Unity常用目录对应的Android && iOS平台地址 IOS:
Application.dataPath
:
Application/xxxxx/xxx.app/Data
:
Application.streamingAssetsPath Application/xxxxx/xxx.app/Data/Raw
Application.persistentDataPath : Application/xxxxx/Documents
Application.temporaryCachePath Application/xxxxx/Library/Caches
Android:
Application.dataPath
:
:
/data/app/xxx.xxx.xxx.apk
:
:
/data/data/xxx.xxx.xxx/files
Application.streamingAssetsPath
jar:file:///data/app/xxx.xxx.xxx.apk/!/assets Application.persistentDataPath
Application.temporaryCachePath : /data/data/xxx.xxx.xxx/cache
Unity的Android和IOS上相关的目录结构 Android:
-assets 游戏内容相关的都在这里了res 图标之类的
-AndroidManifest.xml Android配置文件resources.arsc Java编译后的二进制文件
IOS:
-level0/level1… Scene
-sharedassets0/shaedassets1/… Scene的东西
第三篇:Hamlet --- The unity of controverasal
Hamlet
---The combination of contradiction
As the saying goes, one thousand readers, there are one thousand Hamlets.Others may think he is a soldier, a hero or a thinker.However, in my mind, he is an immature teen-age youth who is the combination of contradictions.Firstly, as a prince, he is an idealist.He lives a luxurious life and is educated by humanism.Without knowing the dark aspects of the society, he is favored by his parents and respected by his people.We can see in the play that he believes the true, the good and the beautiful and he is a real perfectionist, which can also explain why he is so
相关的东西
resources.assets Resources里面的东西-Raw StreamingAssets里面
shocked by the things happen on him and doesn’t know how to deal with it perfectly.Experiencing the death of his father, the usurping the throne of his uncle and the remarriage of his mother, Hamlet’s dream turns into bubbles.He falls in to hell from the heaven and goes on the trip of revenge.The prince has to have common people’s feeling, sadness, hatred, disappointment, hypocrisy and so on.Secondly, he is definitely a great thinker but also an ordinary people who hesitates to practice his thought.He begins consider himself and his people after he listen to his dead Father King’s words.He even says “To be or not to be, this is a question: was bear the slings and arrows of outrageous fortune, or to take arms against a sea of troubles world, through the clearing their struggle, these two kinds of behavior, which is a more noble.” He falls in to deep thought and condemns himself.His father is murdered and the ghost of his father urges him to take the revenge.He doesn’t do anything.He wonders: how a coward or a indecent woman I am.He not only thinks of his own fate, but also considers everyone’s existence.There is no doubt that he is the great man of mind.“Now I clearly have reason, have the determination and have the strength, have a way of can start to do what I have to do, but I still in touted said: 'it needs to do.'But never expressed in action…” is the evidence for his hesitation.When his enemy is praying and he plans to kill him, he should consider that killing a man who is praying will allows him to go to haven, which makes him lose the chance to kill his uncle and commit the tragedy.Thirdly, he believes the true, the good and the beautiful, but he doesn’t believe his friends and his lover.It is his behavior that makes Ophelia dead.He pretends to be mad and kill her father by accident.Ophelia can’t bear the reality and goes to the place where she dates with her
prince madly… His ignorance of others’ care and arrogance kill other four innocent people.Last but not least, he is the combination of the goodness and evil.On the one hand, he is pious to his parents, his girlfriend and his friends in a way.He bears the responsibility to take revenge on his uncle and to save the ordinary people.He tries his best to satisfy everyone but he also hurts many people.He takes his revenge on his uncle by hook or by crook.He kills Rosencrantz and Guildenstern.He is cold when he kills Polonius and heartless to Ophelia.Not merely does he lead to his own tragedy, but also leads to the whole play’s tragedy.All in all, the dejected prince wants to take revenge on his uncle, but he can’t find a proper way and his ability is not equal to his ambition.He is an idealist who has to face the cruel reality.As a great think who believes the true, the good and the beautiful, he hesitates to take the action and doubt everyone around him.He is the saver and also the destroyer.He is a giant and also an ordinary people.He is a noble prince and also an immature teen-age youth. 第四篇:win7系统优化
如何提高win7运行速度 优化系统服务篇
Windows7现在已经非常普及了,相比之前的Vista系统,Windows7的速度真的是很快了,但你是否担心自己的Windows7系统就像新安装其他Windows系统一样仅仅是刚开
始运行飞快,随着时间的推移就会导致效率越来越低呢?想要保持自己的Windows7系统一直运行如飞并非是难事,下面将两个有效的优化小方法告诉你,让你保持Windows7的高速度运行。
1.系统服务项优化
点击开始>运行菜单>在开始运行框中输入“Services.msc ”回车进入系统服务设置,也可以直接在开始搜索框中输入“服务”两个汉字,回车即可进入;
你知道吗,在Windows7服务项里面有很多服务项目,有很多使我们平时用不到的,或者根本接触不到的服务,根据自己的需要来禁用某些服务,关闭后可以减轻系统一定的负担,可以加速系统
运行。不清楚哪些服务项可以关闭的可以查看一下后面的介绍,或者百度解决。
2.磁盘清理“windows.old”等文件
很多朋友在安装Windows7之前并没有对系统盘进行彻底的格式化,这种情况下安装好的Windows7会在系统盘生成一个Windows.old文件,这是一个备份之前系统中重要文件的文件夹,但是这
个文件夹占用几G甚至几十G的磁盘空间。为了能给系统盘瘦身,让系统更加流畅,我们可以删除这个文件夹。
①通过单击「开始」按钮,打开“磁盘清理”。在搜索框中,键入磁盘清理,然后在结果列表中单击“磁盘清理”。
②如果系统提示您选择驱动器,请单击安装 Windows 的驱动器,然后单击“确定”。③在“磁盘清理”对话框的“磁盘清理”选项卡上,单击“清理系统文件”。
④如果系统再次提示您选择驱动器,请单击安装 Windows 的驱动器,然后单击“确定”。⑤选中“以前的 Windows 安装”复选框,以及与要删除的文件对应的任何其他复选框,然后单击“确定”。
⑥在出现的消息中,单击“删除文件”。
以上两个方法虽然简单,但对于优化Windows7系统速度保证其一直流畅运行确实有效,大家可以根据自己使用Windows7系统中的实际情况有选择的进行优化,总之能够让自己的windows7系统
使用起来最顺手,那就是最佳状态,有兴趣的朋友不妨参考下。 第五篇:系统优化设置
◆
一、系统优化设置 ◆
1、系统常规优化
1)关闭系统属性中的特效,这可是简单有效的提速良方。点击开始→控制面板→系统→高级→性能→设置→在视觉效果中,设置为调整为最佳性能→确定即可。
2)“我的电脑”-“属性”-“高级”-“错误报告”-选择“禁用错误汇报”。
3)再点“启动和故障恢复”-“设置”,将“将事件写入系统日志”、“发送管理警报”、“自动重新启动”这三项的勾去掉。再将下面的“写入调试信息”设置为“无”。
4)“我的电脑”-“属性”-“高级”-“性能”-“设置”-“高级”,将虚拟内存值设为物理内存的2.5倍,将初始大小和最大值值设为一样(比如你的内存是256M,你可以设置为640M),并将虚拟内存设置在系统盘外(注意:当移动好后要将原来的文件删除)。
5)将“我的文档”文件夹转到其他分区:右击“我的文档”-“属性“-“移动”,设置到系统盘以外的分区即可。
6)将IE临时文件夹转到其他分区:打开IE浏览器,选择“工具“-“internet选项”-“常规”-“设置”-“移动文件夹”,设置设置到系统盘以外的分区即可。
◆
2、加速XP的开、关机
1)首先,打开“系统属性”点“高级”选项卡,在“启动和故障恢复”区里打开“设置”,去掉“系统启动”区里的两个√,如果是多系统的用户保留“显示操作系统列表的时间”的√。再点“编辑”确定启动项的附加属性为/fastdetect而不要改为/nodetect,先不要加/noguiboot属性,因为后面还要用到guiboot。
2)接下来这一步很关键,在“系统属性”里打开“硬件”选项卡,打开“设备管理器”,展开“IDEATA/ATAPI控制器”,双击打开“次要IDE通道”属性,点“高级设置”选项卡,把设备1和2的传送模式改为“DMA(若可用)”,设备类型如果可以选择“无”就选为“无”,点确定完成设置。同样的方法设置“主要IDE通道”。
3)设置预读改善开机速度,打开注册表,找到
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerMemory ManagementPrefetchParameters,右边窗口将EnablePrefetcher的数值更改为1(0-禁用预读,1-预读应用程序,2-系统启动预读,3-前两者皆预读)。电脑是 PIII800MHz以上的可以尝试将数值更改为4或5。
4)顺便把关机也加速一下吧。打开注册表(开始-运行-regedit),单击“我的电脑”打开“编辑”菜单的“查找”,输入AutoEndTasks,点“查找下一个”。双击打开找到的结果修改“数值数据”为1(此项是让系统自动关闭停止响应的程序)。然后在AutoEndTasks的下面找到HungAppTimeout(将其“数值数据”设为2000或者更小,推荐设为200),再找到WaitToKillAppTimeout(将其“数值数据”设为2000或者更小,推荐设为1000)。在这里顺便也把菜单延迟的时间修改一下,在AutoEndTasks的下面找到MenuShowDelay,数值是以毫秒为单位,如果想去掉菜单延迟就设为0。修改后点“编辑”菜单,打开“查找下一个”(快捷键F3),继续查找,把找到的结果都安照上一步的方法修改(注意:数值要对应相同)。
5)用上面的方法找到WaitToKillServiceTimeout并设置数值与WaitToKillAppTimeout相同。
6)享受了极速重启的乐趣后我们再进一步加速一下启动的速度,打开“系统属性”-“高级”-“启动和故障恢复”设置,打开“系统启动”区的编辑,在fastdetect的后面加上/noguiboot,这样在启动的时候就不会再显示滚动条。如果你非常喜欢这个滚动条的显示这一步就不用做了。
7)MsConfig。选择“运行”-“msconfig”。我们要动手脚的是“启动”选项卡,点击它,这个选项卡中显示了Windows启动时运行的所有程序。这里没有一个程序对Windows来说是生死悠关的,所以放心大胆地把不要的去掉。
◆
3、减少开机磁盘扫描等待时间
选择“开始→运行”,在运行对话框中键入“chkntfs /t:0”,即可将磁盘扫描等待时间设置为0;如果要在计算机启动时忽略扫描某个分区,比如C盘,可以输入“chkntfs/x
c:”命令;如果要恢复对C盘的扫描,可使用“chkntfs/d c:”命令,即可还原所有chkntfs默认设置,除了自动文件检查的倒计时之外。
◆
4、关掉调试器Dr.Watson
运行drwtsn32,把除了“转储全部线程上下文”之外的全都去掉。否则一旦有程序出错,硬盘会响很久,而且会占用很多空间。如果你以前遇到过这种情况,请查找user.dmp文件并删掉,可能会省掉几十M的空间。这是出错程序的现场,对我们没用。然后打开注册表,找到
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows
NTCurrentVersionAeDebug子键分支,双击在它下面的Auto键值名称,将其“数值数据”改为0,最后按F5刷新使设置生效,这样就彻底来取消它的运行了。另外蓝屏时出现的memory.dmp也可删掉。在“我的电脑→属性→高级→设置→写入调试信息→选择无”。
◆
5、关闭“系统还原”
鼠标右健单击桌面上的“我的电脑”,选择“属性”,找到“系统还原”去掉,这样可以节省好多空间。
◆
6、关闭“休眠支持”
休眠功能会占用不少的硬盘空间,如果使用得少不妨将其关闭。打开“控制面板”-“电源选项”-“休眠”选项卡,取消“启用休眠”复选框。
◆
7、取消对ZIP压缩文件的支持
点击开始→运行,敲入:“regsvr32/u zipfldr.dll”双引号中间的,然后回车确认即可,成功的标志是出现个提示窗口,内容大致为:
zipfldr.dll中的Dll UnrgisterServer成功。
◆
8、不加载DLL文件(卸载无用的动态链接) 找
到
注
册
表
如
下
位
置
:
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorer,接下来建立一个名为AlwaysUnloadDLL,值为1的双字节值。如果想要去除这项优化,只需把该键值设为0(也可以干脆把键删掉)。
◆
9、关闭错误报告
在“系统属性”对话框中选择“高级”选项卡,单击“错误报告”按钮,在弹出的“错误汇报”对话框中,选择“禁用错误汇报”单选项,最后单击“确定”即可。
◆
10、加快窗口显示速度
打开注册表编辑器,找到HKEY_CURRENT_USERControl PanelDesktopWindowMetrics,右边窗口找到MinAniMate键值,把它改为0。
◆
11、关闭自动更新
“我的电脑”右键,选择“属性”-“自动更新”-“关闭自动更新,我将手动更新计算机”,单击“确定”。
◆
12、加快开始菜单的显示
打开注册表编辑器,找“HKEY_CURRENT_USERControl PanelDesktopMenuShowDelay”主键,适当调小该键值,最低可设为“0”。如果此方法无效,请从“控制面板”-“显示属性”-“显示效果”-“高级”,将“show
menushadow”项的选择取消,便可加快开始菜单的显示。 ◆
13、关闭磁盘索引
打开我的电脑-右击驱动器-“属性”-取消“使用索引以便快速查找文件”。
◆
14、加快自动刷新率 运
行
注
册
表
编
辑
器
,
找
HKEY_LOCAL_MACHINEystemCurrentControlSetControlUpdate,将Dword[UpdateMode]的数值数据更改为[0]。
◆
15、关闭自动重新启动功能
WindowsXP遇到严重问题时会突然重新开机,可从注册表将此功能取消。打开注册表编辑器,找到“HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlCrashControl”将AutoReboot键的Dword值更改为0。
◆
16、删除强加的附件
用记事本修改winntinfsysoc.inf,用查找/替换功能,在查找框中输入“,hide”(一个英文逗号紧跟hide),将“替换为”框设为空,并全部替换,这样,就把所有的,hide都去掉了;保存退出;运行“添加-删除程序”,就会看见“添加/删除Windows组件”中多出了好几个选项,这样你可以删除些没有用的附件。
◆
17、启动时禁止自动调用“WindowsMessenger” 运
行
注
册
表
编
辑
器
,
找
到
并
删
除
“HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunMSMSGS”此键来实现。
◆
18、每次启动时保持桌面设置不变 打
开
注
册
表
编
辑
器
,
找
到
HKEY_CURRENT_USERSSoftwareMicrosoftWindowsCurrentVersi
on
PolicesExplorer子键分支,在它的下面找到NoSaveSettings,将其键值改为“0”,或者直接删除该键值项。
◆
19、在启动电脑时运行Defrag(磁盘打扫)程序 打
开
注
册
表
编
辑
器
,
找
到
HKEY_LOCAL_MACHINESOFTWAREMicrosoftDfrgBootOptimizeFunction键,将键值Enable设定为Y等于开启,而设定为N等于关闭。
◆20、清除预读文件
定期删除该文件夹内的所有文件,在安装盘的Windowsprefetch文件夹里。
◆
21、取消磁盘容量警告 打开注册表编辑器后,找到HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesExplorer键,双击NoLowDiskSpaceChecks键并修改其数值为1然后“确定”即可。如果此键值不存在,则新建一个名为NoLowDiskSpaceChecks的DWORD值,并将其数值设为1然后“确定”即可。
◆
22、在关机时清空页面文件(清空虚拟内存)
打开“控制面板”,点击“管理工具”→“本地安全策略”→“本地策略”→“安全选项”,双击其中“关机:清理虚拟内存页面文件”一项,点击弹出选单中的“已启用”选项,单击“确定”即可。
◆
二、硬件优化设置 ◆
1、关掉不用的设备
在设备管理器中,将PCMCIA卡、调制解调器、红外线设备、打
印机端口(LPT1)或者串口(COM1)等不常用的设备停用,在要停用设备属性对话框中的“常规”选项卡中选择“不要使用这个设备(停用)”。当需要使用这些设备时再从设备管理器中启用它们。
◆
2、内存性能优化
WindowsXP中有几个选项可以优化内存性能,它们全都在注册表
下
面
位
置
:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerMemoryManagement
1)禁用内存页面调度(PagingExecutive)
XP会把内存中的片断写入硬盘,我们可以阻止它这样做,让数据保留在内存中,从而提升系统性能。256M以上内存才使用这个设置。把“DisablePagingExecutive”的值从0改为1就可以禁止内存页面调度了。
2)提升系统缓存
必须有256M以上的内存,才激活它。把LargeSystemCache键值从0改为1,一般来说,这项优化会使系统性能得到相当的提升,但也有可能会使某些应用程序性能降低。
3)输入/输出性能
内存大于256M才更改这里的值,这个优化只对server(服务器)用户才有实在意义,它能够提升系统进行大容量文件传输时的性能。建一个DWORD(双字节值)键值,命名为IOPageLockLimit,数值设8M-16M字节之间性能最好,具体设什么值,可试试哪个值可获得最佳性能。这个值是用字节来计算的,比如你要分配12M,就是12×1024×1024,也就是12582912。
◆
3、启动硬盘/光驱DMA模式
“系统属性”-“硬件”-“设备管理器”,在设备列表中选择“IDEATA/ATAPI控制器”,双击“主要IDE通道”或“次要IDE通道”,在其属性对话框的“高级设置”选项卡中检查DMA模式是否已
启动,一般来说如果设备支持,系统就会自动打开DMA功能,如果没有打开可将“传输模式”设为“DMA(若可用)”(在BIOS里也应该要先设为支持DMA)。
◆
4、关闭自动播放功能
运行“组策略”程序,在组策略窗口左边栏中打开“计算机配置”,选择“管理模板”下的“系统”,然后在右边的配置栏中找到“关闭自动播放”并双击它,会弹出“关闭自动播放属性”对话框,在其中“设置”选项卡中选择“已启用”,“关闭自动播放”下拉列表中选择“所有驱动器”。
◆
5、设置二级缓存容量
WindowsXP有时无法自动检测处理器的二级缓存容量,需要我们手动设置。运行注册表编辑器,找到HKCU_LOCAL_MACHINESYSTEMCurrentControlSetControlSessionManagerMemoryManagement
,
选
择
Dword
值
SecondLevelDataCache(如果没有就新建这个值),修改这个值(填时使用10进制)为你的CPU的二级缓存的大小,比如你的CPU的二级缓存是256KB,就修改Dword值SecondLevelDataCache为10进制的256即可。二级缓存大小介绍AMD系列Duron64KBK6-3ThunderbirdAthlonXP256KBK6-2Athlon512KB;IntelCeleronACeleron2128KBP2MobileP3E(EB)P4Willamette
256KBP2P3(katmai)P4(Northwood)512KB。使用Winxp的请务必检
查
一
下
:
打
开
注
册
表
,
找
到
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows
NTCurrentVersion将“RegDone”的数值,由0改成1才算完成,这个操作很重要,很多奇怪的小毛病因此而解决.◆
6、取消微软的验证提示
安装驱动程式时往往会弹出窗口说程序没有经过微软的验证,我们可以在控制面板—系统—硬件—设备管理员—驱动程序签名,取消。
系列
◆
7、为IRQ中断请求排优先次序
计算机的每一个主要部件都设了个IRQ中断号。这里就是要通过修改每个IRQ请求的优先次序达到优化目的。这里主要的优化对象是系统CMOS实时钟,它通过主板来提升性能。首先,要确定你想要哪个组件获得更高的性能,然后找到这个硬件正在使用的IRQ中断号。怎么找呢?打开控制面板里的系统属性,选中“硬件”选项卡,然后点击“设备管理器”按钮。右键点击要查IRQ号的组件,选择“属性”,然后点击“资源”选项卡,这里可以看到设备正在使用的IRQ中断号(如果没有IRQ中断号,选择另一个设备)。把中断号记下来,然后运行注册表编辑器Regedit,找到注册表中的HKEY_LOCAL_MACHINESystemCurrentControlSetControlPriorityControl位置。我们要在这里建立一个名为IRQ#Priority(其中“#”是具体的IRQ中断号)的DWORD双字节值,然后把它的值设为1。譬如说,我的系统CMOS实时钟的IRQ中断号是8,我要建立的键名就是IRQ8Priority。重新启动计算机之后,就会发现刚优化过的组件性能有所提高。强烈建议用这个方法优化系统CMOS实时钟,因为它能改善整块主板的性能。当然也可以把多个IRQ中断号优先级提高,但这样做的效果没那么好,而且有可能造成系统不稳定。要把这个优化设置撤消的话,只要把刚才建立的注册表键值删掉就OK了。〈
◆
三、网络优化设置 ◆
1、优化网上邻居
WindowsXP使用网上邻居时,首先会搜索自己的共享目录和可作为网络共享的打印机以及计划任务中和网络相关的计划任务,然后才显示出来,这样会直接影响计算机的运行速度,如果不必要的话,应将其删除。在注册表编辑器中找到HKEY_LOCAL_MACHINEsofewareMicrosoftWindowsCurrent VersionExplorerRemoteComputerNameSpace,删除其下的
{2227A280-3AEA-1069-A2DE08002B30309D}(打印机)和{D6277990-4C6A-11CF-8D87-00AA0060F5BF}(计划任务)。
◆
2、解决WinXP运行时停顿问题
开始-网络连接-本地连接-选择属性-选择“Internet协议(TCP/IP)”属性,改IP地址:192.168.0.1
子网掩码:255.255.255.0。 ◆
3、让XP自动连网
打开拨号连接属性,把“提示名称、密码、凭证等”的勾去掉,然后把该拨号放到“启动”即完成。
◆
4、释放QoSPacket占用的20%网络带宽
打开“组策略”窗口,在左边栏中展开“计算机配置→管理模板→网络→QoS数据包调度程序”,右边窗口双击“限制可保留带宽”,在其属性对话框中的“设置”选项卡中将“限制可保留带宽”设置为“已启用”,然后在下方“带宽限制”栏将“带宽限制”设置为0就行了。
◆
5、优化NTFS文件系统
取消更新最后一次磁盘访问,运行“regedit”在HKEY_LOCAL_MACHINESYSTEMCurrentContolSetControlFilesystem中,加DWORD,数值为1。
◆
6、优化防火墙
1)启用或禁用Internet连接防火墙,打开“网络连接”,右击要保护的连接,然后在属性框中选“高级”-“设置”-“启用”;
2)启用或禁用安全日志记录选项,右击启用防火墙的连接,在其属性框中选“高级”-“设置”-“高级”-“安全日志记录设置”,把两项勾去掉即可。
◆7.提高10/100M网卡传输速率
右键网卡所用的连接,打开“属性”对话框,选择所用网卡“配置”,“高级”栏中选择“LinkSpeed/Duplex
Mode”,紧接着在“设置值”栏中将“AutoMode”更改为“10Half
Mode”。这样,手工将10/100M自适应网卡的属性强制为10M半双工模式,使网卡之间不进行自动协商,让网卡之间在传输数据时始终以10Mbps的速度进行,大大提高了网络之间的传输效率。此设置只对部分网卡有效。
◆
8、让IE快速启动并支持多线程下载
1)快速启动:右击任务栏上InternetExplorer图标,在“目标”后面加上“-nohome”参数(加参数后如下:“C:Program
FilesInternetExplorerIEXPLORE.EXE”-nohome),确定即可。2)支持多线程下载:运行注册表编辑器,在“HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionInternet
Settings”
下
新
建
双
字
节
值
项
“MaxConnectionsPerServer”,它决定了最大同步下载的连线数目,一般设定为5~8个连线数目比较好。
◆
四、系统减肥设置 ◆
1、删除系统文件备份sfc.exe/purgecache(一般用户是不怎么用的)。
◆
2、删除驱动备份drivercachei386目录下的Driver.cab文件(73M)。
◆
3、取消系统还原(建议安装xp的盘使用,其它盘都别用,通过系统清理程序定期删除一些比较早的还原点)。
◆
4、删除帮助文件(使用中文汉化包的文件大小为92兆,刚开始使用xp的同志最好别删)。
◆
5、删掉WINDOWSsystem32dllcache下文件(这是备用的dll文件,只要你拷贝了安装文件,完全可以这样做)。
◆
6、把我的文档、IE的临时文件夹都转到其他分区。(同时对系统的速度和硬盘都有好处,如果使用的是双系统,最好把两个系统的IE临时文件都放在同一个文件夹,这样既加快速度有节省空间)
◆
7、把虚拟内存也转到其他盘(就是将这些东西和平时临时下载文件放在一个不大的分区里,这样也方便整理硬盘)。
◆
8、将应用软件装在其他盘(这对重装系统也有好处,可以省很多事)。
◆
9、删除windowsime下不用的输入法(日文、韩文、繁体中文输入法,到底哪个是哪个自己研究一下吧)。
◆
10、如用NTFS格式装XP,本身就节省空间。 ◆
五、其他优化设置 ◆
1、修改WindowsXP的登录背景图案
打开注册表编辑器,找到HKEY_USERS.DEFAULTControl PanelDesktop子键分支,双击wallpaper,键入你选择好的图片的路径,点击“确定”,然后找到Tilewallpaper,双击它输入键值“1”。
◆
2、修改登录时的背景色
打开注册表编辑器,找到HKEY_USERS.DEFAULTControl PanelColors子键分支,双击Background键值名,出现“编辑字符串”对话框,在“数值数据”文本框中输入代表颜色的键值(比如黑色的RGB值为000,白色的RGB值为255 255255,系统默认值是58110165),点击“确定”按钮即可。
◆
3、设置启动信息或增加警告信息 打
开
注
册
表
编
辑
器
,
找
到
HKEY_LOCAL_MACHINE_SOFTWAREMicrosoftWindows
NTCurrentVersionWinlogon子键分支,双击在它下面的LegalNoticeCaption健值名称,打开“编辑字符串”窗口,在“数值数据”文本框中输入信息对话框的标题,比如“你好,欢迎使用本机器”,然后双击LegalNoticeText,在随后出现的“编辑字符串”窗口中输入想要显示的警告信息,比如“请不要随意修改本级的设置,谢谢!”,单击“确定”按钮。
◆
4、定制按钮文字颜色
打开注册表编辑器,找到HKEY_CURRENT_USERControl PanelColors子键分支,双击Bottontext,将其键值改为你想要颜色的值,如红色25500,单击“确定”按钮,重启即可看到效果了,此时按钮上的文字颜色将变成红色,此外你还可以修改按钮的宽度和高度及背景等参数。
◆
5、修改鼠标右键菜单
这里以在鼠标右键菜单上添加“用DOS窗口在这里浏览”为例。1)打开注册表编辑器,找到HKEY_CLASSES_ROOTDirectoryshell,然后选中它,点击鼠标右键,新建一个主键,取名为“DOS”,然后选中新建的主键,在右边双击默认字符串值,在弹出的对话框中输入“用DOS窗口在这里浏览”,然后选中新建的主键,再建立一个主键,
取名为“command”,选中“command”主键,修改默认值为“cmd.exe/k“cd%L””即可。
◆
6、修改系统ID号(ID号在WinXP里面很重要)
在系统属性里面的常规标签下我们可以看到一串数字就是ID号。正版的WinXP每一套的ID号是不相同的,修改它要打开注册表编辑器,ID号主要放在这几个键值下:
HKEY_LOCAL_MACHINESOFTWAREMicrosoftInternet ExplorerRegistration的字符串ProductId
HKEY_LOCAL_MACHINESOFTWAREMicrosoftUserinformation的字符串产品标识
/☆如果没有使用向微软注册的话,这里不会出现☆/
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersion的字符串ProductId
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersion的字符串ProductId
以上4个地方就是在注册表中存放ID的键值,要同时修改,修改完以后再看系统属性里面的常规标签,以免修改失败,导致ID还原。
◆
7、修改系统版本号
在关于Windows里面有一个内部版本号(正式版的是:2600.xpclient.010817-1148),这个版本号也是存放在注册表中的,位
置
在
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsNTCurrentVersion,它用一个字符串来记录,修改这个名字叫做BuildLab的字符串就可以修改你的XP的版本号
WinXP下的8步快速设置无线网络技巧方法
1、在Windows XP系统桌面上,依次单击“开始”/“设置”/“控制面板”命令,打开控制面板窗口,在其中双击网络图标,打开“网络连接”界面;
2、在这个界面中,用鼠标右键单击“无线网络连接”图标,从随后打开的快捷菜单中,执行“属性”命令,这样系统就会自动显示“无线网络连接属性”设置对话框;
3、在这里,大家可以用鼠标选中“无线网络配置”标签,并在随后弹出的标签页面中,用鼠标选中“用Windows来配置我的无线网络配置”复选项,这样就能启用自动无线网络配置功能;
4、接着用鼠标单击这里的“高级”按钮,打开一个“高级”设置对话框,并在这个对话框中选中“仅计算机到计算机(特定)”选项,从而实现计算机与计算机之间的相互连接;PC235推荐文章
5、要是大家希望能直接连接到计算机中,又希望保留连接到接入点的话,就可以用鼠标选择“任何可用的网络(首选访问点)”选项;
6、在首选访问点无线网络时,要是发现有可用网络的话,系统一般会首先尝试连接到访问点无线网络;要是当前系统中的访问点网络不能用的话,那么系统就会自动尝试连接到对等无线网络;
7、比方说,要是工作时在访问点无线网络中使用笔记本电脑,再将笔记本电脑移动到另外一个计算机到计算机网络中使用时,那么自动无线网络配置功能将会自动根据需要,来更改无线网络参数设置,大家可以在不需要作任何修改的情况下就能直接连接到家庭网络;
8、完成上面的设置后,再用鼠标依次单击“关闭”按钮退出设置界面,并单击“确定”按钮完成无线局域网的无线连接设置工作,要是参数设置正确的话,系统会自动出现无线网络连接已经成功的提示。
因篇幅问题不能全部显示,请点此查看更多更全内容