2008-08-27

XML基础知识概要

  终于到传说中我因为在高中的时候没有学习而最后悔的XML了。本文假定读者熟悉HTML
  XML(eXtensible Mark-up Language),类似与HTML又不同,关键在于它可以自定义自己的标记符和属性,所以是extensible。
  与HTML不同的是,XML一般用于存储数据、处理数据和交换数据。

基本规则:
  XML采用层次数据结构规则。我们总能让XML文件与一个树型数据结构互相转换。
  与HTML类似,XML的标记也是成对出现的,嵌套时同样对称存在。标记也允许若干参数与属性。注释和HTML一样都是<!-- comments -->.

  在xml中所有的参数的值必须使用单引号或者双引号包围。

  只有严格符合XML标准的文档才是格式良好的xml文档。
  注意,XML大小写敏感。
  
文档类型定义DTD:
  为了对数据的合法性进行验证,XML文件一般会有一个文档类型定义(Document Type Definition),指定元素应该以怎样的规则保存。他定义了某个标志符是否存在,存在的顺序和嵌套法则。
  XML的一个重要的特征是名字空间,学过C++和Java都很清楚这个概念。XML支持名字空间,因而定义的标记符不会和其他人的类似名字的标记符冲突。要在DTD中定义名字空间只需要在元素的标记符中增加一个xmlns属性。

一个经典的DTD演示了XML的强大功能:

<!-- DTD for Shakespeare J. Bosak 1994.03.01, 1997.01.02 -->

<!-- Revised for case sensitivity 1997.09.10 -->

<!-- Revised for XML 1.0 conformity 1998.01.27 (thanks to Eve Maler) -->



<!ENTITY amp "&">

<!ELEMENT PLAY (TITLE, FM, PERSONAE, SCNDESCR, PLAYSUBT, INDUCT?,

PROLOGUE?, ACT+, EPILOGUE?)>

<!ELEMENT TITLE (#PCDATA)>

<!ELEMENT FM (P+)>

<!ELEMENT P (#PCDATA)>

<!ELEMENT PERSONAE (TITLE, (PERSONA | PGROUP)+)>

<!ELEMENT PGROUP (PERSONA+, GRPDESCR)>

<!ELEMENT PERSONA (#PCDATA)>

<!ELEMENT GRPDESCR (#PCDATA)>

<!ELEMENT SCNDESCR (#PCDATA)>

<!ELEMENT PLAYSUBT (#PCDATA)>

<!ELEMENT INDUCT (TITLE, SUBTITLE*, (SCENE+|(SPEECH|STAGEDIR|SUBHEAD)+))>

<!ELEMENT ACT (TITLE, SUBTITLE*, PROLOGUE?, SCENE+, EPILOGUE?)>

<!ELEMENT SCENE (TITLE, SUBTITLE*, (SPEECH | STAGEDIR | SUBHEAD)+)>

<!ELEMENT PROLOGUE (TITLE, SUBTITLE*, (STAGEDIR | SPEECH)+)>

<!ELEMENT EPILOGUE (TITLE, SUBTITLE*, (STAGEDIR | SPEECH)+)>

<!ELEMENT SPEECH (SPEAKER+, (LINE | STAGEDIR | SUBHEAD)+)>

<!ELEMENT SPEAKER (#PCDATA)>

<!ELEMENT LINE (#PCDATA | STAGEDIR)*>

<!ELEMENT STAGEDIR (#PCDATA)>

<!ELEMENT SUBTITLE (#PCDATA)>

<!ELEMENT SUBHEAD (#PCDATA)>

这份文档是XML的创始人Jon Bosak写的,你可以从http://saxon.sourceforge.net/saxon6.5.5/samples.html#shakespeare这里找到


XML文档:

  每个XML文档都有一个逻辑和物理结构。

  物理上,文档是由称为Entities的单元组成,实体都有内容,并且都是实体的名字标识的。尸体可以是各种可以存储的东西,文档开始于根或者文档实体。

  格式良好的XML文档在逻辑上有一个层次树结构,这个树的根节点就是文档实体,文档实体没有名字,只是用来表示根,XML的文档的根元素成为文档元素,它和外部出现的处理指令、注释等作为文档实体的子节点,根元素和它的内部子元素也是一颗树。

  简而言之,XML文档就是一种树型的逻辑结构。


  实体可以包含parsed 和unparsed数据,前者是由一些表示数据与标记的字符组成,parsed entity内容被称为它的替换文本,作为文档整体的一部分,在XML处理程序分析XML文档时,凡是出现引用parsed entity的地方都会被这个实体的内容替换。unparsed entity是一种资源,有一个相关联的用名字标识的notation。前者用实体引用的方法通过名字调用,后者通过entity属性中给出的名字来调用。

  逻辑上,一个XML由声明、元素、注释、字符引用和处理指令组成,所有这些东西都是通过标记来表明,XML标记包括开始标签,结束标签,空元素标签,实体引用,字符引用,注释,CDATA段定界符、文档类型声明,处理指令,XML声明,文本声明以及在文档实体顶层的空白和普通字符组成。


---------------------------------------------------------------------
---------------------------------------------------------------------

XML文档的解析

  通常程序获得xml文档都是通过xml解析器,其模型一般都是程序通过xml解析器提供的api来调用xml解析器。
  所有的解析器都对DOM(Document Object Model)和SAX(Simple API for XML)这两套api提供支持。
  在Java中,有一个叫做JAXP(Java API for XML Processing)的API它只是提供给java程序员一种标准化的形式的XML编程方式。开发者只需要使用JAXP编程,而无须关心底层的解析器。

  DOM的核心概念是节点,使用DOM分析XML文档,它会把XML文档映射成一个对象,这个对象叫做节点。在内存中,这些节点形成一颗文档树。通过操作这个树型对象来获取内容。

  SAX的处理机制有些不同,它是基于事件处理的API,它包括解析器和事件处理器,前者负责读取XML文档,并向事件处理器发送事件,后者负责对事件做出响应,进行处理,这一点我觉得和java的监听器的架构有点类似。

2008-08-24

JAVA绘图板中绘制图形的解决方法

  如果你和我一样是一个Java新手的话,如果你也正在编写一个能够绘制一些基本图形的绘图板程序的话。那么,你一定会面临的一个问题就是,包括鼠标的拖拽时的问题在内的图形绘制了。
  如果之使用默认的repaint等方法,一定会遇到的问题就是,即使你实现了鼠标拖拽的时候图形的动态绘制。但是无法解决之前绘制的图形的消失问题。
  原来画好一条直线,拖拽着画下一条的时候前面那条就会消失掉。当然,一种解决方法就是重载paintComponent方法。让每次repaint的时候都把列表中所有的图形全部重画。不过这不是一个好方法。因为在鼠标拖拽的时候。至少要重复10多次repaint的动作。如果原来的组建数量多了。那么计算量就是成几何级数上升的。所以我们不能采用这个方法。
  这个方法不通之后,我查阅了不少资料,看了几个程序。最后得到的思路就是。结合双缓冲。
  我重载了监听器的3个方法。分别是压下鼠标。拖拽鼠标(就是压下为松开并移动mouseDragged)。释放鼠标。
  压下鼠标时,向图形定义类的实例传送一个坐标值。拖拽鼠标时实时更新点坐标,但是不传递这个点坐标,而是利用它的值不断重绘图形。当放开鼠标时向图形定义类的实例传送第二个坐标。这里就是关键了。传递完坐标之后先保存这个实例,然后向前面建立的用于双缓冲的图形绘制所有已保存的实例。
  这里看似和普通过程没有区别,不过关键在那个双缓冲用的图形。在我重载的paintComponent方法中,我是先刷新一次整个页面。也就是清空了,之后绘制那个双缓冲的图形,最后绘制用户正在画的图形。
  这样一来,在拖拽过程中实际只绘制了两个对象,一个是双缓冲的图形,另外一个就是用户正在绘制的图形,而在鼠标松开的那个阶段我清空了双缓存的图形,完全重新绘制它。这样就保证了添加移动撤销等动作能够正常执行。

/*******************************************
*原创文章,转载请注明出处
*******************************************/

2008-08-23

学校的锐捷认证在Linux下可行性的进一步测试

  上次研究ubuntu 8.04 的64位下运行锐捷的方法就是为了在学校的宿舍实现linux下的锐捷认证。
  上次虽然完成了程序的运行,但是最终还是没有能够成功的认证,究其原因,因为我们学校的锐捷认证是通过绑定mac地址+dhcp实现的,而锐捷那个可悲的客户端dhcp分配本身就似乎有问题,去官方论坛问了好久也没人回帖。无奈之下又试了好几个网上能找到的开源版,不过最终都没用,最终,采取了强制的静态ip的方法。因为这种分配机制ip不是一直都是随机分配的,有一个租用期限,这个期限之内理论上强制用同一个ip是没问题的。根据网上搜集到的资料确实有人用这种方法成功通过认证。可惜的是用这种方法仍然无法认证。回复的错误信息是“不允许的客户端”。
  之后因为舍友奇怪的错误,我弄了个网上的锐捷客户端3.22-1113,居然也同样不能认证,提示的也是同一个错误"不允许的客户端",要知道我们学校使用的客户端版本号就是3.22-1113(当然程序显然是我们学校专用的),会出这种错,推测可能是学校专用版发送的数据包里有特别的识别信息。所以其他的客户端显然是不行用的。而我也很久没有抓过包了,各种知识也生疏了,要从这方面入手恐怕很困难,于是只能想想别的方法。

  不久,逆转的机会出现了。我在考虑一种假设:linux主机,通过kvm运行windows,在windows中认证,然后linux主机通过这台认证过了的windows虚拟机上网。
  基本原理虽然简单,但是其中可能遇到的问题相当的多,为此,我们需要做黑箱测试(因为我在计算机方面比较喜欢动手而不是纯粹逻辑思考)。为了便于调试,我选择先在windows环境下。


平台:
主机:windows xp sp2
虚拟化软件:VMware 6.5
客户机:windows server 2003 standard
锐捷认证成功后,我的客户机的网络设置是:ip:10.5.27.108 ,mask 255.255.254.0 Gateway:10.5.26.1,DNS:210.XX.XX.XX


  我们第一个要测试的项目是,在虚拟化的环境下是否能在虚拟机中进行锐捷认证。所以我选择了桥接网络模式,结果证实是可以的,我现在的这篇博文就是在虚拟机下远程登录我的另外一台机器写的。因此也证实连接是稳定可靠的。
  确认能够认证了以后,我就开始考虑它的网络模型了,因为我知道在存在多块网卡,或者开启代理服务器的情况下,锐捷认证是会code 4断开的。所以最理想的情况就是在这种桥接模式下。客户机开启路由服务,主机通过客户机连接。
  我查阅了很多资料。开启了windows 2003的路由与远程访问中的路由服务,也确实使用了lan路由功能,查阅了ip路由表,确认了设置是正常的。但是,无论如何,主机都无法连接至客户机之外的任何主机。甚至连真正的网关都ping不通。去年学的ccna的详细知识中关键的部分忘了不少。暂时是没办法搞定这种情况。于是只能先停手,等待下次ccna学好再风云再起。。。
  不过话说回来,这个时候我也在怀疑是否是虚拟机提供的虚拟网络模式不能允许这种连接方法。因此,为了证明虚拟机可以允许我的这种连接的想法,我打算采取不稳定,但是更加容易的一种方法。
  
  传统的虚拟机应用都是主机能够上网,为了让虚拟机上网一般VMware提供的两种方法。一个桥接,一个nat。但是这次因为我们的需求,所以要让它反过来。不过由于VMware设置nat的原理,我们不能用这个,但是,我们可以通过其他的方式实现。
  基本思路是虚拟机再增加一个虚拟网卡,这个网卡作为内部网络的网关。而虚拟机原来的网卡作为连接的真正网卡。
  首先,还是使用桥接。在客户机进行锐捷认证。之后使用Sygate office 4.5来配置代理服务器。不过果然麻烦的是一般的方法还是有问题,查阅了不少资料以后,终于成功了,我使用的方法如下:
  • 先建立一个网卡Microsoft Loopback Adapter,在添加硬件那里就可以添加了。
  • 之后为这个网卡配置一个ip,只需要配置ip地址和子网掩码。我这里的设置是192.168.0.11和255.255.255.0
  • 然后在sygate中配置,选择use Single NIC mode,Gateway IP for internal设置成前前面建立的虚拟网卡的ip地址。Local Area Network Connections 设置成客户机的网卡。
  • 主机的设置把主机的ip指定成和客户机中的虚拟网卡同一个网段,我的设置是192.168.0.111,子网掩码,255.255.255.0,网关和DNS都是那个虚拟网卡的地址也就是我这里的192.168.0.11.
  • 之后,只需要在虚拟机中开启sygate服务,等锐捷认证成功了以后,sygate中的状态显示已经上线了,确定客户机能够正常连接。这个时候主机终于成功的通过客户机连接到网络了。




注意图中的红圈,我这里只要dns能连通就可以上网了。最右边的红圈里面的东西消失是因为这个时候锐捷已经断线了。这也就是这种方法的大问题,锐捷会自动检测代理,这种情况下是会自动掉线的。所以虽然证明了结论但是还是没有可行性的。

好了,这次基本就这些,剩下的下次有机会再测试的时候有了新进展就会更新的。

/*******************************************
*原创文章,转载请注明出处
*******************************************/

2008-08-22

Java的一种图像处理及优化方法

  本来是在研究Graphics的图形处理的,不过找的的资料说的是图像的,但是我们还是可以从中找到方向:
  下面的代码是一个简单的小程序,基本就是两张图片,一大一小,用户可以在大图片上拖动小图片:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
/**
* A pin-the-tail-on-th-donkye demo
* @author ulysess
*/
public class pin extends java.applet.Applet{
  Image frontone,backone;
  int new_x=400;
  int new_y=646;

  public void init(){
    frontone = getImage(getDocumentBase(),"sets.png");
    backone = getImage(getDocumentBase(),"eva.jpg");

    addMouseMotionListener(new MouseMotionListener(){
      public void mouseDragged(MouseEvent e){
        System.out.println("drag");
        new_x=e.getX();
        new_y=e.getY();
        repaint();
      }

      public void mouseMoved(MouseEvent e){}
    } );
  }
  public void paint (Graphics g) {
    g.setColor(Color.black);
    g.drawImage(backone,5, 5, this);
    g.drawImage(frontone, new_x-25, new_y-25, this);
  }

}


  基本上,只需要这些就能够实现效果了,不过可悲的是,拖动图片的时候会闪烁的异常厉害。也就是没有实际使用意义。
  下面讨论下其中的过程:因为applet是一个重量级组件,所以当拖动鼠标时调用的repaint()会调用Component.update(Graphics g)这个方法。
它的实现如下:

public void update(Graphics g){
  g.setColor(getBackground());
  g.fillRect(0,0,width,height);
  g.setColor(getForeground());
  paint(g);
}

  这里可以看出,当使用reapint()时,update重绘整个面板,然后有再次调用了paint(),这样就造成了重复,我们可以重载update方法来消除这个重复,但是结果仍然不好。
  因此我们就需要使用双缓冲或称离屏处理(offscreen imaging)技术来优化显示效果。

双重缓冲:
  基本上,双缓冲就是让程序使用两个graphics对象,绘制时在内存中绘制其中一个作为缓冲用的对象,在绘制完成后再显示到屏幕上,这样能很快的更新图像,显然输出结果比在屏幕上计算结果快的多。而所需要做的只是简单的改动代码(蓝色部分):


import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
/**
* A pin-the-tail-on-th-donkye demo
* @author ulysess
*/
public class pin extends java.applet.Applet{
  Image frontone,backone;
  Image myOffScreenImage;
  Graphics myOffScreenGraphics;
  int new_x=400;
  int new_y=646;

  public void init(){
    frontone = getImage(getDocumentBase(),"sets.png");
    backone = getImage(getDocumentBase(),"eva.jpg");
    myOffScreenImage=createImage(getSize().width,getSize().height);
    myOffScreenGraphics = myOffScreenImage.getGraphics();
    addMouseMotionListener(new MouseMotionListener(){
      public void mouseDragged(MouseEvent e){
        System.out.println("drag");
        new_x=e.getX();
        new_y=e.getY();
        repaint();
      }

      public void mouseMoved(MouseEvent e){}
    } );
  }
  public void paint (Graphics g) {
    g.setColor(Color.black);
    g.drawImage(backone,5, 5, this);
    g.drawImage(frontone, new_x-25, new_y-25, this);
  }
  public void update(Graphics g)
  {
    paint(myOffScreenGraphics);
    g.drawImage(myOffScreenImage,0,0,this);
  }

}

  很显然,只增加了一个用于创建后台图信的image图像对象和一个后台Graphics图形对象,
关键的地方在最后重载的update方法,在repaint时,现绘制myOffScreenGraphics对象,之后再通过g.drawImage把这个对象对应的图像画到屏幕上。仅仅如此处理,结果就让人惊奇了,一点都不会闪烁了。

剪切矩形:
  还有一种方法称为剪切矩形法。主要的原理就是使用一个剪切矩形区域告诉程序,只有这个区域中的内容发生变化,只需要在这个矩形内绘图即可。其他地方不需要改变。
为了演示效果,我们把前面个的双缓冲给去掉。
  当使用setClip(int x,int y,int width,int height)设定了剪切矩形的时候,之后paint处理的范围也就仅仅在这个矩形之内,而不会去刷新矩形外的内容。即使paint的实现中有填充整个窗口的设定。
  下面来看看代码,蓝色部分为剪切矩形的实现,红色部分为处理的改进(全部都是相对于最初的代码的变化):

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
/**
* A pin-the-tail-on-th-donkye demo
* @author ulysess
*/
public class pin extends java.applet.Applet{
  Image frontone,backone;
  int new_x=300,old_x=0;
  int new_y=446,old_y=0;

  public void init(){
    frontone = getImage(getDocumentBase(),"sets.png");
    backone = getImage(getDocumentBase(),"eva.jpg");

    addMouseMotionListener(new MouseMotionListener(){
      public void mouseDragged(MouseEvent e){
        System.out.println("drag");
        new_x=e.getX();
        new_y=e.getY();
        repaint();
      }

      public void mouseMoved(MouseEvent e){}
    } );
  }
  public void paint (Graphics g) {
    g.setColor(Color.black);
    g.drawImage(backone,5, 5, this);
    g.drawImage(frontone, new_x-25, new_y-25, this);
  }
  
  public void update(Graphics g)
  {
    int cut=0;
    g.setClip(new_x-Math.abs(old_x-new_x), new_y-Math.abs(old_y-new_y) ,325+2*Math.abs(old_x-new_x) ,251+2*Math.abs(old_y-new_y));
    old_x=new_x;
    old_y=new_y;
    paint(g);
  }
}

  所以,实际上,要使用剪切矩形只需要重载update方法,在paint之前setClip为需要的矩形区域即可,当时,因为用户移动的速度不一致,所以如果你的矩形设置不好,会产生严重的图形碎块,这个时候怎么办呢?红色的部分就是优化的方法,增加了old_变量,保存上次的点值,根据点的变化来确定矩形的大小。325和251是我这里用的图片的长宽而已。经过这样设置以后,你就会看到实际只有拖动的部分在刷新,而其他部分是没有刷新的。不过拖动的部分还是闪烁的十分厉害,这样,结合前面的双重缓冲就可以让这个程序的效率比之前大大提升了。

  最后,在重载update之后,会发现第一次打开程序的时候,页面背景图是不会显示的,必须最小化再最大化,或者用其他窗口覆盖一下才会出现,这个问题很奇怪,我测试了也还是的不出结论,我们不可能在update里面加一个drawImage加载背景图。因为这样一旦有动作就要加载图片,浪费太多资源。经过最后的测试发现,可能是程序初始化的时候虽然我们没有任何动作,但是程序会自动repaint()两次,只要在这个过程中让update去drawImage背景图片就没有问题了。
  不过个人还是不大喜欢这样。希望以后能在其他教程上找到原因。

/*******************************************
*原创文章,转载请注明出处
*******************************************/

2008-08-21

闲扯云计算

  去年底开始,云计算这个词突然间就火爆起来了,也许和当年IBM的电子商务一样,对未来有巨大的影响吧。当然也可能只是历史的长河中一粒被冲上岸的小石子而已。
  基本上来说,凡是能够聚集到一定的规模就能获得规模效应所带来的最直接的好处——大幅降低成本,提高效率。举个例子,如果你买的多的话,液氮比牛奶便宜。正因如此,才有如此多的巨头争相推出所谓的云计算。先是Amazon,接着出现了DELL,Yahoo,Google等等等等。
  说实话虽然这个词很热门,但是到现在能说清楚它的前因后果,来龙去脉,有效用途,应用前景的人不多。无非就是下几个定义,或者说说它是网格的进化产物,它能提供强大的运算功能,而且好像还有提到Google APP和那个Yahoo BOSS的人。只是始终不见网上有人能把它说清楚的。当然以我目前的水平看,我也不会不自量力妄图去解释这种东西。
  基本上,从目前看起来最好的应用来说,云计算能为我们提供的最具可见性的功能就是把网络服务和硬件架构分离开,从此以后你就不再需要租借机房,买自己的服务器,浪费时间去维护,需要的只是交钱给云计算服务提供商和维护好自己的网络服务即可。这看起来的确相当美妙,只是,这种模式无法克服已有的地域型限制,很多时候用户不仅需要计算能力,还要足够强大的网络带宽与连接能力。而且,从企业级应用来说,多数情况下,他们需要的是一个内部网络的封闭式环境。一是高速,二是规避多数风险。而且。对于某些超牛逼的IT企业来说,也不可能淘汰他们已经花巨资建立的数据中心和机房。
  那么,云计算的定位为何呢?从目前的BOSS和Google APP来看,个人觉得,前者的技术门槛略高,后者只能替代一部分的企业应用。不过由此,我们也最终发现一点。不同于以往的高性能计算,云计算已经找到自己的方向,希望往实用化的商业应用方法发展,不久的将来,如果有一轮新的互联网浪潮的话,它最可能成为那些小小创业者的偏好。这样,从服务器业到整个互联网产业的格局都将产生变化吧。。。
  随性闲扯,未必正确,读者自辨。

2008-08-19

Java中的类

  同C++比起来,在Java中,类的应用更加的灵活多变,这篇文章简要的介绍一下整体的情况。

  类的集合在Java中被定义为包,它最容易实现的一种形式就是文件夹名作为包名,文件则是类。当然,实际不限于此。
  通过使用包,java中排除了麻烦的名字冲突问题。
  在java的类成员前的访问限定符就与包有关。java中的访问限制由宽松到严格(从母集到子集)的列举:
  • public:所有人都可以访问
  • protected:只有当前包中,或者当前包的子包和子类可以访问。
  • 默认情况,就是没有写访问限定符,也称包访问方式,只有当前包中的类能够访问。
  • private:只有当前类能访问。
  因此有以下规则。假设有A,B两个包,EXA,EXB两个类分别属于两个包。不论两个类之间是否存在继承关系,它们只能互访对方的public成员。
  而当两个类都属于A包的时候,不论两个类是否有联系,它们都能互访彼此的public,protected和未标明访问限定符的成员。
----------------------------------------
  了解了访问限定后,我们可以了解一下Java的嵌套类:
  

  如上图所示,它们的逻辑结构关系就是这样。
  类分为两种,我们最熟悉的就是顶级类了,也就是我们平时写的只能属于java包的成员的类。除此之外的另外一种就是所谓的嵌套类了,所谓嵌套类就是定义在另外一个类的内部的类。总的来说,很多时候使用嵌套类能够简化不少代码。
  嵌套类还能够细分为静态类和内部类。
  一般来说,内部类不是java包的一部分,在外嵌类之外是不可见的。
  静态类是一个声明为static的嵌套类,它不同于内部类,基本来说和顶级类的作用一样。正是因为声明为static,所以它是属于所嵌的类,而非该类的任何实例。
  声明的话用:

class top{
  static class test1{}
}

  成员类是一个内部类,其实和静态类比起来就是没有staitc而已。因此它和外嵌类的每个实例都有关系。因为是作为外嵌类的成员,所以它可以操作这个外嵌类的所有其他成员。当然,要使用成员类,这个外嵌类也必须先声明这个成员类的实例。
  声明的格式:
class top{
  class test2 {}
}


  本地类是一般声明在代码块内部,基本上是在方法中声明的,因此它不是外嵌类的成员。所以,这里么关键的地方在于,本地类只能访问final变量或参数。原因在于java编译内部类的方式。
  声明的格式:
class top{
  void examp()
    { class test3 {} }
}


  最后就是传说中的匿名类了,不知道为什么我上次参加的某个涉及java的考试特别爱考它,匿名类之所以匿名,就是因为它没有该死的类名声明的那一行。它直接跟在声明这个匿名类的实例的语句背后,以常用的WindowAdapter来作例子:
public class Demo
{
public static void main(String[] args)
{
final Frame f=new Frame("testtt");
f.setSize(600,400);
f.setLocation(100,100);
final TextArea tf=new TextArea();
f.add(tf);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});

  这就是一个相当漂亮的匿名内部类。的声明法。

-----------------------------------------
  前面提到的内部类的编译方法,在我看的书上是这样解释的:
源代码:
public class orange
{
  int i = 0 ;
  void foo() { }

  class pips
  {
    int seeds=2;
    void bar() {}
  }
}

编译时会被分离成:
public class orange
{
  int i = 0 ;
  void foo() { }
}

class orange$pips
{
  int seeds=2;
  void bar() {}
}

  然后,编译程序为内部类提供一个私有的字段用来存储对外嵌类的对象的引用。
pips类就变成了:
class orange$pips
{
  private orange this$0;
  
  orange$pips(orange o)
  {
    this$0 = o ;
  }
  int seeds=2;
  void bar() {}
}


  因此,这个this$0字段就保存了一个orange类的实例的引用,它就可以访问orange类的这个实例的所有成员。
  这个分离的处理方法,也使得本地类和匿名类无法访问嵌套它们的方法中的变量。显然分离之后,方法内的变量无法从外面访问。而final化的变量可以的原因是编译程序会把它作为一个附加的参数传递给内部类的构造函数。

2008-08-14

关于Java的static

  如果是刚从C/C++中转到Java的用户多半都会对static有相当的误解。实际上两个语言中对static的定义完全不同。
  在java中,我们还是应该把它当作是和“只有一个”或“只用一次”相关的东西。
  java的static有四种形式:

  • 静态数据:变量是属于类的而不是单个对象的
    如果在一个类中存在一个静态类型的数据,那么这个类的所有实例都将共享一份相应的数据。任何对它的修改都会在所有地方反应出来。而且,静态变量的调用推荐使用"类名.静态变量名“
  • 静态方法:这个方法是属于类的
    基本上就是可以直接用类名来调用的类方法。比如Math.sin(0);
  • 静态代码块:只被执行一次的代码块
    用static {}声明在类中非方法语句的地方。在类第一次加载到JVM的时候运行一次,静态代码块之允许操作静态数据,此外一个类允许多个静态代码块。会依次执行。
  • 静态类:嵌套在另一个类中的类
    实际上,嵌套的静态类只是把一个完整的类声明为另一个类的静态成员,定义嵌套类纯粹只是为了方便使用。从包含类的外部同样可以独立的访问嵌套的静态类。

2008-08-12

基本的UML类图读法

  虽然我不干软工,但是基本的UML图还是应该要能读懂的。这里推荐一个软件:dia。相当好用,不仅是uml图,各种流程图啦。网络的拓扑图啦都能轻松画出来。
  以下是基本的UML类图的规则。


  在UML类图中,每个类用一个矩形表示,其中由三部分组成:类名,属性和操作比如我这个

  这里可以看到相当多的箭头和两种类视图,由于这个UML图用于表示这几个主要的类之间的关系,所以除了包含main方法的类之外,其他所有类都省略了属性和方法。
  注意PaintBox类,你可以看到void在类名的背后,用一个冒号隔开了,这个就是UML图的规则。至于那个方法名前面的加号表示是public可见性的方法。减号当然也就是private属性的了。至于protect就是一个#号了。
  图中的由一个空心菱形加一条实线组成的有向线段表示的是有空心菱形的一端是个聚合类(就是一种has-a的关系,比如汽车是由很多其他部件聚合而成的,一个聚合对象就是将其他对象的引用作为自己的实例数据的对象),所以这里那个PaintFrame是 DrawPanel,ButtonBar,JMenuBar的聚合类。
  至于那个虚线箭头表示的是类关系,比如图中就显示了PaintBox类使用了PaintFrame类的类方法。
  空心三角形加直线表示继承关系,是从子类指向父类。
  继承关系可以出现多继承和兄弟类,不过由于Java不支持多继承,所以就不贴了。

所有Java GUI程序窗口空白?

你是否遇到这种情况呢?测试了半天程序检查了半天就是没有问题。但是也就是一个空白的窗口。
最后记起来原来连Netbeans也会出现这种问题。
实际上貌似这是在特定情况下导致所有的java的GUI程序都和我们的3d桌面特效程序起了冲突。关了3d桌面特效就正常了。。可是我在家里都没有这个问题。
果然只能归咎于垃圾显卡了。
万恶的垃圾精英主板。以后再也不买这个牌子了。。。

更多交互式GUI的组件

  从前面的例子可以看出,为了响应一个事件,我们必须要建立事件监听器与触发事件的某个组件之间的联系。比如一个名为:ButtonListener的动作监听器,要响应某个JButton对象。可以这样写:
JButton button = new JButton();
button.addActionListener(new ButtonListener());
这样以来,监听器就会响应这个按钮发出的任何动作事件。
这里addActionListener类通过多态性接受了一个实现ActionListener接口的类对象。

接下来是在交互式程序中基本都需要的文件选择对话框(FILE CHOOSER)

下面这个小程序可以让用户选择某个文本文件,并把内容显示出来:
Main.java:

import java.util.Scanner;
import java.io.*;
import javax.swing.*;

public class Main
{

  public static void main(String[] args) throws IOException
  {
    JFrame frame = new JFrame("File Contents");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JTextArea txtarea = new JTextArea (20,30);
    JFileChooser fchooser = new JFileChooser();

    int status = fchooser.showOpenDialog(null);

    if (status != JFileChooser.APPROVE_OPTION)
    {
       txtarea.setText("Not any file have been choosen");
    }
    else
    {
      File file = fchooser.getSelectedFile();

      Scanner scan = new Scanner(file);

      String cont = "";

      while(scan.hasNext())
      {
        cont += scan.nextLine() + "\n";
      }

      txtarea.setText(cont);
    }

    frame.getContentPane().add(txtarea);
    frame.pack();
    frame.setVisible(true);
  }

}


  这个程序主要在于diaoyong showOpenDialog显示一个文件选择对话框,这个方法会返回一个整型值,可以通过于JFileChooser类中定义的常量比较来了解用户操作状态。
  此外还用到了JTextArea类,该类默认是可编辑的。


接下来是滑动条:


我们写一个RGB值的颜色选择器:

main.java:

package forlearning;

import java.awt.*;
import javax.swing.*;

public class Main
{

  public static void main(String[] args)
  {
    JFrame frame = new JFrame("Set Color");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.getContentPane().add(new SlideColorPanel());

    frame.pack();
    frame.setVisible(true);
  }

}


slideColorPanel.java:

package forlearning;

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;

public class SlideColorPanel extends JPanel
{
  private JPanel controls,colorPanel;
  private JSlider RSlider,BSlider,GSlider;
  private JLabel RLabel,BLabel,GLabel;

  public SlideColorPanel()
  {
    RSlider = new JSlider (JSlider.HORIZONTAL,0,255,0);
    RSlider.setMajorTickSpacing(50);
    RSlider.setMinorTickSpacing(10);
    RSlider.setPaintTicks(true);
    RSlider.setPaintLabels(true);
    RSlider.setAlignmentX(Component.LEFT_ALIGNMENT);

    BSlider = new JSlider (JSlider.HORIZONTAL,0,255,0);
    BSlider.setMajorTickSpacing(50);
    BSlider.setMinorTickSpacing(10);
    BSlider.setPaintTicks(true);
    BSlider.setPaintLabels(true);
    BSlider.setAlignmentX(Component.LEFT_ALIGNMENT);

    GSlider = new JSlider (JSlider.HORIZONTAL,0,255,0);
    GSlider.setMajorTickSpacing(50);
    GSlider.setMinorTickSpacing(10);
    GSlider.setPaintTicks(true);
    GSlider.setPaintLabels(true);
    GSlider.setAlignmentX(Component.LEFT_ALIGNMENT);

    SliderListener listener = new SliderListener();
    RSlider.addChangeListener(listener);
    BSlider.addChangeListener(listener);
    GSlider.addChangeListener(listener);

RLabel = new JLabel("Red: 0 ");
    RLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
    BLabel = new JLabel("Blue: 0 ");
    BLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
    GLabel = new JLabel("Green: 0 ");
    GLabel.setAlignmentX(Component.LEFT_ALIGNMENT);

    controls = new JPanel();
    BoxLayout layout = new BoxLayout (controls ,BoxLayout.Y_AXIS);
    controls.setLayout(layout);
    controls.add(RLabel);
    controls.add(RSlider);
    controls.add(Box.createRigidArea(new Dimension(0,20)));
    controls.setLayout(layout);
    controls.add(BLabel);
    controls.add(BSlider);
    controls.add(Box.createRigidArea(new Dimension(0,20)));
    controls.setLayout(layout);
    controls.add(GLabel);
    controls.add(GSlider);

    colorPanel = new JPanel();
    colorPanel.setPreferredSize(new Dimension(100,100));
    colorPanel.setBackground(new Color(0,0,0));

    add (controls);
    add (colorPanel);

  }

  private class SliderListener implements ChangeListener
  {
    private int red,blue,green;

    public void stateChanged(ChangeEvent event)
    {
      red=RSlider.getValue();
      blue=BSlider.getValue();
      green=GSlider.getValue();

      RLabel.setText("RED:" + red);
      BLabel.setText("BLUE:" + blue);
      GLabel.setText("GREEN:" + green);

      colorPanel.setBackground (new Color(red,green,blue));
    }
  }
}

程序是相当漂亮的:
  这个程序看起来代码比较长,实际重复的东西很多,所以真正值得看的只有1/3左右吧。main方法只是简单添加了一个面板到框架。而SlideColorPanel继承了JPanel类,并且使用box布局管理器来排列三个滑动条和三个标签。
  滑动条是由JSlider创建的,它的四个参数分别指定了方向,最大值和最小值,初始值。
而setMajorTickSpacing和setMinorTickSpacing分别就指定了条上大的刻度和小的刻度的分割值。最后setPaintTicks表示允许显示上面定义的两个东西。setPaintLabels表示显示标签也就是下面的刻度值。
  而监听器通过实现ChangeListener接口来进行修改。


组合框(combo box)
这个东西就是一个下拉菜单由JComboBox类定义。

滚动窗格(scroll pane)
就是有滚动条的窗格,由JScrollPane类定义。

分隔窗格(split pane)
可以创建为一上一下或一左一右的形式,由JSplitPane定义。

2008-08-02

显卡PM随笔之钽电容篇

原文:http://blog.sina.com.cn/s/blog_51635a61010097d2.html
本文各厂商和情节纯属虚构请勿对号入座

一、钽电容的前世今生
  面对办公桌上一堆堆的电容资料,我突然蹦出一个想法:在这个世界上如果还有一个军国主义国家的话,它的名字不是日本而是美国。电容这个玩意很常见,任何电子设备上都少不了它,家用板卡领域最常用的是铝电容,因为它便宜,容量大,性能也不错。钽电容一般会被用在通讯、汽车电子和航太、军用等要求比较苛刻的领域。和其它行业一样高端的铝、钽电容是被洋人的少数几个品牌霸占。前军国主义国家日本在铝电容的生产设计上美誉度很高,三洋、CHEMI-CON等都是执行业牛耳的大牌子,在板卡发烧友中如雷贯耳。说到这里大家奇怪一般来说电子工业最强的国家是美国啊,为何美国在铝电容领域内却没有建树呢?其实不然,山姆大叔根本不屑于铝电容的生产设计,他们认为那玩意是小儿科。美国国内两大电容品牌KEMET和AVX(现在被日本KYOCERA收购)已没有铝电解电容生产线,其电解电容生产线上的产品基本是钽电容。

  钽------一种略带蓝色的战略金属,英文名叫TANTALUM,具有2900度以上的熔点(仅次于钨和铼)和6.5的莫氏硬度(钻石是10)以及令人难以置信的耐酸碱性(王水对其都没用,而黄金碰到王水都会融化),以上特性给钽带来了难以加工的坏名声,不过其极高的介电常数(27是铝的4倍以上)和烧结后的海绵状态以及超稳定状态却让电子元件生产厂商忍受千难万苦也要把它应用在电容上,最终装备到军用电子设备中。





  美国的军事工业异常发达,是世界最大的军火出口商,只要你有兴趣打开那些军用电子设备无一例外都可以看到上面布满了大大小小黄色的钽电容(有趣的是美国的钽电容外壳都用黄色,而日本等则喜欢用黑色,钽电容外壳的颜色和性能无关)。世界上钽金属的产量一半被用在钽电容的生产上,美国的国防部后勤署则是钽金属最大的拥有者,曾一度买断了世界上三分之一的钽粉,而KEMET这个世界上最大的钽电容制造者则是钽电容的发明者之一,它与上世纪五十年代研制出了这种电容,其初始动机是开发一种可靠、体积小、容量大的产品来替代战斗机火控雷达内不可靠的铝电容。   钽电容很容易分辨,通常只有长条形黑色和黄色两种(通常美国钽电容为黄色,而日本等则喜欢用黑色,其实颜色和性能无关)

  打开KEMET的钽电容产品手册竟然可以看到其民用产品都需要过最严苛的美军标,我给大家随便列举其中一个测试,是关于震动的:MIL-STD-202 方法213,条件1,在100G的冲击下保持电容ESR\损耗角和漏电流初始状态。我的天,这种条件只有导弹、炸弹能碰到,一般其它国家的民用钽电容如果你让它参加这种测试不被厂商骂你神经才怪。在九十年代随着铝聚合物电容的发明和广泛应用在一些低端应用场合已有取代钽电容的趋势,但在军用等高端场合钽电容仍然是绝对王者,美国干脆停止了铝电容的生产,其两大公司KEMET和AVX全力生产钽电容,主要还是为了其庞大武库的需要,至于民用所需的铝电容则是捡便宜的买,试想如果一个国家为了军事需要就不惜工本的保持如此大的储藏、生产厂,而且生产厂的民品都符合军规,那么它不是军国主义国家谁是?以上都是戏说,虽然钽电容是为了杀人而生又广泛被用于杀人机器,可还是吸引了一个和平主义爱好者------我,一个显卡PM。

二、钽聚合物电容------爱您不容易
  “要在一系列显卡上全部采用钽聚合物电容?”老板问我的时候眼睁的像铜铃一样大,恨不得一口吃了我,是啊每颗价格按照1美元算,一片低端显卡平均用6到8颗以上,9600、3850上搞不好还要十五颗以上,光这些主电容费用就要100元以上,而现在ATI\NV公版上才几颗铝聚合物电容,普通厂商的很多所谓非公版都用普通铝电解电容替代,一个板子上所有主电容加起来还不到1元钱。众所周知现在显卡只剩下价格战,现在一片普通630显卡从出厂到最终销售的全部利润可能才有50元,100元意味着什么?在这个能省一颗元件老板奖励设计人员的时代我的想法可谓太不入流,说我天方夜谭也可以理解。消费者也未必买账,在这个同质化的年代谁在乎几颗电容啊,便宜就好,与其用那么好的电容还不如换个漂亮的风扇给人感觉好呢!另外如果显卡全部用钽聚合物电容还会面临一个巨大的难题那就是备货,行外人士不会理解这个问题。一般的铝电容(包括铝聚合物电容)和钽电容生产厂商遍布世界各地,但能生产钽聚合物电容的全世界不多于10家,而且这十家主要在美国和日本,由于产量小(只有普通钽二氧化锰电容的百分之一),价格昂贵(是普通钽二氧化锰电容的10倍)所以生产厂商都是在你下单后生产,交货期长达数月(当然如果你是五角大楼则算我没说)。而一般显卡芯片可能寿命期也只有数月,换句话说我电容可能还没到货安装到显卡上,显卡都淘汰了,对于我们来说如果用钽聚合物电容简直和赌博无异。可是什么原因诱使我冒着被老板狠骂的风险提出要全部使用钽聚合物电容呢?以前我当PM时亲眼目睹了耕升在电容使用上摔的大跟头,不想重蹈覆辙。另外钽聚合物电容的特性太诱人,让我无法自拔。

与铝聚合物电容相比钽聚合物电容具备以下几个突出的特性:

  1. 漏电流少:同样阴极是聚合物(PEDT\PPY等)钽聚合物电容的漏电流只有铝聚合物电容的几分之一左右,以著名的三洋OSCON的SVP产品为例,其4V 33UF的4SVP33M漏电流(LC)为66UA而同规格钽聚合物电容一般仅为12UA左右,这代表显卡如果用钽聚合物电容滤波会更干净,漏电流导致的脉冲会小。
  2. 损耗角小:还是拿4SVP33M为例,其损耗角是0.15,而同规格钽聚合物电容的DF(损耗角)则为0.08。0.15与0.08间差了0.10、0.12两个数量级,损耗角小表示电容发热会小很多,有利于提高电容寿命和增加显卡稳定性。
  3. 失效率低:失效率就是每工作一定时间电容可能会失效一次,注意是失效一次,而不是从此出故障了需要修理才能继续或直接坏掉。钽聚合物电容由于都是树脂封装,外加多层银和石墨阴极镀层和钽导线所以电容失效率远小于容易进入湿气和被腐蚀的铝聚合物电容,在美军的一次试验中AVX和KEMET的钽聚合物电容在模拟运行了1000000小时中才出现一次失效,也就是说你想碰到一次钽聚合物电容失效要等110多年,所以山姆的关键性电子设备都采用它是有道理的。

  与钽二氧化锰电容相比钽聚合物电容的ESR极低,而且不会爆炸,可以说其是显卡上性能最好的电解电容,我个人从发烧友的角度来说确实喜欢。另外现在各显卡品牌同质化非常严重,各家争先恐后已降低成本为第一要素,最多在风扇上做文章,可是我始终认为显卡风扇对于提高显卡的性能非常有限,如果一片显卡连电路都设计不好配备再好的风扇可能也无法稳定运行乃至超频了。有的发烧友对此非常无奈,但是苦于没有真正发烧的产品,因此如果我能够反其道行至从发烧友最需要的办卡设计以及用料来考虑搞不好能让品牌另劈一片天地。再加上钽电容外观和铝电容差别很大,可以在卖场让消费者一眼认出,做到万花丛中一点绿的效果,虽然价格对普通玩家来说可能过高,但个别富裕发烧友可能会买账。如果单纯凭低成本,同德等厂不知道比我们领先多少,反正横竖是拼还不如另外开拓一个领域也许还能走的远点。再从成本上说,虽然钽聚合物电容价格昂贵,但是由于其优秀的性能可以降低显卡的返修率,当销量增大时返修率每降低一个百分点,就可以让整体成本下降不少,从显卡全寿命期费用来看,用好电容还是可以接受的。以上几点我象苍蝇一样整天在老板和同事前念叨,终于打动了他们,真是出乎意料,事后总结可能他们被我说烦了,不过更大的可能性是他们也在发烧。看来我们老板喜欢打牌也是好事,打牌的人总有疯狂的时候。不过他在疯狂之余还是让我们找几个个电容厂商好好压价,这事我们采购小张爱干。

三 压价:痛并快乐着
  在接下来的几周时间里大家都是在无休止的供需见面会中度过,说无休止那是夸张,因为钽聚合物电容的供应商主要也就三家:KEMET、AVX、三洋,不过这三家厂商可是大爷,因为他们都是行业内巨头,技术又很领先,所以谈判过程很艰难。先说KEMET吧,他最近才把德国的钽电容巨头爱普克斯买下来,可以说在欧美它几乎通吃了所有钽聚合物电容的份额。再加上人家是钽电容的发明者,又长期浸淫在此领域,产品种类特别齐全,指标非常的高,其最高档产品的最低ESR能低到4毫欧姆,这是单颗电解电容公认的极限,所以KEMET的报价是相当的高,2.5V 330UF(ESR9毫欧姆)的产品报价超过1美元不少。SANYO的POSCAP系列钽聚合物电容也有优势,首先因为NV的最高端显卡也有用到少量的POSCAP(如9800系列中混合使用了钽和铝聚合物电容)所以SANYO在国内是有备货的(以便能迅速交给NV 98系列公版的代工厂FOXCONN),因此我们如果订货其交货会比较迅速,大概只要等一个多月。其次三洋的价格比KEMET还是要低不少,同上规格的每颗电容是要低于1美元的。虽然其ESR和其它指标要高于KEMET的产品,但是用在显卡上也是够了。还有个竞争对手是AVX,它的实力不可谓不强,比如其在正常的钽二氧化锰电容市场中几乎占据了半壁江山,它的多重阳极钽二氧化锰电容ESR值之低几乎可以媲美钽聚合物电容,达到和三洋铝聚合物电容SVP的水准。不过由于钽二氧化锰电容易爆以及不耐瞬间大电流的特性,所以虽然其价格便宜也不在考虑范围内,我不想以后再因为电容有问题被显卡消费者退货(看来耕升的噩梦还在影响着我)。AVX的钽聚合物电容却不太强,产品只有一个TCJ系列,性能更是一般,最低的ESR都超过40毫欧姆,最大耐受链波电流值只有1安培左右。而它的同胞KEMET,最低ESR只有4毫欧姆,最大耐受链波电流值高达7安培,可谓相距甚远,如果我们在显卡上用的钽聚合物电容指标比铝聚合物电容还低发烧友会买账么?因此AVX在我们的候选名单上率先出局。就在我们要在AVX和三洋中选定供货商时半路又杀出个程咬金。

  采购小张告诉我内地有家钽电容生产商最近刚推出了一系列钽聚合物电容,而且这家厂商也是国内军方钽二氧化锰电容的大供应商。对于我这个国货支持者来说如果能在国人设计的高档显卡上用国人自己的高级电容能给多少崇洋媚外的发烧友们来个晴天霹雳啊,想到这里我都开始忍不住笑了,于是立刻展开同他们接触,找他们要来资料研究同时小张也去咨询报价。比AVX好,那家国内品牌的钽聚合物电容最低ESR值可以达到25毫欧姆(接近SVP这类铝聚合物电容标准了),耐受链波电流值也超过2安培,虽然达不到我心目中理想的水平,但如果继续加以改进或为我们定制一批产品也许性能就够用了,我们直接给厂商去了个电话,厂商说:“我们的产品就是描着KEMET打的,我们的性能和KEMET差不多。”我说:“很好,我也想在国人设计的显卡上用国人制造的最高档电容,不过要说性能和KEMET差不多恐怕有点吹牛,要不您自己去看KEMET网站。”(国人自己能制造这种高档电容确实了不起但如果没自知之明就不好了)他接着信誓旦旦的说:“我们的产品价格你绝对放心,一定比KEMET低很多。”这个我相信,在性能达不到国外最先进产品的前提下,国内用价格换市场的策略是必须的。不过我还是想错了:小张寻来的价格让我大吃一惊,这个国内品牌的钽聚合物电容报价都快到2美元了,而且前提是ESR值比KEMET大很多。这还不算,我去询问他们330UF产品时他们竟然说最近产品线坏了,何时能恢复生产还不知道。我告诉他们KEMET和SANYO的报价,他们也吃惊了:“洋人们把价格杀那么低?看来是不想让我们活了。”虽然我很想帮他们,但老板不同意,发烧友可能更不会接受,市场经济是残酷的,在性能和价格都不如洋对手的情况下确实很难有理由选择他们。有时我经常想:国内的企业确实很难,新产品产量小,价格高,也指望能靠这个赚点利润,可是洋人封杀,又有庞大的养老包袱制约很多领导不敢在价格上放手一搏,导致价格越卖越高,销量越来越少,利润越来越薄,最终导致无法在企业最重要的研发上投入更多的经费,形成恶性循环。其实不要说他们了,高昂的成本、发烧友未知的态度,我们自己品牌的显卡难道不会面临同样的困境么?到这里不敢再想下去。

  事情又回到了原点,KEMET和SANYO的供货商之争又摆回了台面:老板是支持SANYO的,他在生产体系待过多年,为料件短缺的问题困扰很久,经常某元件缺货导致显卡生产上市推迟数周,经销商叫苦不迭,选三洋意味着供货问题不像KEMET那么棘手。另外三洋的价格也能打动老板,商人重利么,话说回来如果没有利润的事情谁干啊!我支持的当然是KEMET,主要是发烧友心态,五角大楼喜欢的我能不喜欢么?那么多美军标光炫耀都能说几小时。再说了KEMET有几个计算工具软件如KEMET-SPICE等对设计和计算显卡电容非常有用,RD爱不释手。不过我不是老板,眼看SANYO获胜的事情就要定下来,这时NV和AMD帮了我大忙:由于新一代显卡都需要大功率,因此PCIE接口的供电不足,要外接电源供电。而电源的供电都是12V,所以需要在卡上设置多个大容量高压电容供外接电源滤波和储能,对我们来说像9600、38XX以上的显卡都需要16V(在电容里没有12V这个标准,再说钽电容一般要降压使用所以只能使用16V这个耐压值)大容量、低ESR的钽聚合物电容。天助我也,三洋POSCAP钽聚合物电容中的高压系列产品TQJ最高容量只有68UF,而KEMET钽聚合物电容中则有150UF 16V的T520系列。从设计角度来说:NV的9600系列显卡总计需要近千UF的16V电容,如果用三洋TQJ系列需要15到20颗,这还只是外接电源部分所需要的数量,整个显卡将有多大多贵大家可以想象。而如果电容用T520则只需要几颗即可,胜负已定KEMET入选。虽然决定选用KEMET产品但其价格确实让人肉痛,接下来几天KEMET销售人员来拜访时小张和我只好一个红脸一个白脸:我就不停地暗示三洋服务好供货及时价格低,我们没有理由不用。小张则私下对KEMET销售挑明:老兄啊,我尽力了,你们产品只有降价一条路可走了。KEMET的大爷们终于施舍般的调低价格,停在了一美元价格线以内。几天后当RD人员拿出一张密密麻麻布满黄色钽聚合物电容的显卡时全部同事都很激动,随后RD在高频示波器上对比了使用两种不同电容(钽聚合物和铝聚合物)时显卡电源的波形,我兴奋的哭了。

图说钽电容:同是小黄豆 玄机大不同

作者:万大善人

转自:http://www.beareyes.com.cn/2/lib/200805/09/20080509452.htm


  前言:当您看到显卡上遍布小黄豆(钽电容的昵称)时第一反应是什么呢?高性能、高频、高比容、高可靠性、高适应性、耐高温,还是易爆、要降压使用、昂贵。。。。。。不管您对其有什么印象,不过在您使用或设计一片显卡时可不要给第一印象和老经验给蒙蔽了,因为技术是日新月异的,下面就要和大家聊聊钽电容家族中的两个主要成员钽聚合物电容和钽二氧化锰电容,他们由于阴极特性的不同导致很多截然不同的特性,因此也造成显卡性能的差别。看到技术文字又头痛了是么?不要怕我们用轻松的图表配合简单文字让你轻易变成此领域的专家,还等什么,我们开始,LET’S GO!


钽聚合物电容VS钽二氧化锰电容之安全篇:一个是安静包容一个是火爆易怒


  很多消费者和工程师对钽电容的第一印象就是钽电容的爆炸威力,确实很多反坦克武器的药型罩或爆炸成型外壳都是用钽金属做成,坦克的外壳都能轻松撕破,可想而知钽电容的爆炸威力不小。不过能爆炸的可是钽二氧化锰电容,钽聚合物电容可炸不了,为什么呢?





  我们先看看钽二氧化锰电容为什么会爆炸:当电容遇到反向电压(就是交流电或生产时搞错了极性)或突发大电流时,由于热量迅速增加,阴极二氧化锰会释放出大量的氧气,氧气通过介质五氧化二钽的裂缝或空隙遇到阳极钽,这些钽可是纯正钽粉啊,氧气遇到钽再加高热,就是皮厚的坦克也怕遇见,之后就是轰的一声。。。。。小则显卡报废,大则伤人,您应该庆幸的是钽电容的体积普遍较小,如果多装点钽粉,那可就。。。。。一般来说早期的DIAMOND、STB、创新等公司设计的高端显卡全部采用钽二氧化锰电容,在设计和生产时对于电容的极性和大电流都有极其严格的要求,因此工程师和工厂都是战战兢兢,生怕这些家伙会惹祸。
  不过要是DIAMOND等公司的显卡设计师能等到今天用钽聚合物电容可就不会这么害怕了,因为他们根本不会爆炸。(见图二)当钽聚合物电容碰到极性相反的电压或巨大的电流时,高热首先会让部分阴极聚合物挥发,即使有些聚合物释放出氧气也没关系,其它聚合物会吸收氧气并膨胀,这样从根本上杜绝氧气与钽粉接触,没有了氧气这个氧化剂,爆炸怎么发生呢?由此看出钽聚合物电容还有自愈特性,即使碰到恶劣条件还能继续工作,所以可靠性特别高。




图二



您如果不信,那么就给看看图三的试验吧:





在施加两倍的反向电压,外带瞬间20安培电流的巨大折磨下那些钽二氧化锰全部灰飞烟灭,而剩余的钽聚合物电容却完好无损,下次您看到小黄豆时可别都认为他们脾气火爆啊,它们中的钽聚合物电容可是安静包容的“大家闺秀”。



钽聚合物VS钽二氧化锰之降压使用篇:一个是温婉贤淑 一个是刚硬威猛
  很多读者又说了,我以前设计和使用显卡,那些标称为16V的钽电容甚至要降压到8V使用,就是这样还不能保证不被击穿呢!是啊钽二氧化锰电容确实有这个问题存在,那是因为电容的阴极二氧化锰太刚硬威猛,由于二氧化锰的硬度高,在使用过程中的热胀冷缩产生的应力导致二氧化锰颗粒可以挤压薄薄的五氧化二钽介质层,导致介质变薄,所以电压越高越容易击穿介质导致短路,因此传统上钽二氧化锰电容都是要降压50%使用。可是钽聚合物电容就不会了,由于聚合物又软可塑性又强,即使碰到应力也不会对五氧化二钽介质层造成极大的伤害,因此其低压产品只要降压10%使用,高压产品如16V降压20%使用即可,也就是说16V钽聚合物电容安全工作电压是12.8V,刚好应用于670、9600的12V外接电源滤波上。





  看看上表,这是KEMET公司两种电容的对比试验数据。如果您显卡因为使用了钽聚合物电容而在1000000(PPM代表百万分之一)次试验中碰到了几次失效(注:失效不等于损坏,之后还可继续工作),那您可以买彩票了。


钽聚合物VS钽二氧化锰之价格篇:一个是阳春白雪 一个是下里巴人



  好多读者反应,我买过钽电容啊,几毛一颗就搞定了。普通小容量低压钽二氧化锰电容是不贵,一颗AVX的2.5V 22UF钽二氧化锰电容每颗售价可能0.3到0.4元人民币,可是如果一颗大容量低ESR的钽聚合物电容是什么价格呢?如果高压大容量的钽聚合物电容又是什么价格呢?造成价差那么大的原因又是什么呢?


  如果大家有兴趣查查国际报价(一般是DIGIKEY或TTI等网站)就可以知道,一颗KEMET T530系列,1000UF 2.5V的的钽聚合物电容每颗要3.5美元以上,也就是20多元人民币,好东西真是不便宜。就算是规格低一些的KEMET 330UF 2.5V的钽聚合物电容也要卖1.5美元一颗以上,折合10元多人民币呢。


  至于一些独家产品更是天价或没报价,如KEMET独家的16V 150UF钽聚合物电容,由于其它家的技术无法实现如此高压下的150UF容量,因此目前根本很少报价,即使报价也让人吓死,而且交期长达3到11个月,真不知道谁敢长期使用。很多消费者肯定会问为何大容量高压的钽聚合物电容那么贵,答案是聚合物的专利加上高容量钽粉的加工难度。目前PEDT聚合物的专利还掌握在德国拜尔手中,铝电解液电容中的电解液才10多元一桶,而PEDT每桶卖6000到7000元。再加上用于制造大容量钽电容的高容钽粉工艺异常复杂(被业界称为黑色艺术),来源稀少(适合的矿以及可生产的厂全球就两三家),所以钽聚合物电容的价格绝不是普通电容可比,它可是真正的阳春白雪。(备注:不同厂商如SANYO ***X等的钽聚合物产品由于品牌度、ESR 容量、特性、电压等不同报价可能有很大差异)


钽聚合物VS钽二氧化锰之高频特性篇:一个是好高骛远 一个是低三下四



  钽聚合物电容居然卖那么贵,除了安全耐压外,当然少不了好性能,否则如何在成本锱铢必争的今天被那些高端显卡使用呢?



分别为:钽二氧化锰 低ESR钽 二氧化锰电容 钽聚合物电容


上面的图看不懂没关系,把它做成表供大伙研究:现在显卡使用的PWM普遍工作在100KHZ(也就是100000HZ)左右的开关频率上,在此频率上100UF的钽聚合物电容可以保持99UF的容量,就算有些比较高频的PWM开关在500KHZ频率上其仍然保持64UF的容量,而此时钽二氧化锰电容就可怜了,基本当不了电容用啦。(不过也可以看出:到了1MHZ的开关频率时可就是MLCC的天下了,所有电解电容都完蛋。)可见钽聚合物电容“好高骛远”的优异高频特性导致其成为高端显卡最佳选择。


  至于钽聚合物电容引以为豪的超低ESR特性,是各显卡工程师的最爱,毕竟聚合物的导电率是二氧化锰的100倍,反应到电容的ESR值差异上表现十分明显,要不NV最高端的公版卡为什么都不约而同的采用那么昂贵的钽聚合物电容?下表是KEMET公司内部不同钽电容系列产品ESR对比,单位是欧姆



钽聚合物VS钽二氧化锰之型号识别篇:一个是脸上贴金 一个是长相平平
看到这里,肯定有读者会问,既然两种钽电容的价差那么大、性能又如此悬殊,可我们看到的都是显卡上的小黄豆(日本的钽电容一般是小黑豆),那我们如何慧眼识金呢?首先能生产钽二氧化锰电容的厂商很多,可是能生产钽聚合物电容的厂商就不多了,我们一般能见到的无非是三家公司产品,两家来自美国------KEMET 和 AVX,还有一家日本三洋,不过三洋的钽聚合物电容可是黑色的,而且没有任何特殊的标志,当您看到显卡上使用了黑色的钽电容时,只能指望显卡厂商的良心好,没有用普通钽二氧化锰电容取代钽聚合物电容。如果显卡上用了小黄豆,如果他还是钽聚合物电容则只会是AVX和KEMET的产品。AVX的产品线中只有一个TCJ系列是钽聚合物电容(见下图),注意电容上有个小小的LOGO类似”A”字,这代表AVX公司产品,而在476那串数字后还有个J字,则代表其是TCJ系列。也就是说您如果在小黄豆上发现A字LOGO再看到一个大大的“J”字那么很可能就是AVX的钽聚合物电容啊。不过TCJ系列的性能不是很理想,价格也很高,因此在显卡上应用的很少,我们把注意力放在另一家钽电容大厂KEMET上。


 

  KEMET的钽聚合物系列产品线很长,T52X(T520 525 T528)系列,和T530系列都是钽聚合物电容,再加上种类繁多的钽二氧化锰电容,让人识别起来很头痛。不过没关系,我们看下图

  KO代表KEMET的聚合物电容产品,其下的157则代表容量为150UF,再往下的6代表额定电压是6V,旁边那个长的像中国字“区”的其实是K代表KEMET公司识别号。最下面那个512则代表生产日期是2005年第12周。对我们消费者来说最重要的是“KO”两个字,有这两个字母就代表您买到钽聚合物电容啦。不过是否没有“KO”就代表您买的不是钽聚合物电容呢,答案是否定的,比如您运气超好,发现显卡上有如下图案的钽聚合物电容.
  如果电容上方有KM则代表您买到了更昂贵的KEMET多阳极钽聚合物电容T530系列,这家伙创造了电解电容ESR最低纪录------4毫欧姆。其中M代表MULTI,多阳极的意思。另外KEMET还有T525和T528系列钽聚合物电容,不过他们都有一个共性,就是电容的上角一定有两个字母,注意一定是字母,比如T525是”KT”,而T528则是”FD”,如果不是两个字母甚至是一个字母加一个符号都不能代表其是KEMET公司的钽聚合物电容。
  

  看到了吧,KEMET的超低ESR钽二氧化锰电容T510系列长的多像钽聚合物电容啊,可惜它最上方的标志只是一个字母加一个加号构成,没有两个字母,咱们就别错把冯京当马凉啦。看来识别KEMET小黄豆是否为钽聚合物电容其实很简单,只要电容最上方标志是两个字母就OK啦(当然KEMET还有个高温钽二氧化锰电容T498系列,电容最上方标志也是两个字母------HT,但电容颜色是黑色,而且用途特殊您可能见不到,所以不在我们讨论范围内)

钽聚合物VS钽二氧化锰之应用篇:让历史告诉未来
  过去: 看看老牌的显卡制造商帝盟(DIAMOND)在制造最经典的VOODOO时用了什么电容:遍布钽二氧化锰电容的MONSTER 3D,是玩家梦寐以求的显卡。小

  现在:NV的9600、8800、9800系列公版上采用了钽聚合物电容和铝聚合物电容混用的形式。下图为NVIDIA 8800GT公版电源附近的滤波电容,使用的是三洋POSCAP系列钽聚合物电容。

  未来:台湾显卡品牌爵珮推出了9600GT公爵版和8600GT公爵版,全部使用KEMET T520系列2.5V 和16V两种钽聚合物电容,还别出心裁的在显卡上打出 POLYMER TAN INSIDE的LOGO,很有意思。不知道是否可以引领历史,使钽聚合物电容真正接近普罗大众,让旧时王谢堂前燕,飞入寻常百姓家。
  下图是爵珮的9600GT公爵版注意那几个体积很大的家伙就是KEMET的独子产品16V 150UF钽聚合物电容,上面“KO”两个标示很明显。


下图是布满2.5V钽聚合物电容的爵珮8600GT公爵版

一颗顶十颗!显卡电容用料全方位解析



  作为DIY玩家,我们在关注一款显卡时,通常特别在意显卡的核心、显存、频率规格、散热器、价格等等,这些配件和参数都很直观、也很容易理解。可相当一部分人会忽略显卡的做工、用料,因为这两方面是相对来说的,主观成分比较多,而且与显卡的性能无关。
很多时候媒体在报道一款显卡的时候,也没有更多的形容词来描述,说来说去也就是“做工扎实、不惜工本、用料豪华等”,那么什么样的显卡才叫做工扎实、用料豪华呢?这个显然没有跑3DMark统计分数那么简单,一般来说做工主要针对显卡的PCB设计,而用料则是反映PCB上电容、电感等元件。   很多厂商都会采用NV/ATI提供的公版PCB,公版的做工自然无需怀疑,至于非公版就需要仔细审查,到底是为了强化功能而开发、还是为了降低成本而开发?当各家的PCB完全相同时,那么PCB上的元件用料好坏就非常重要了,看似不起眼的电容成为了大家所关注的对象,也成为一些厂商划分档次、或者说是缩水的重要手段!
  于是在报道显卡时,电容的规格、品牌和特点成为重点介绍对象,但由于电容的特殊性,很多人包括编辑都缺乏了解,很多网站在介绍显卡的用料时都存在一些不懂装懂、模棱两可或者说是误导读者的行为!比如通常所说的固态电容、电解电容、铝壳电容、贴片电容其实说的是同一种电容(是不是很惊讶?)

  当然也有些稍微懂电容知识的网友,往往会在文章评论中争得面红耳赤,结果证明大家都是半瓶水,只知其一不知其二。为此,笔者特意搜集了很多有关电容的资料,并且咨询了业内相关专业人士,组织了本文供广大网友参考,帮助大家更深层次的了解显卡在生产制造中不为人知的秘密……

   几年前行业内有一句话非常流行:“做显卡就是玩显存!”这是因为显存对显卡的性能影响非常大,而且高速显存的成本不低,通过显存来划分档次、加强超频的做法非常流行。如今主流GDDR3显存的速度已经接近极限,当大家都使用了1.0ns显存之时,通过显存来体现差异化的做法已然过时。
  
  就拿时下最流行的8600系列显卡来,采用P401公版设计的显卡大都标配1.0ns显存颗粒,规格都是256MB 128Bit,默认频率在理论的2000MHz左右。那么不同厂商的显卡究竟有什么差异呢?难道仅仅是一个商标而已?仔细观察下面的图片,您就可以发现一些不同之处了:
  虽然这么多品牌都采用了完全相同的公版PCB,但用料方面还是有差异的,除了散热器可以随便更换之外,原来电容也可以有很多种组合方式。
  对于显卡厂商来说,无论采用公版PCB还是自行研发的非公版PCB,一旦方案确定下来那么PCB的成本就是个固定值,另外GPU和显存这两大核心部件并不受厂商控制,只有电容可以“随意”更改。所以大家可以看到不同厂商的显卡,电容并不相同。而且同一厂商不同型号、不同批次出货的显卡用料不尽相同,有些可能是采购方面的原因,而有些则是为了降低成本刻意缩水!

  对于显卡本身来说,80%的成本都用来采购GPU、显存和散热器,电容虽然在显卡成本中所占比例不多(中端显卡大概几十块钱),但是弹性却非常大,您可能不知道不同电容之间的成本差距可以达到十倍以上!通过降低电容档次可以将几颗显存的成本节省出来!这在如今显卡业微利时代来说,对于显卡厂商有不小的诱惑力,因此缩水电容便成为降低显卡成本的重要手段,也是划分不同型号档次的重要方法之一。
  接下来就从了解基础知识开始,带大家进入电容的世界!

  “这显卡用的是高档铝壳电容,肯定比电解电容好”,“这是贴片电容,比固态电容还要强!”当您被某些网站或者JS忽悠得晕头转向的时候,有没有想过其实他们也是外行?正所谓外行人看热闹,内行人看笑话,这种说法虽然很可笑,但是你听不出来,因为你不了解电容。
  出现这些说法的主要原因是电容的种类实在太多了,而且分类方式往往会交叉重叠,很容易很混淆是非黑白。因此这里首先对电脑配件常用的电容进行系统的分类,以正视听!
● 什么叫电容?
  电容就是两块导体中间夹着一块绝缘体构成的电子元件,就像汉堡一样。电容是电子设备中最基础也是最重要的元件之一。电容的产量占全球电子元器件产品(其它的还有电阻、电感等)中的40%以上。基本上所有的电子设备,小到闪盘、数码相机,大到航天飞机、火箭中都可以见到它的身影。作为一种最基本的电子元器件,电容对于电子设备来说就象食品对于人一样不可缺少。
  电容的电路符号揭示了其基本构造
  电容虽小却是一个国家工业技术能力的完全体现,尤其是高档电容所代表的是本国精密加工、化工、材料、基础研究的水平。日本和美国是电容设计研究能力最强的两个国家,其高档产品的设计制造要求甚至不亚于CPU!
  当大家听到“某显卡使用了日系某某高档电容”这样的话时,不要感到奇怪,因为人家的技术就是牛。我国大陆以及台湾地区的电容产量不低,但其质量和性能与美日电容相比还有很大的距离,所以国产电容往往只能用在中低端产品之上。
● 电容的用途十分广泛:

  1. 隔直流:作用是阻止直流通过而让交流通过。
  2. 旁路(去耦):为交流电路中某些并联的元件提供低阻抗通路。
  3. 耦合:作为两个电路之间的连接,允许交流信号通过并传输到下一级电路
  4. 滤波:这个对板电脑配件而言很重要,显卡上的电容基本都是这个作用。
  5. 温度补偿:针对其它元件对温度的适应性不够带来的影响,而进行补偿,改善电路的稳定性。
  6. 计时:电容器与电阻器配合使用,确定电路的时间常数。
  7. 调谐:对与频率相关的电路进行系统调谐,比如手机、收音机、电视机。
  8. 整流:在预定的时间开或者关闭半导体开关元件。
  9. 储能:储存电能,用于必须要的时候释放。例如相机闪光灯、加热设备、UPS等等。

● 电容的分类
  电容就是两块导体(阳极和阴极)中间夹着一块绝缘体(介质)构成的电子元件,由于其结构的特殊性,所以分类方式也有好多种,通常按照介质、阳极、阴极和工艺这四种分类方式,而且各种分类方式互相交叉重叠,可以说比较混乱:
电容的分类很复杂,以上只罗列了板卡中常见的一些类型


  上表是一个简单的、并不完整的电容分类表,主要列举了一些在板卡设备上最常见的电容类型,通过这个直观的树型表可以对电容的分类、命名方式有一个直观的认识。
  比如说常见的直立电容几乎都是铝电解电容,所谓的固态电容和液态电容都属于铝电解电容的一种。固态电容是按照阴极材料区分的,主要是有机半导体和高分子聚合物这两种,其阳极材料还是铝。
接下来就为大家详细介绍各种电容的特性及优缺点。

首先按照介质的不同分为无机电容、有机电容和电解电容三大类:
● 无机介质电容器:
  无机电容主要有陶瓷电容和云母电容,其基本结构就是在陶瓷片或者云母片的两面电镀金属材料比如银,电脑配件中陶瓷电容很常见。
  陶瓷电容性质非常稳定、高频性能很好、无极性、耐压、耐热、低阻抗、体积小,综合性能好因此使用非常广泛,它可以应用在GHz级别的超高频器件上,比如军用雷达、电磁干扰发射器等精密仪器,当然CPU、GPU、Chipset表面也只能使用陶瓷电容。

  陶瓷电容之所以如此普及,这是因为能够在超高频率下正常工作的也只有陶瓷电容。所以我们可以看到,在主板CPU插槽四周/背面,显卡GPU四周/背面,还有内存、显存、芯片组、PCI-E插槽等,凡是高频器件周围都会有密密麻麻的陶瓷电容!

数字供电主要依靠高性能的多层陶瓷电容

  但是,陶瓷电容的价格比较昂贵,而且容量有限,因此不适合作为供电模块的滤波电容。不过近年来随着技术的发展,高档数字供电主控芯片也可以使用大量多层陶瓷电容,这可以让抗干扰能力、稳定性和转换效率都得到大幅提高!
● 有机介质电容器:
  薄膜电容就是典型的有机电容,音箱、收录机上很常见:

常见的薄膜电容

  薄膜电容的基本构造就是2层聚丙乙烯塑料和2层金属箔膜交替夹杂然后捆绑而成。这种电容的介质为高分子有机物,所以统称为有机电容,其特点与陶瓷电容类似,无极性、无感、高频特性好、体积小、耐压,但也同样存在容量不大、成本较高的缺点,另外它的介质是有机物,因此耐高温能力一般。

● 电解电容器:
  电介质的材料除了无机物就是有机物,为什么还会单独分出一个电解电容来呢?这是因为无机电容和有机电容的绝缘材料在生产时就已确定,比如陶瓷、云母、塑料等。而电解电容的绝缘材料是在生产时通过化学反应生成的,比如铝片浸泡酸性溶液(电解液)通过电化学腐蚀之后,电容两极的有效表面积成倍增加,再加上电解液和金属之间的介质氧化膜非常薄,因此容量可以做到很大!虽然电解电容的介质也是无机物,但它与无机电容还是有本质区别的。

电解电容的阳极为金属箔,阴极一般是电解液,介质为金属氧化物

  由于主板、显卡等产品使用的基本都是电解电容,因此这是我们要讲的重点。大家熟悉的铝电容、钽电容其实都是电解电容。如果说电容是电子元器件中最重要和不可取代的元件的话,那么电解电容器又在整个电容产业中占据了半壁江山。


大大小小的电解电容

  首先让我们了解一下电解电容的性能特点,这样我们才能清楚为什么主板、显卡以及几乎所有的计算机设备里面都使用到了电解电容:
  电解电容特点一:单位体积的电容量非常大,比其它种类的电容大几十到数百倍。
  电解电容特点二:额定的容量可以做到非常大,大型电解电容可以做到几万μf甚至几f(但不能和多电层电容相比)。
  电解电容特点三:价格比其它种类具有压倒性优势,因为电解电容的组成材料都是普通的工业材料,比如铝等等。制造电解电容的设备也都是普通的工业设备,可以大规模生产,成本相对比较低。
  目前,新型的电解电容发展的非常快,某些产品的性能已达到无机电容器的水准,电解电容正在替换某些无机和有机介质电容器。电解电容的使用范围相当广泛,例如通讯产品,数码产品,汽车上音响、发动机、ABS、GPS、电子喷油系统以及几乎所有的家用电器。由于技术的进步,如今在小型化要求较高的军用电子对抗设备中也开始广泛使用电解电容。基本上,有电源的设备都会使用到电解电容,它价格便宜,使用在几百上千元的主板、显卡上是再合适不过了。
  电解电容成本低,但是它的结构却非常复杂的,通过阳极和阴极的不同可以划分为好多种,接下来就专门介绍板卡设备常用的几种电解电容。

  电解电容的分类,传统的方法都是按阳极的材质分,比如铝、钽、铌等金属,其中铌电容很少见,板卡上最常用的还是铝电容和钽电容,相信很多人都比较耳熟。

● 铝电解电容
  各种电解电容的外观差异很大,但不管贴片工艺还是直插式(后文会有详细介绍),或者有塑料表皮的“包皮电容”,只要它们的阳极材质是铝,那么肯定就是铝电解电容。但是很多人可能受到误导以为只有“包皮电容”才是电解电容。

  总的来说,电容的封装方式和电容的品质本身并无直接联系,电解电容的性能只取决于具体型号。由于铝电解电容又可以分为好多种,因此其特性会在后文中详加介绍。
● 钽电解电容
  阳极使用金属钽的话,就是通常所说的钽电容,很多人看到这种黄豆状的小电容就会惊呼“这个显卡做工真不错!”的确如此,因为之前只有高端显卡才会不惜成本使用钽电容。

  钽电解电容的体积很小,都使用贴片式安装,其外壳一般用树脂封装。但要注意的是,钽电容的阳极是钽,阴极也是电解质,因此钽电容也属于很多人所瞧不起的“电解电容”,关键是电解电容这个分类太大了!
  需要提及的是,铝电解电容和钽电解电容不是由封装形式决定的。像上图中的黑色与黄色小方块,通常我们认为其是钽电解电容,但实际其阳极也有可能是铝,也就是说它们也有可能是铝电容而不是钽电容。
  以往传统的看法是钽电容性能比铝电容好,因为钽电容的介质为阳极氧化后生成的五氧化二钽,它的介电能力(ε)比铝电容的三氧化二铝介质要高。因此在同样容量的情况下,钽电容的体积能比铝电容做得更小。再加上钽的性质比较稳定,所以通常认为钽电容性能比铝电容好。
  但这种凭阳极判断电容性能的方法已经过时了,目前决定电解电容性能的关键并不在于阳极,而在于电解质,也就是阴极。因为不同的阴极和不同的阳极可以组合成不同种类的电解电容,其性能也大不相同。采用同一种阳极的电容由于电解质的不同,性能可以差距很大,总之阳极对于电容性能的影响远远小于阴极。

  电解电容的阳极有很多种,但常见的只有金属铝和金属钽,而阴极是电解质,其成分非常复杂,不同的电解质对电容的性能影响非常大,成本也有天壤之别,所以需要重点介绍!
● 电解液(铝-电解液电容)
  电解液是最传统的电解质,电解液是由GAMMA丁内酯有机溶剂加弱酸盐电容质经过加热得到的。我们所见到的普通意义上的铝电解电容的阴极,都是这种电解液。


曾经名噪一时的高端铝电解液电容——红宝石MCZ

  使用电解液做阴极有不少好处。首先在于液体与介质的接触面积较大,这样对提升电容量有帮助(动辄1500μf)。其次是使用电解液耐高温能力不错,可使用SMT工艺,同时耐压性也比较强。此外,使用电解液做阴极的电解电容,当介质被击穿之后,只要击穿电流不持续,那么电容能够自愈(金属氧化物可以自动生成)。
  但电解液电容也有其不足之处。首先是在高温环境下容易挥发、渗漏,对寿命和稳定性影响很大,在高温高压下电解液还有可能瞬间汽化,体积增大引起爆炸(就是我们常说的爆浆);其次是电解液所采用的离子导电法其导电率很低,只有0.01S/CM(电导率,欧姆的倒数),这造成电容的ESR值(等效串联电阻,阻抗)特别高。
  阳极为铝、阴极为电解液的电容,其正式名称是铝电解液电容,因为有液体存在,所以被称为“液态”电容,因为太过常见所以被称为“普通”电解电容。接下来的电容就不“普通”了,也全都是“固态”电容。
● 二氧化锰(钽-二氧化锰电解电容)
  二氧化锰通常是钽电容所使用的阴极材料,所以那些黑条或者黄豆状钽电容的正式名称是“钽-二氧化锰电解电容”,它不存在电解液,当然属于“固态”电容。
  固体二氧化锰的传导方式为电子导电,导电率是电解液离子导电的十倍(0.1S/CM),所以ESR比电解液低。一般来说钽-二氧化锰电解电容比铝电解液电容好得多,同时固体电解质也没有泄露或爆浆的危险。此外二氧化锰的耐高温特性也比较好,能耐的瞬间温度在500度左右。

所有电解电容都不容许将极性接反

  二氧化锰的缺点在于在极性接反的情况下容易产生高温,在高温环境下释放出氧气,同时五氧化二钽介质层发生晶质变化,变脆产生裂缝,氧气沿着裂缝和钽粉混合发生剧烈爆炸!另外二氧化锰阴极材料的价格也比较贵。
  传统上认为钽电容比铝电容性能好 主要是由于钽加上二氧化锰阴极助威后才有明显好于铝电解液电容的表现。如果把铝电解液电容的阴极更换为二氧化锰,那么它的性能其实也能提升不少。
  钽-二氧化锰电解电容按照特性来说,其应用方式介于陶瓷电容和直立电容之间,因为它的体积只是略大于陶瓷电容,但容量却要大很多几乎快赶上直立铝电解电容了,因此在一些必须使用大电容、但却体积有限的地方,一般都会使用钽电容。比如板卡PCB背面、散热器下面都不允许使用直立电容,而钽电容则正好合适。
● TCNQ(铝-有机半导体电解电容)
  TCNQ(四氰基对醌二甲烷)是一种有机半导体,它和金属结合后能生成金属有机络合盐。TCNQ的用途非常广泛,在电容方面的应用,是在90年代中后期才出现的,它的出现代表着电解电容技术革命的开始。


  TCNQ是一种有机半导体,因此使用TCNQ的电容也叫做有机半导体电容,例如早期的三洋OSCON产品。TCNQ的出现,使电解电容的性能可以直接挑战传统陶瓷电容霸占的很多领域,电解电容的工作频率由以前的20KHz直接上升到了1MHz。TCNQ的出现,使过去按照阳极划分电解电容性能的方法也过时了。因为即使是阳极为铝的铝电解电容,如果使用了TCNQ作为阴极材质的话,其性能足以和传统钽-二氧化锰电容相提并论。TCNQ的导电方式也是电子导电,其导电率为1S/CM,是电解液的100倍,二氧化锰的10倍。
使用TCNQ作为阴极的有机半导体电容,其性能很稳定,成本相对较低。不过它的热阻性能不好,其熔解温度只有230-240摄氏度,所以有机半导体电容一般很少用SMT贴片工艺制造,因为无法通过高温波峰焊工艺,所以我们看到的有机半导体电容基本都是插件式安装的。TCNQ还有一个不足之处就是对环境的污染。由于TCNQ是一种氰化物,在高温时容易挥发出剧毒的氰气,因此在生产和使用中会有限制。
总的来说,TCNQ让传统铝电解电容重获新生,性能、稳定性都获得提高,也让大家意识到在直立电容当中,“固体”电容就是比“液体”电容好。但由于TCNQ有毒而且无法使用SMT全自动焊接工艺,因此使用率越来越低,被性能更好的固体聚合物所代替!

如果说TCNQ是电解电容革命的开始,那么革命成功的主角当属PPY(聚吡咯)以及PEDT这类固体聚合物导体。
● 固体聚合物导体(铝-固体聚合物导体电容)
  70年代末人们发现,使用搀杂法可以获得优良的导电聚合物材料,从而引发了一场聚合物导体的技术革命。1985年,日本首次开发了聚吡咯膜(PPY),如果使用复合法的话,可以使其导电率达到铜和银的水平,但它又不是金属而相当于工程塑料,附着性比金属好,同时价格也比铜和银低很多,此外,在受力情况下,其导电率还会产生变化(其特性很像人的神经系统)。这无疑是电容研发者梦寐以求的阴极材质。
2000年,两位美国科学家和一位日本科学家因为发明了大规模制造PPY聚吡咯膜的方法,从而分享了当年的诺贝尔化学奖,固体聚合物导体的重要性可见一斑!聚吡咯的用途非常广泛,从隐形战斗机到人工手,以及显示器和电池、电容等等。聚吡咯的研发实力,可以反映出一个国家的化工水平,我国西安交通大学和成都电子科技大学在这方面比较突出。


8800GTS上一排整齐的三洋SVP铝-固体聚合物导体电容

  当然,电容阴极只是聚吡咯很小的一个应用领域,但它却让电解电容的性能得到再次飞跃式提升!使用PPY(聚吡咯)和PEDT(聚3,4-乙烯二氧噻吩)做为阴极材料的电容,叫做固体聚合物导体电容。其电导率可以达到100S/CM,这是TCNQ盐的100倍、二氧化锰的1000倍、电解液的10000倍!而且固体聚合物导体没有污染,可以忍耐300度以上的高温,因此可以使用SMT贴片工艺安装,也适合大规模生产。

  在NVIDIA最强的8800Ultra显卡上,就使用了三洋和富士通的16V 180uf的固体聚合物导体电容。可能很多“高手”对此不屑一顾,说16V算什么?可怜的180uf容量又算什么?和动辄1500uf的铝电解液电容如何比?16V 180uf这个参数确实不算什么,但是在16V的电压下,其超低ESR性能不是一般电解液电容所能达到的,因此固体聚合物电容才被应用到8800Ultra这种超大功率的顶级显卡上!
● 电容的阴/阳极可以随便组合!
  通过前面的介绍可以发现,电解电容之间的区别主要在阳极和阴极上面,理论上来说,使用不同的阳极和阴极材料可以组合成多种规格的电解电容。
  比如通常所说的钽电容的阴极一般是二氧化锰,不过新型的钽电容也能够在阴极使用PPY和PEDT这类固体聚合物导体,因此性能进步很多,也没有以往二氧化锰阴极易爆炸的危险。如今最好的钽-聚合物电容的ESR可以达到5毫欧姆。这类性能高、体积小的钽聚合物电容一般使用在手机、数码相机等一些对体积要求较高的设备上。

  经常有文章介绍产品时会指出,某某显卡全部使用了高档的贴片电容、豪华供电、做工一流,而中低端显卡则大量使用普通的直插电容。那么贴片电容和插件电容的区别是什么呢?


● 贴片和插件的根本区别在于安装工艺
  无论是插件式还是贴片式的安装工艺,电容本身都是直立于PCB的,根本的区别方式是SMT(Surface Mount Technology,表面贴装技术,俗称贴片工艺)安装的电容,有黑色的橡胶底座:

  贴片电容为什么要安装橡胶底座呢?因为这样表面焊接的电容引脚和PCB结合会更加稳固。另外,从SMT的字面意思就可以理解,表面焊接的焊点在PCB正面,引脚不会穿透PCB;而插件电容的引脚要穿透PCB,焊点在PCB的背面。


● 贴片和插件的优缺点

  通过上面的介绍大家可以很容易了解到,插件的优势就是设备要求不高,人力成本低;而贴片的优势就是全自动化流水线作业,产能高、精度高,而且贴片电容在运输途中不像插件式那样容易受损。

  但两者都有局限性:插件电容的引脚要穿透PCB,而一些多层PCB集成度特别高,可能PCB背面也要安装一些贴片元件,而且考虑到干扰问题,一般8层以上的PCB很少使用插件电容(比如NV/ATI的256Bit公版卡),所以必须使用贴片电容。



  而贴片的局限性就在于温度,贴片工艺需要经过波峰焊接处理,一些电容经过高温之后可能会影响性能,尤其是阴极采用电解液的电容,经过高温后电解液可能会干枯。所以,廉价的液态电容不可能使用贴片安装,部分特殊材料的固态电容也只能使用插件安装(比如紫皮的三洋OSCON有机半导体电容)

  因此可以这么说,贴片电容大都是高档电容,因为贴片电容耐高温能力必然强,而且使用贴片工艺生产的大多是中高端显卡;但插件电容不一定是低档货,像三洋、日本化工这些知名的顶级电容制造厂,相同类型的电容会同时生产贴片和插件两个版本,这是考虑到不同工厂设备的需要。
  总之,电容使用贴片或者插件与做工用料的好坏并无必然联系。另外,一些小型电容比如钽电容和陶瓷电容必然属于贴片安装。

  相信大家都发现了,很多电容顶部有个“K”或者“X”字样的凹槽,而有些电容却没有,这种纹路是故意留下用来防止电容爆炸的。这时可能有人会问,有了凹槽电容岂不是更容易爆炸?


铝电解液电容必须设有防爆纹

● 防爆纹的作用
  铝电解液电容(即最常见的液态电容)的电解质为有机溶剂或者弱酸盐,这就注定了其耐高温能力不强,如果电容长期工作在较高温度下,溶液很容易挥发、渗漏,高压情况下甚至可能会瞬间气化,由此导致内部体积膨胀引起爆炸!电解液电容因为工作环境和寿命的关系,很多时候爆炸是不可避免的,因此电容在制造时就必须考虑减少爆炸所带来的危害,那么该怎么办呢?
其实铝电解液电容的结构和鞭炮非常相似,鞭炮虽小但威力不弱,主要原因就是它的表面缠绕了一层又一层的纸片,包得越紧爆炸时纸片飞扬威力越大!数百个鞭炮总有那么一两个密封不够紧密的,这种肯定属于“哑弹”,爆炸声不够响亮,外皮也炸不开,一点威力都没有。

电容爆浆很常见,有些爆浆之后还能正常使用

  电容就属与这种“哑巴鞭炮”,给电容顶部开了凹槽之后,一旦出现意外情况,电解液气化时必然从最薄弱的环节——顶部凹槽冲出,而不会将外壳炸得四分五裂,这就避免了爆炸时殃及池鱼、炸坏电容附近其它元件的情况。这种情况被称为电容“爆浆”而不是爆炸,维修时只要更换电容就可以了,简单方便。
● 关于防爆纹的特殊例子
  带防爆纹的不全是液态电容:一般来说,带有防爆纹的电容都是液态电容,或者是固液混合型电容,只要阴极有液体就存在爆炸的可能,所以必须开防暴纹。但有个别厂商在生产固态电容的过程中没有及时转换封装工艺,最终电容顶部还是带有防爆纹,最典型的例子就是富士通黄色固体聚合物电容:

   富士通这种黄色电容虽然带有防爆纹,但的确是如假包换的固体聚合物电容,富士通多此一举开防爆纹是封装工艺没来得及转换的结果,现在最新的型号已经全面转换为常见的红色铝壳封装。
  不带防爆纹的不一定是固态电容:固态电容开了防爆纹也没什么坏处,但液态电容必须开有防爆纹!可是偏偏有些厂商铤而走险,为了降低成本省掉了开槽这一道工序,更有一些别有用心的厂商,为了加强产品的卖相,给普通液态电容或者二手翻新电容安装了漂亮的铝壳,从而以次充好!

  这样的电容只不过是穿了一个马甲而已,虽然没有防爆纹,但本质上还是极其普通的铝电解液电容,一旦电容寿终正寝可能会出现爆炸而不是爆浆事件!

  固态电容也可能爆炸:理论上来说,固态电容是不会爆浆的,但如果极性被接反的话任何电容都会烧毁的,固态电容也不例外!比如阳极钽阴极二氧化锰电容极性接反就会爆炸,而阳极钽阴极铝电容只是会烧毁,要安全很多,因此二氧化锰电容现在已经很少见了。

以前曾有个别厂商的三洋SVP固体聚合物电容出现过爆炸事件,最终只能沦为笑谈。

● “包皮电容”和“铝壳电容”是很不严谨的说法
  电容可以按照阳极、阴极、介质以及安装工艺分类,也有无极性/有极性电容,单层/多层电容这些分类方法,就是没有按照外观分类的标准,所谓的“包皮电容”和“铝壳电容”主要是描述电容的外观,其封装对于电容的性能几乎没有任何影响!

  所有的直立式铝电解电容都是铝壳电容,只不过有一部分电容的外面包了一层PVC薄膜,因此被一些人称为“包皮电容”。铝电解液电容需要开防爆纹,没必要使用高档铝壳,“包皮电容”这样的封装成本会低一些。而固体电容无须防爆纹,而且价格昂贵,所以高端固体电容一般都会使用漂亮的铝壳封装,但也有些固体电容比如富士通和三洋有机半导体使用了传统的封装。

  在优质的固体电容以及固液混和型电容在板卡上得到大量使用之后,有些普通铝电解液电容生产厂商为了让自己的产品显得更好看,开始使用豪华的铝壳封装,使用这种电容的显卡看上去卖相更好一些,由于价格并不贵,所以得到了广泛使用。这里需要特别指出的是,这种“铝壳电容”并不会因为封装好看而提升性能!

  更有甚者,给普通铝电解液电容套上漂亮的铝壳之后,连防爆纹都不开,明摆着冒充固体聚合物电容!爱美之心人皆有之,普通电解液电容换新衣未尝不可,但是连最基本的防爆纹都省掉的话其动机就非常不纯洁了,这样的电容就是一颗颗不定时炸弹!

  前文对板卡常见的电容种类已经特性作了详细的介绍,接下来就具体到每个电容厂商的常见电容型号,方便大家认识这些电容。由于传统的铝电解液电容种类、规格非常多,无法一一介绍,这里就主要列举目前最流行的固态电容。
● Sanyo三洋——紫色包皮或铝壳
   三洋的电容种类和产量是最多的,在新型电容的方面的研发制造技术也是名列前茅,单一从性能上看,也许最好的电容不是三洋的,但是从生产规模,产量,品控能力,研发水准上来看,三洋的综合能力却是同行业中最强的。
  常见的大部分三洋电容都属于OSCON系列,该系列电容就是低ESR值的有机半导体和固体聚合物电容的统称,综合性能远胜铝电解液电容。板卡上常见的三洋固体电容有以下三类:
  SP系列:插件式,铝-有机半导体电解电容

  三洋TCNQ有机半导体电容的种类特别多,有些专门为音响设备定制的价格很高,而板卡用单价1元左右。
  SEPC系列:插件式,铝-固体聚合物电解电容


耕深8600GT红旗版,三颗紫色

  SEPC虽然是插件式,但ESR值比贴片式的SVP还要低,单价差不多。
  SVP系列:贴片式,铝-固体聚合物电解电容。和SEPC的主要区别就是插件和贴片

影驰8600GTS骨灰魔魂,主供电全部SVP

  三洋SVP系列电容最为常见,但它并非是三洋最高端的固体聚合物电容,带后缀的四个字母的型号,比如SVPS、SVPD等才是性能指标更强的规格。
SVP系列根据容量和电压的不同,单价3-4元,大批量更便宜。


● Nippon Chemi Con(NCC)日本化工——蓝色铝壳

  NCC公司的发展史几乎就是电解电容的发展史,铝电解液电容之王非NCC莫属,其出货量远高于三洋和富士通。旗下最新的PS系列固体聚合物电容对应于三洋的SVP和SP系列,同属顶级固体电容,很多板卡厂商喜欢将三洋和日化的电容搭配使用。
PS系列:插件式,铝-固体聚合物电解电容。

索泰8600GT,全部日化PXA型贴片系列

  至于三洋和日化电容孰优孰劣,尚无定论。其电容类型、规格、参数甚至价格都非常接近。相比之下还是三洋电容更常见一些。

● Fujitsu富士通——黄色包皮或红色铝壳
  富士通电容并不像三洋和日化那么常见,不过有两个厂商特别喜欢使用,一个是ASUS一个是ONDA。ASUS高端主板几乎全部武装高端红色铝壳状的富士通固体聚合物电容。 

迪兰恒进X1950GT龙卷风,六颗红色插件式

  黄色包皮状是富士通早期的产品,各项指标很普通,价格也是最便宜的说固体聚合物电容没错,但说是军工级纯粹就是忽悠人了
  富士通的高端固体电容拥有令三洋和日化汗颜的超低ESR值(仅5mΩ),而且价格相对便宜,但综合参数指标稍逊一筹。

  NVIDIA从8800GTX到8800Ultra,把三颗日化电容更换为富士通电容应该是看中了超低ESR的特性


● Nichicon(蓝宝石)——黑色铝壳
  Nichicon也是全球一线电容大厂,在大容量铝电解电容方面具有很强的技术实力,而且收购了松下钽电容部门,产品线极为丰富。早先的铝电解液电容得到了板卡厂商的大量采用,但它的固态电容ESR值过高,因此未能得到大量使用,如今市场已被三洋、日化等瓜分,因此Nichicon很难有所作为。

● 杂牌铝电解液电容种类实在太多,无法一一列举
   总的来看,板卡常用的固态电容就这么几种,各家电容的颜色还都不同,非常容易识别的。可是普通的铝电解液电容就没那么好识别了,除了日系之外,还有国产及台系电容都非常杂,很多电容量什么牌子都很难查到,不过有一种电容在中低端显卡上比较常见,我们来看看

  这种电容在通路显卡上太常见了,使用了铝壳封装所以很多人都误认为是固态电容,实际上它是普通的铝电解液电容,捷微、金鹰、启亨、柏能等一些代工厂在低端显卡上都大量使用了这种电容。其特点就是容量大、耐压、价格极其便宜,单价只有0.20元左右——价格连三洋SVP的十分之一都不到!
  因此,士康电容频频出现在通路各种低端显卡上,比如X1650GT、7300GT、7600GS、8500GT,部分厂商的低价8600GT显卡也使用了这种电容来降低成本,比如699元的8600GT几乎都是这种电容。
  通过前文中详细的分析和介绍,相信大家现在看显卡时的眼光就会不同以往了。如果我们对比各大显卡厂商的同类显卡产品,或者是对比同一家厂商不同规格的产品,透过电容就能发现他们的产品策略,以及一些微妙的变化!


● 通路显卡厂商开始走品质化路线
  通常所说的通路厂商就是指没有研发能力,只是从代工大厂拿货贴牌销售的大型渠道商。以往通路货大都是OEM大厂做什么,他们就卖什么,各家显卡如果来源相同,那么产品品质和性能基本没什么区别。可近年来发生的变化很明显,细心的朋友可能已经发现了。


  简单来说,如今通路厂商已经不满足于亦步亦趋的跟着代工厂走,他们也开始迎合玩家的胃口,推出一些做工优秀、用料出色的显卡,毕竟越来越多的用户开始对显卡的品质提出了较高要求。虽然通路厂商在低端依然大量出货廉价显卡,虽然没有属于自己的工厂,但他们已经在自主设计和产品选择方面迈出了一大步!

● AIC/AIB厂商走低价路线,价格战愈演愈烈

  作为NVIDIA/ATI的合作伙伴,AIC/AIB的产品一直以来都是做工出色、用料扎实的代名词,在玩家心目中拥有不错的口碑。但随着同质化趋势愈演愈烈,AIC/AIB也开始在稳中求变,一方面稳住高端,继续在品质、性能、超频方面下功夫;另一方面凭借扎实的研发功底,降低产品制造成本,在价格方面寻求突破,大打价格战抢占低端市场。


  老牌AIC大厂Inno3D就是最典型的例子,其主打高端的iChiLL冰龙系列做工用料散热个方面的配置都无可挑剔,特色鲜明备受好评;而普通PCB、普通散热、普通显存、普通电容版本的8600GT率先杀至699元,关注度极高且销量可观!这两种不同版本的8600GT显卡价格差据不小,定位于不同的人群。


● 一分价钱一分货,电容缩水见怪不怪

  对于显卡厂商来说,不可能只是按照NVIDIA/ATI公版规格做产品,那样产品线太单一了。几乎所有的厂商针对某一型号产品都有很多种版本,如标准版、超频版、公版、非公版等等,为了扩充产品线,出于和对手竞争或者打价格战的需要,即便是相同的PCB也要衍生出好几个版本。
  于是降低电容规格、显存规格、散热器成为了家常便饭,尤其是将固态电容更换为普通电解液电容的做法很常见,这就是大家通常说的“缩水”,但缩水的好处也是显而易见的,一款产品的价格立刻就能下降100-200元不等,对于很多人都有很大的诱惑力!

  高品质的版本由于使用了高档散热器、优秀的PCB、高档电容,成本比公版还要高,因此卖高价是可以接受的。而使用普通廉价铝电解液电容、老版PCB、普通散热器的显卡,成本显然大幅下降,但如果价格还是高高在上,从中赚取暴利的话就让人无法接受了!

● 高品质固态电容将会得到更加广泛的使用

  性质稳定、耐高温、容量较大、ESR值低、寿命长……,高分子固体聚合物电容拥有如此之多的优点,即便价格高达普通电解液电容的十倍,还是得到了越来越广泛的使用,并且开始部分取代钽电容和陶瓷电容,这与近年来电容产业技术的发展是密不可分的。

  对于显卡的做工来说,PCB设计是始终第一位的,在PCB相同的情况下有机半导体电容肯定要强于铝电解液电容,而高分子聚合物又要强于有机半导体,这从电容的各项参数指标以及阴极的特性就很容易理解。如今NVIDIA和ATI的公版显卡默认就使用全固态电容,各类以品质和超频为卖点的显卡在用料方面更是丝毫不敢怠慢!

  显卡的频率和功耗在不断增长,因此对于供电模块设计和用料的要求是有增无减,高档固态电容是理所当然的首选。如果您对显卡的品质有较高要求,那么在电容的用料方面一定要多个心眼,自己权衡利弊:用料豪华的显卡是否划算、用料缩水的显卡是否值这个价!