精华内容
下载资源
问答
  • XP 的十二种方法

    千次阅读 2005-05-25 14:17:00
    XP 精华内容:企业问题一解决方案:灵活方法XP 的十二种方法一起工作方法为什么 XP 很重要参考资料 作者简介对本文的评价订阅:developerWorks 时事通讯如何使 Java 项目获得更大成功Roy W. Miller, 软件开发人员...

    XP 精华
    内容:
    企业问题
    一种解决方案:灵活方法
    XP 的十二种方法
    一起工作的方法
    为什么 XP 很重要
    参考资料
    作者简介
    对本文的评价
    订阅:
    developerWorks 时事通讯
    如何使 Java 项目获得更大成功

    Roy W. Miller, 软件开发人员, RoleModel Software, Inc.
    Christopher T. Collins, 高级软件开发人员, RoleModel Software, Inc.

    2001 年 3 月

    使用 Java 语言所进行的面向对象编程变得空前普及。它使软件开发发生了某种程度上的变革,但最近的研究表明,有半数软件开发项目滞后,而三分之一的项目则超出预算。问题不在于技术,而是开发软件所使用的方法。所谓的“轻量型”或“灵活”方式,与如 Java 这样的面向对象语言的威力和灵活性结合起来,提供了一种很有意思的解决方案。最常见的灵活方式称为极端编程(Extreme Programming)或者 XP,但许多人并不真正了解它。对 Java 项目使用 XP 可以大大增加成功的机会。本文提供了 XP 的概述,并解释了它为什么很重要 -- 不是传言,也没有骗局。

    在过去的十年中,CEO 们在产生稳步增加的收入方面面临巨大的压力。他们通过在许多方面采取一系列举措来解决这一问题,例如缩小公司规模、外包、再工程、企业资源规划 (ERP) 等等。这些对低效率的解决措施让 S&P 500 中的许多企业在 90 年代末能够连续几年保持两位数的收入增长。但这种方式也带来了一些负面影响。

    在 Gary Hamel 所著的 Leading the Revolution(请参阅 参考资料)一书中,他声称已有一些迹象证明传统企业模式的优势已不那么明显。我们必须找到一些替代方法来为收入的持续增长提供动力。他建议唯一能让公司继续增长的办法是进行一次彻底的创新。我们认为在软件开发领域中尤其需要这样。

    企业问题
    如果使用标准软件开发方法,那么即使在 Java 平台上进行开发,也要做好失望的准备。如图 1 所示,最近的研究表明,有一半项目将滞后,而三分之一的项目将超过预算。这一推测比 1979 年由美国总审计局的研究结果好不了多少。

    图 1. 软件项目成功和失败,过去和现在
    软件项目成功和失败的统计

    如果我们希望这些数字有显著提高,则需要彻底创新的方法来开发软件。有两个主要因素影响现有的方法:

    • 惧怕失败
    • 对软件本质的误解

    没有人打算失败。具有讽刺意味的是为使失败最小化而创建的方法是失败的。对软件的误解是问题的根源。恐惧实际上只是一种症状。现有的方法是由那些有良好愿望但忘记了软件中的“软”的那些聪明人所创建的。他们假定开发软件就象造桥。因此他们从各种设计规范中借鉴了一些适用于“硬”物体(例如桥梁)的最优方法。结果是基于 Big Design Up-front (BDUF) 思想的反映迟钝的开发方法,软件不堪一击,人们无法使用它们。

    一种解决方案:灵活方法
    最近发生了一些转变,从所谓的“重量型”方法转向了“轻量型”或“灵活”方法,例如 Crystal 方法、适应性软件开发和(当前最流行的)XP。所有这些过程都有这样一个事实,即需要人们共同来开发软件。成功的软件过程必须将人们的长处最大化,将他们的缺点最小化,因为优点和缺点毋庸质疑都存在。在我们看来,XP 最出色的地方在于它能够解决所有影响参加人员的互补力量。

    XP 提供了十年来最大的一次机会,给软件开发过程带来彻底变革。就象 Peopleware 作家 Tom DeMarco 所说,“XP 是当今我们所处领域中最重要的一项运动。预计它对于目前一代的重要性就象 SEI 及其能力成熟度模型对上一代的重要性一样。”

    XP 规定了一组核心价值和方法,可以让软件开发人员发挥他们的专长:编写代码。XP 消除了大多数重量型过程的不必要产物,通过减慢开发速度、耗费开发人员的精力(例如干特图、状态报告,以及多卷需求文档)从目标偏离。我们认识到一个称为“极端编程”的东西可能很难作为正式的开发过程推荐给管理层,但如果您的公司从事软件行业,您应该帮助管理层绕过其名称认识到 XP 可以提供的竞争优势。

    Kent Beck 在他所著的 Extreme Programming Explained: Embrace Change一书中概括了 XP 的核心价值(请参阅 参考资料)。我们对它们进行了总结:

    • 交流。 项目的问题往往可以追溯到某人在某个时刻没有和其他人一起商量某些重要问题上。使用 XP,不交流是不可能的事。
    • 简单。 XP 建议您总是尽可能围绕过程和编写代码做最简单的事情。按照 Beck 的说法,“XP 就是打赌。它打赌今天最好做些简单的事...而不是做更复杂但可能永远也不会用到的事。”
    • 反馈。 更早和经常来自客户、团队和实际最终用户的具体反馈意见为您提供更多的机会来调整您的力量。反馈可以让您把握住正确的方向,少走弯路。
    • 勇气。 勇气存在于其它三个价值的环境中。它们相互支持。需要勇气来相信一路上具体反馈比预先知道每样事物来得更好。需要勇气来在可能暴露您的无知时与团队中其他人交流。需要勇气来使系统尽可能简单,将明天的决定推到明天做。而如果没有简单的系统、没有不断的交流来扩展知识、没有掌握方向所依赖的反馈,勇气也就失去了依靠。

    XP 的方法将这些价值转换成开发人员每天应做的事情。这里没什么新鲜内容。多年以来,行业认识到 XP 方法是“最优方法”。实际上,XP 中的“极端”来自两方面:

    • XP 采取经过证明的业界最优方法并将其发挥到极致。
    • XP 将这些方法以某种方式进行结合,使它们产生的结果大于各部分的总和。

    这是怎样的情景呢?代码复查是个好的做法,因此始终通过成对地编写代码来做到。测试也是个好的做法,因此总是通过在编写代码之前编写测试来做到。文档很少与代码保持一致,因此只做那些最需要的事,余下的部分则取决于明确编写的代码和测试。XP 不保证人们总做正确的事,但它允许人们这样做。它将这些“极端”方法以一种相互支持的方式结合起来,显著提高了速度和有效性。

    XP 的十二种方法
    XP 的十二种方法(如图 2 所示)将其定义为规则。让我们仔细研究每一个方法来对“执行 XP”表示什么有个更全面的理解。

    图 2. XP 的十二种方法

    规划策略
    有些人会指责 XP 是一种美其名的剽窃,只是一群牛仔在没有任何规则的情况下将一个系统拼凑在一起。错。XP 是为数不多的几种承认您在开始时不可能事事通晓的方法之一。无论是用户还是开发人员都是随着项目的进展过程才逐步了解事物的。只有鼓励和信奉这种更改的方法才是有效方法。状态限定方法忽视更改。而 XP 则留心更改。它倾听所用的方法就是“规划策略”,一个由 Kent Beck 创造的概念。

    这一方法背后的主要思想是迅速地制定粗略计划,然后随着事物的不断清晰来逐步完善。规划策略的产物包括:一堆索引卡,每一张都包含一个客户素材,这些素材驱动项目的迭代;以及对下一两个发行版的粗略计划,如 Kent Beck 和 Martin Fowler 在他们的 Planning Extreme Programming中描述的那样(请参阅 参考资料)。让这种形式的计划得以发挥作用的关键因素是让用户做企业决策,让开发小组做技术决策。如果没有这一前提,整个过程就会土崩瓦解。

    开发小组要决定:

    • 估计开发一个素材要花多长时间
    • 使用各种技术选项所花费的成本
    • 团队组织
    • 每个素材的“风险”
    • 迭代中素材开发的顺序(先开发风险最大的那一个可以减轻风险)

    客户需要决定:

    • 范围(一个发行版的素材和每一次迭代的素材)
    • 发行日期
    • 优先级(根据企业价值先开发哪些特性)

    规划经常发生。这样,在客户或开发人员学习新事物的同时,就为他们调整计划提供了频繁机会。

    成对编程
    使用 XP,成对的开发人员编写所有产品代码。这种方式听上去好象缺乏效率。Martin Fowler 说,“当人们说成对编程降低生产力时,我回答,‘那是因为大多数耗费时间的编程部分是靠输入来完成的。’”实际上,成对编程无论在经济还是其它方面都提供了许多好处:

    • 所有设计决策都牵涉到至少两个人。
    • 至少有两个人熟悉系统的每一部分。
    • 几乎不可能出现两个人同时疏忽测试或其它任务。
    • 改变各对的组合在可以在团队范围内传播知识。
    • 代码总是由至少一人复查。

    研究还显示成对的编程实际上比单独编程更有效(有关详细信息,请参阅 参考资料 中 Alistair Cockburn 和 Laurie Williams 所著的 The Costs and Benefits of Pair Programming)。

    测试
    在 XP 中有两种测试:

    1. 单元测试
    2. 验收测试

    开发人员在他们编写代码的同时编写单元测试。客户在他们定义了素材后编写验收测试。单元测试及时告诉开发人员系统在某一点上是否“工作”。验收测试告诉团队系统是否执行用户希望它执行的操作。

    假设团队使用的是如 Java 这样的面向对象语言,开发人员在为一些方法编写代码之前为每种有可能失败的方法编写单元测试。然后他们编写足够的代码使之能通过测试。有时人们会发现这有点奇怪。答案很简单。编写测试首先为您提供:

    • 一组可能最完整的测试
    • 可能能工作的最简单的代码
    • 代码意图的明确景象

    开发人员只有在通过所有单元测试后才可以将代码检入到源代码资源库中。单元测试使开发人员有信心相信他们的代码能够工作。这为其他开发人员留下线索,可以帮助他们理解最早的开发人员的意图(实际上,这是我们看到过的最好的文档)。单元测试还给了开发人员勇气重新划分代码,因为测试失败可以立刻告诉开发人员存在错误。应该将单元测试自动化,并提供明确的通过/失败结果。xUnit 框架(请参阅 参考资料 )做到的远不止这些,因此大多数 XP 小组都使用它们。

    用户负责确保每个素材都有验收测试来确认它们。用户可以自己编写测试、可以征募组织中的其他成员(例如 QA 人员或业务分析员)编写它们,也可以将这两种方法结合起来。测试告诉他们系统是否具有应该具有的那些特性,以及是否可以正确工作。理想情况下,用户在迭代完成之前就应该写好迭代中那些素材的验收测试了。应该将验收测试自动化,并要经常运行来确保开发人员在实现新特性时没有破坏任何现有的特性。通常情况下,客户需要来自开发团队的某些帮助来编写验收测试。我们对一个项目开发一个可重用的自动验收测试框架,可以让用户在简单编辑器中输入他们的输入和所期望的输出。框架将输入转换成 XML 文件、运行文件中的测试,然后为每个测试显示“通过”或“失败”。客户喜欢这一做法。

    不是所有验收测试都必须在所有情况下通过。问题是验收测试帮助客户衡量项目“完成”的情况如何。它们还可以让客户获悉有关某些事物是否可以发行的决定。

    重新划分
    重新划分是在不更改功能性的前提下对代码加以改进。XP 小组在进行重新划分时毫不手软。

    开发人员重新划分有两个重要时机:实现特性之前和之后。开发人员尝试确定更改现有代码是否可以让新特性的开发更容易。他们查看刚刚写好的代码,看是否有方法可以对它进行简化。例如,如果他们认为有抽象的机会,就会进行重新划分来从具体实现中除去重复的代码。

    XP 建议您应该编写可能运行的最简单的代码,但同时也建议您应该不断学习。重新划分让您将学到的知识加入到代码中,同时又不会破坏测试。它使您的代码简练。这意味着它可以存在相当长的时间、为以后的开发人员引入更少问题,并为他们指引正确的方向。

    简单的设计
    XP 的诽谤者说该过程忽略了设计。事实不是这样。问题是重量型方法建议您做的不过是提前完成大部分琐碎的设计任务。这就象是拍一张静态的地平线的照片,静止不动,然后尝试画一张如何到达那里的完美的地图。XP 说设计不应该在事物将保持不变的前提下预先仓促进行。XP 认为设计非常重要,因此应该是一个持续的事务。我们总是先尝试使用能够工作的最简单的设计,然后随着现实的不断显现来更改它。

    什么是可能工作的最简单的设计?它是符合以下条件的设计(感谢 Kent Beck 为我们一一列出):

    • 运行所有测试
    • 不包含重复代码
    • 明确陈述程序员对所有代码的意图
    • 包含尽可能最少的类和方法

    对简单设计的需求并不是说所有设计都很小,也不表示它们是无足轻重的。它们只不过需要尽可能简单,但是仍能工作。不要包括不使用的额外特性。我们称这样的事物为 YAGNI,表示“您将不需要它(You Aren't Going to Need It)。”不要让 YAGNI 破坏您成功的机会。

    集合体代码所有权
    小组中的任何人都应该有权对代码进行更改来改进它。每个人都拥有全部代码,这意味着每个人都对它负责。这种技术可以让人们对部分代码进行必要的更改而不用经过代码拥有者个人的瓶颈。每个人都负责这一事实消除了无代码所有权所带来的混乱。

    “每人拥有所有代码”与“没人拥有代码”的说法并不一样。没人拥有代码时,人们可以随处进行破坏而不必负任何责任。而 XP 说,“如果是您破坏的,应该您来弥补。”我们有一些必须在每次集成之前和之后运行的单元测试。如果您破坏了某些事物,您要负责进行修补,无论它位于代码的哪一部分。这需要极端规则。可能这是名称中带有“极端”的另一个原因。

    持续的集成
    经常进行代码集成可以帮助您避免集成梦魇。XP 团队在一天中集成了代码几次,每次都在所有单元测试对系统运行后执行。

    传统方法工作方式如下:编写大量代码后执行一次大爆炸式的集成,然后花费相当长的时间来改正问题。这种笨拙的形式的确使项目速度减缓。大爆炸式的集成给团队立即带来大量问题,并且这些问题通常都有几百种可能的原因。

    如果经常进行集成,任何特定集成失败的原因都会非常明显(以前运行过测试,因此错误一定是新事物犯下的)。使用这种方法,当遇到问题时,可能的原因就相当有限。修改起来更容易,花的时间少得多,使团队保持最快速度前进。

    现场客户
    要使功能最理想,XP 小组需要在现场有一位客户来明确素材,并做出重要的企业决策。开发人员是不允许单独做这些事情的。让客户随时在场可以消除开发人员等待决策时出现的瓶颈。

    XP 不会假装素材卡是开发人员交付必要代码所需的唯一指示。素材是对以后在客户和开发人员之间填写细节的对话的一项承诺。与将所有要求写在一个静态文档中不同,其思想是进行面对面的交流,减少产生误解的机会。

    我们发现让客户在现场是可能最好的一种情形,但这不是解决问题的唯一方案。底线是客户必须随时在需要回答问题和根据企业价值为团队提供指示时有空。如果客户并非在现场专职陪伴团队的情况下就能做到这些,那很好。如果能和团队待在一起,这会更方便,但只是建议而已。

    小发行版
    发行版应该尽可能地小,同时仍然提供足够的企业价值以证明它们值得。

    只要觉得有意义就可以发布系统。这样就尽可能早为用户提供了价值(请记住,今天的钱比明天的钱来得值钱)。小发行版将为开发人员提供具体的反馈意见,告诉他们哪些符合客户需要,哪些不符合客户需要。然后,小组可以将这些经验教训包括在其下一发行版的规划中。

    一周 40 小时
    Kent Beck 说他希望“...每天早晨都感到有活力有激情,每天晚上都感到疲惫而满足。”一周 40 小时工作可以让您做到这一点。确切的小时数并不重要,重要的是原则。长时间地持续工作会扼杀工作绩效。疲劳的开发人员会犯更多错误,从长期来说,将比按“正常”时间表进行的开发慢得多。

    即使开发人员可以在长时间很好工作,这也不意味着他们应该这样。最终他们会厌倦,会离开他们的工作,或者产生影响他们工作绩效的非工作问题。如果您打乱了人们的生活,将会尝到它所带来的恶果。加班并不是解决项目问题的答案。实际上,它是更大问题的症状。如果您要走向灭亡,就无药可救了。

    编码标准
    拥有编码标准有两个目的:

    • 防止团队被一些例如事物没有以最大速度发展这种无关紧要的愚蠢争论搞得不知所措。
    • 它支持其它方法。

    如果没有编码标准,重新划分代码会更加困难,按应当的频度交换对更困难,快速前进也更困难。目标应该是团队中没有人辨认得出是谁写的哪一部分代码。以团队为单位对某一标准达成协议,然后遵守这一标准。目标不是创建一个事无巨细的规则列表,而是提供将确保您的代码可以清晰交流的指导方针。编码标准开始时应该很简单,然后根据团队经验逐步进化。不要预先花费太多时间。创建能够工作的最简单标准,然后逐步发展。

    系统比喻
    体系结构是做什么用的?它提供了系统各种组件以及它们是如何交互的画面 -- 一种映射,可以让开发人员了解新的代码部分适合放在哪里。

    XP 中的系统比喻与大多数方法称作的体系结构差不多。比喻为团队提供了一致的画面,他们可以用它来描述现有系统的工作方式、新部件适合的位置,以及它们应该采取的形式。

    重要的是要记住,关键要让每个人理解系统是如何组合在一起的,而不是美丽的比喻。有时您就是无法想到一个好的比喻。想到时就太好了。

    一起工作的方法
    整体大于各个部分之和。您可以实现单一方法或一小部分方法,比不使用任何方法得到更大收益。但您只能在实现所有方法的情况下获得最大收益,因为它们的力量来自它们之间的交互。

    最初时按照书籍来执行 XP,作为基准。一旦理解了如何进行交互,就拥有了将它们适应于自身环境所需的知识。请记住,“进行 XP”不是目的,而是到达终点的一种手段。目标是快速地开发高级软件。如果您的过程有一些变异,已称不上是在进行 XP,但结果仍能让您战胜所有竞争对手,您已经成功了。

    为什么 XP 很重要
    坦率地说,XP(或者任何其它灵活方法)根本就不重要。它能够产生的 结果 才是关键。如果如 XP 这样的灵活方式可以帮助您更快地开发更好的软件而少受痛苦,那么它值得考虑。

    还记得我们在这篇文章开始时提到的那些令人生畏的数字吗?我们相信使用 XP 开发面向对象软件可以有机会将它们变得更好。目前我们的经验已经证实了这一信念。

    参考资料

    作者简介
    Roy W. Miller 是 RoleModel Software, Inc 的软件开发人员。在 RoleModel 期间,Roy 开发了基于 Java/XML 的自动验收测试框架,并为 Dallas Semiconductor 的 TINI Java 平台创建了几个应用的原型。在加盟 RoleModel 之前,他在 Andersen Consulting(现在是 Accenture)中服务了六年,用过他们的专用重量型商业集成方法 (MIB) 及其变体。自从加盟 RoleModel 后,他获得了许多有关 XP 以及对该方法的本地适应的经验。Roy 与他人合著了 Addison-Wesley XP 系列中的一本书( XP Applied ,将于 2001 年 10 月出版),并是在 XP2001 "Business of XP" 展示会上的一名特邀专题讨论小组成员。可以通过 rmiller@rolemodelsoft.com 与 Roy 联系。


    Christopher T. Collins 是 RoleModel Software, Inc 的高级软件开发人员。在 RoleModel 期间,Chris 参与了运行将近两年的一个 XP 项目,为新的摩托罗拉蜂窝式电话平台开发了一个嵌入式 Java 应用程序,并将 JUnit 移植到 Sun 的 J2ME 平台上运行。在加盟 RoleModel 之前,他花了 5 年的时间使用许多不同的语言为一些组织开发软件,最近的一次是为美国国防部开发应用程序。他拥有使用和适应涉及几种灵活和重量型的不同开发方法的经验,包括 RUP 和 XP。Chris 拥有美国西佛罗里达大学计算机科学和软件工程的硕士学位,目前在北卡罗来纳州立大学教授 Java 编程课程。他曾是杜克大学有关 XP 的特邀演讲人,并将在 XP2001 上介绍有关过程适应的论文。通过 ccollins@rolemodelsoft.com 与 Chris 联系。

    展开全文
  • 36简便、有效的记忆方法(摘抄)

    千次阅读 2009-09-12 03:34:00
    1.与物相联法 将要记的内容和与之相关的物结合在一起,通过物的形象或意义记忆所记内容的方法。 这种方法一般用来记忆生字词或外语单词。它是借助联想在记忆中的作用,通过熟知的...可见它是一简明方便有效的记忆方法

     1.与物相联法
      将要记的内容和与之相关的物结合在一起,通过物的形象或意义记忆所记内容的方法。
      这种方法一般用来记忆生字词或外语单词。它是借助联想在记忆中的作用,通过熟知的事物或其意义把新内容与其联系起来记,再通过物及其含义把新内容回忆起来的记忆方法。
      与物连接,可以在脑海里加深所记内容的形象,容易记住;可以凭借这个中介,回忆再现;可以因经常接触而重复记忆。可见它是一种简明方便有效的记忆方法。
      例如初学识字的儿童,可以把"桌"、"椅"、"沙发"、"墙壁"、"窗台"、"门"、"书柜"、"衣架"等字词写成纸片,贴在相应的物上,看物识字,随见随记。又如记忆英文中的缀词,也可以在卡片上写下来,把有"……之上"意思的super-、 extra-贴在天花板上 ,把有"下"的意思的如sub- 、under-贴在桌子玻玻璃板下,前面的墙壁贴per-、pro-、ante-(前),后面的墙壁贴 post-、 re-(后),这样每次看到纸片上的单词,都会与物的背景联系起来,一同记入脑海,达到加强记忆的目的。
      
      2.联系愉快经历法
      把所要记忆的事物同自己的愉快经历联系起来以增强记忆的方法。
      这种方法一般用来记忆某些枯燥无味的内容。它也是利用联想在记忆中的作用并增加趣味的记忆方法。现代心理学家弗洛伊德认为,凡是威胁自我的记忆,都被打入潜意识的控制范围内,无法爬升到意识的阶层上来。痛苦的经历往往在梦中出现,这是因为人在入睡时,防线松懈,潜意识里的记忆趁机溜进意识范围里来的缘故。不管记忆什么,如果以极其痛苦的心情来记,不久就会被打入潜意识的冷宫。如果联系愉快经历记忆,则既可以提高记忆的兴趣加深印象,又可以通过对愉快经历的回忆,联想起记忆的内容。
      如记忆生物知识,联系假日到野外旅游时接触各种动植物的愉快情形,记忆关于大海的描写时联系海滨避暑时的美好享受,记忆人名时联系和他(她)在一起的趣事等都会取得好的记忆效果。就是记忆单调的生词,也可以把它包在愉快的事情里记,这如同将药包在糖衣里服用一样,不管多难,都可以顺利地装入脑海。
      
      3.触景生情记忆法
      凭借接触过的景致回忆材料的方法。
      这种方法多用于回忆自己的实践活动或记忆与其相关的材料。关在屋子里读书,常常因为搞不清具体形象而使记忆淡薄。如果身临其境,借助其景,既可用具体形象的帮助使记忆深刻,又可在景致联系诱导下轻松地回忆出有关内容,因而是较好的记忆方法。
      比如旧地重游,常常触景生情,使往事历历在目,这是回忆旧事写回忆录的很好的方法。又如游览名胜古迹,结合景致记忆古人对名胜的描写或曾经在这里发生过的历史事件等,会有接触实物所产生的可信感,可以强化理解和记忆,当回忆这些曾记过的内容时,会因曾身临其境而感到亲切,会借助这些景致联想起曾记过的内容。
      把记忆的内容和记忆时周围的景致联系起来,也可以增加回忆的中介。有个人在经过北京广播大厦时记住了一段英文材料,以后每当他想起广播大厦,便回忆起当时的内容,尝到了触景生情记忆法的甜头。
      
      4.比喻记忆法
      用人们较为熟悉的事物来比喻识记内容来提高记忆效率的方法。这种方法有广泛的适用性。
      比喻即打比方,以此物喻彼物。生动贴切的比喻具有形象的特点,容易造成头脑中的感性形象;具有新颖性的特点,能给人以鲜明的刺激,便于集中注意;具有通俗浅显的特点,使人减轻记忆的负担。运用比喻记忆法,实际上是增加了一条新的类比联想的记忆线索,帮助打开记忆的大门,既利于记又利于回忆,因而是一条有效的记忆方法。
      如记忆哲学原理,可以把普遍联系的原理比喻成网,把不同质的矛盾用不同的方法比喻成对症下药、量体裁衣,把具体问题具体分析比喻成一把钥匙开一把锁等等。
      
      5.转移记忆法
      本来记住的材料或事物一时回忆不起来时,避开绞尽脑汁的硬想,把思绪转移到所要回忆的内容的周围去寻找线索,最后达到对所记忆内容的回忆的方法。
      这种方法多用于精神比较紧张的时候。一个人若是回忆不出所需要的材料或事物,如果绞尽脑汗硬想,常常越想越急越紧张,致使头昏脑胀而无结果。这时有效的方法是转移注意力,暂时停止直接回忆,而到所记材料的周围去寻找线索,等到抑制自动解除,由新的线索获得联想、 启发,就能回忆出所要记忆的内容。
      如一个人丢了东西,心中着急,东西丢在何处?硬想也想不出来,这时不妨转移一下,想想自己怎样到这里的,在这之前又在哪儿,到什么地方去过,由时间的过程推展到空间的移动,再由种种周围状态诱导出遗失物品的场所来。
      
      6.运用地图记忆法
      运用地图记忆地理知识的方法。
      这种方法既可用于记忆地名、地理位置及与之相关的材料,也可灵活运用于记忆历史事件的空间轨迹、历史人物的行踪等与地理现象有关的知识。
      地图是地球表面的现象用投影等方法描绘在平面上的图形,它运用颜色、符号和注记概括地反映各种事物和现象的地理分布、相互联系,具有直观形象的特点。记忆地理知识时可以凭借这个形象,利用地图上的联系,达到清晰牢固的记忆。如记忆地名,首先在地图上找到该地的正确位置,进而弄清其经纬坐标及该地特征,而且要着力弄清该地与重要山脉、河流、城市的相对位置,然后检查记忆结果,自己试填,看位置掌握得是否正确。实践证明,运用地图形象与否,效果大不一样。运用地图形象,记忆效果好得多。
      
      
      7.图示记忆法
      通过对图形识记来增强记忆效果的方法。此法适应性广。
      据心理学家研究,用文字识记和用形象识记材料的记忆效果相差悬殊,物体的视觉形象比词的视觉形象容易记,而且可以保持长久。利用图表、图示等形式把知识之间的联系和关系表现出来,既便于理解,又便于记忆。
      如到一个新城市或游览新公园之后,对照地图或导游图回忆途中所见,印象十分深刻。采用图示记忆法,需要尽可能地将识记对象分析加工,使其图示化,这个过程可以加深对材料的理解,加深印象,获得的图形形象,简洁,便于记忆,利于通过联想进行回忆。使用现成图形时,应正确理解图形含义,再按图示去记忆,这样才能收到准确、持久的记忆效果。
      如学习物理中的"距离、速度、时间"以及"电压、电流、电阻"的关系时可以采用下图记忆。

    距离
    速度
    时间

    电压
    电流
    电阻
       8.交谈记忆法
      在和他人的交谈中,把自己尚未扎根的记忆或没有自信的记忆经过证实、修改、补充变成确实的记忆的方法。
      这种方法可广泛应用于记忆各种材料或事物。俗话说,"与君一席话,胜读十年书。" 意思是在与人交谈时不仅可以学到许多新鲜的知识,而且可以获得很好的记忆。培根说过,谈话使人敏捷。谈话之时一般精力集中,对所谈的内容引起高度注意,这是加强记忆的良好心理基础。谈话中有问有答,有自己说有对方说,可以相互证实、修正、补充,这样,使自己原有正确的记忆得到加深,原有不正确的记忆得到纠正,原有的不完善的记忆得到补充,因而是记忆的很好的方法。
      有经验的学生在复习时,常常采用交谈记忆法,甲提出问题,乙谈谈自己的答法,乙提出一个问题,甲说说自己的答案,互相切磋,收到很好的记忆效果。采用此法,还能发现自己的主观片面性,弥补学习中的不足。
      
      9.争论记忆法
      通过与别人就学习材料进行争论探讨以强化记忆的方法。
      这种方法多用于记忆较难的材料。争论记忆法符合人脑活动的规律,争论时双方处于高度紧张的状态,全神贯注地听取对方的意见,积极思维,评判对方,阐述己见,因而对学习材料有深刻的理解,能从不同角度分析并建立联系,使这些内容在大脑中留下极深刻的印象,并且便于回忆联想。争论中原先记忆不准确的地方会被揭露,得到纠正,从而形成正确的记忆;原来正确的记忆则受到检验应用,从而更加巩固和深入。争论中还可以开阔视野,并通过"胜败"的强烈刺激加深印象。
      采用这种方法需要端正动机,为了理解记忆而不是为了逞强出头;需要端正态度,要坚决反对错的,不钻牛角尖,不固执己见,尊重真理;需要方法对头,不要跑题而要深入。
      很多人都是从争论中获得裨益的。爱因斯坦本来不会"黎曼几何",正是同好友的学习讨论争辩中懂得并掌握了这门知识,从而为他后来发现相对论打下了基础。
      
      10.红色标记记忆法
      对非记住不可的重点内容用红色彩笔在书上或笔记中做上标志的记忆法。
      这种方法一般在听讲或复习时使用。把记忆的重点内容作记号标出,可以引起大脑注意,加深记忆的印象。用红色尤其可以唤起注意力,突出这些内容的重要性,同时获得非记住不可的动机,往往取得较好的记忆效果。
      使用此法需要准确地确定重点内容,否则如果全是重点一片红就无法达到预期的目的;如果重点存在偏差,又可能会漏掉有用的而记住太多用处不大的知识,得不偿失,事倍功半。
      
      11.理解记忆法
      此法又称意义记忆法,与机械记忆法相对称。其实质在于利用知识,利用已获得的联系,经过思考把握记忆内容内部联系。这是学习记忆各种材料或事物的最常用的方法。
      所谓理解,就是利用已有的知识经验去获得新的知识经验,并把它纳入已有的知识经验的系统之中,即在已有的暂时的神经联系的基础上去建立新的神经联系,并把新旧联系组成一个系统。
      理解一般可以分为两种:直接理解,一目了然;间接理解,经过积极的分析、综合才能明白。理解和记忆紧密联系,理解越深,记忆越牢,若要记住必先懂得。理解能使记忆内容"活化",是记忆的催化剂。对记忆内容越理解,越能使大脑思维的暂时神经联系变得更活跃,从而形成种种反思、联想,产生更为良好的记忆效果。如果不理解记忆对象的含义,就不容易记住,即使勉强记住了,也很容易遗忘。"强记不如善悟"的道理即在于此。
      理解是记忆的基础,是克服遗忘的有力手段。古今中外的记忆实践及心理学的种种实验,都证明理解记忆法的优越性。
      采用理解记忆法,要弄清记忆对象的含义、意义,要经常重复已经记忆的材料,使理解不断加深,要把获得的知识应用到实际生活中去,要善于将已有知识和要记的知识相沟通,建立新的联系。
      如记忆一篇文章,要理解其中心思想,理解它的结构及各部分的含义、各部分之间的关系,要理解文章阐述的问题发生原因和结果等等。这样,把握了文章的内部联系并使文章内容同已有知识联系起来,记忆起来就容易了,并且准确、牢固得多。
      
      12.推理记忆法
      通过相互推导来帮助记忆的方法。此法多用于数理知识的记忆。
      人们要记住一个结论,最好的办法是寻找与这相关的东西来建立联想,而推理恰是与结论关系最密切、最直接的东西,而且二者之间的联系是本质的恒定的,掌握了推理过程就能轻易记住结论,即使一时忘了也能重新推导出来,因而推理记忆法是行之有效的记忆方法之一。
      如要记忆代数公式(a+b)^2=a+2ab+b。应该从两项式的自乘、交叉相乘的推理过程去记,这样不仅易于记住结论,而且在遗忘时可以再推导出来。
      
      13.规律记忆法
      寻求和推导记忆对象中本质的、必然的联系加以记忆的方法,任何事物都有规律可寻,找到了规律就可以取得非常好的记忆效果。因为规律是有普遍性、重复性的特点,抓住共性,就能联系个性。
      规律记忆法是一种高级的记忆方法,其最直接、最突出的优点是可以减轻大脑记忆的负担,从而掌握一把可以解开许多难题的钥匙。
      有位老师在黑板上写下一串数字:1627384950,让学生看一会儿后抹去,这时一位同学立即正确地回答出了这串数字,大家无不佩服他的记忆速度和精度。原来他抓住了其中的规律:奇数位依次为12345,偶数位依次为24680。
      数学中两角和与差的三角函数有几十个公式,有的学生抓住两角差的余弦公式这个根基推论,很轻松地记住了40多个公式。又如任意角的三角函数有36个诱导公式,懂得"奇变偶不变,符号看象限"的规律,就可以推导出各种情况,节省大量的精力。再如,现代汉语中构成句子的成分十分复杂,有人摸索它的规律:"主谓宾,定状补,主干枝叶分清楚。基本成分主谓宾,附加成分定状补。定语必在主宾前,谓前为状谓后补。"记住这个规律,就可很容易地划分句子成分,并且记住划分句子成分的诸多规定。
      
      14.小插曲记忆法
      利用与记忆对象相关的小插曲,以增加趣味提高兴趣、增强记忆的方法。
      小插曲奇特有趣,令人难忘,把记忆对象和与之相关的插曲联系起来记,利于回忆,是有效的记忆方法。
      如有位教师在讲到太平天国失败的原因时,一边第一第二地写提纲板书,一边掏手帕擦汗,但掏出来的不是手帕,而是一只袜子,引得大家哄笑不止。学生以这个插曲为媒介记忆,意外地收到了很好的效果。
      又如,有个教师正在讲生物的分类,恰巧一只麻雀飞进教室,而且被一个顽皮的学生抓住,虽然耽误了几分钟的上课时间,但这个小插曲却让学生一回忆生物分类的内容,就想到那只麻雀,结果这节课的内容记得十分深刻。
      历史事件中常涉及到名人的一些轶闻趣事,联系这些小插曲记忆历史事件,会容易得多。
      
      15.变换顺序记忆法
      复习所记忆的内容时改变当初记忆过程中的顺序以巩固记忆的方法。此法多用于复习时。
      复习很重要,没有记忆,复习可巩固记忆,如若复习方法不当,记忆率也无法提高。按记忆时的顺序复习是必要的,但有两个缺点:其一是开头和结尾的记忆较牢固,中间部分容易模糊不清;其二是按的顺序记忆因缺少变化而显得单调,缺少复习的兴趣。
      变换顺序复习可以克服这两个缺点:所记忆的各个部分都可能做开头和结尾,加深记忆;从自己感兴趣的部分复习起,或在改变顺序中获得兴趣可以获得复习的积极性。
      如复习哲学原理就可以改变本体论、辩证法、认识论、历史唯物论的记忆顺序,以后边的部分为起点复习,每部分中的顺序也可改变,以获得牢固的记忆。
      16.多角度重复练习记忆法
      对学习记忆过的知识,从各个不同的角度用练习的方法重复用于巩固记忆的方法。
      克服遗忘需要反复练习,但如果还象初次记忆时那样反复念,会使人产生厌烦情绪,不但效率不高,还会对大脑产生抑制。
      采用多角度重复训练法,会因角度新颖而有新鲜感,增加复习的兴趣;会因从不同角度理解所记忆的内容,使记忆深刻,便于联想;还会因为经历多种练习实践增强能力,所以会收到常学常新、乐于复习、记忆效果良好的结果,克服因"炒剩饭"而造成的厌烦情绪。
      如复习历史,可以从历史年代表、历史地图、历史人物、历史事件、历史评价等多角度做复习练习。又如复习外语单词,可以看英文背中文,背英文对照中文,也可以翻译包含这个单词的英文作品等。从多种角度重复练习,会使记忆的强度增加,也会使记忆持久。
      
      17.读背结合记忆法
      反复朗读和背诵按一定比例结合起来进行记忆的方法,此法多用于记忆语文、外语两科材料的记忆。
      朗读使口、眼、脑多种器官结合起来记忆,有较好的效果,但若不给以非背下不可的压力则容易懈怠。把朗读和背诵结合起来,既可发挥朗读在记忆中的作用,又给记忆以有力的驱动,因而是一种更为有效的方法。
      心理学家吉思特曾做过这样的实验,把被试者分成4组,分别用9分钟时间记住16个无意义的字母组合。A组以全部时间用于朗读;B组以3/5时间朗读,2/5的时间背诵;C组以2/5时间朗读,3/5时间背诵;D组以1/5的时间朗读,4/5时间背诵。结果A组的记忆率只有35%,D组达74%。4小时后再检查各组的记忆,A组只剩下15%,D组剩下48%,其余两组介于二者之间。这个实验说明:朗读和背诵的时间比例最好为1:4,以用于朗读材料的时间的4部时间来背诵材料,有助于增强读背结合法的记忆效率。
      
      18.集合相关记忆法
      把与记忆对象相关的内容集合在一起记忆的方法。
      记忆的巩固是以对记忆对象的注意、理解和暂时联系的牢固建立为基础的。把与记忆对象相关的内容集合在一起,会加深对这些内容的理解,引起注意使记忆对象丰满起来,形成深刻的印象,从而收到良好的记忆效果。
      以记姓名为例。现代社会的交往中记住对方的姓名很重要,然而孤立地记名字,常常会遗忘。如果将姓名连同与其相关的材料如职业、职务、工作单位、个人爱好、家庭住址、专长、性格甚至简历等等集合起来一起记,那么这个人就丰满起来了,在脑子中的印象就深刻了,他的名字及其他材料会牢固地记住。再如记忆外语单词,孤立地记一个单词单薄单调,容易忘记,若将这个生词连同它的词性、用法、意义、变化等集合起来记,印象会深刻得多,而且使知识得到扩展。
      
      19.归并记忆法
      把发生在同一年代的历史事件归并在一起进行记忆的方法。
      归并记忆法不只是为了记住几个事情发生于同一年代,也是为了建立回忆联想点,靠回忆联想点牢固记住并回忆出这些事件。
      如蔡和森生于1895年,伦琴于1895年发现X射线,孙中山在1895年领导乙未广州起义,把发生在1895年的几个事件一起记忆可以使它们相互联系起来。当想不起蔡和森的诞生年代时想到X射线的发现或孙中山第一次领导起义就可以回忆起1895年这个历史年代了。
      
      20.列表记忆法
      把所记忆的材料或事物排列成表加以对照、记忆的方法。此法可以广泛应用于各种知识的记忆。
      表者明也,表的作用在于提纲挈领地表列事物,以便一目了然地看清事理;可以把分散、零碎的材料组织起来,从整体上掌握记忆对象;可以把所要记忆的材料互相比较和分类,以便更清楚地看到表列内容的联系和区别的特点,从特征上记忆对象;还可以把先后学习的材料顺序排列、系统组合,从规律上掌握记忆对象。因而,列表记忆法是自古以来就被广泛地采用而且记忆效果甚佳的记忆方法。
      司马迁在《史记》中用了《三代世表》、《十二诸侯年表》等十表,目的就在于方便比较记忆。马克思在晚年作了一部很详尽的世界史年表,恩格斯把它定名为《编年史》,用以把分散的材料组织起来,方便记忆。鲁迅做《贾氏谱大要》表,使《红楼梦》中贾家诸多人物的复杂关系一目了然,十分好记。有许多同学在学习过程中,善于将相关的材料列成表格一齐记忆,收到了很好的效果。
      
      21.干扰变刺激记忆法
      在学习记忆时把本来使注意力分散、妨碍正常记忆功能的消极因素,变为刺激记忆力的诱导物,以突破记忆上的障碍,增强记忆效果的方法。
      这种方法多用于自学时等等易受干扰的环境。
      记忆对多数人来说也许并非一件令人开心的事情,因为记忆会增加大脑的工作负担,是非常辛苦的。每当大脑开始记忆时,往往会不由自主地浮现出自己更爱做的事,造成精力分散,妨碍正常的记忆。这些干扰因素使记忆的困难又多了一层,因此需要排除这些干扰。
      明智而机巧的办法是变消极因素为积极因素,利用这些杂念作为刺激记忆的诱导物,变阻力为动力,达到增强记忆的目的。
      如当学习记忆时想喝茶休息,想吃巧克力,想到外面散步,那么不妨把这些杂念作为达到某一记忆目标之后的奖品,在完成一段学习,达到一个记忆目标时,喝茶休息一下,在达到第二个目标时奖赏自己吃块巧克力。这样做虽不能算作高尚的表现,好象是哄小孩的把戏,但实际上却有惊人的记忆效果。
      
      22.缩略记忆法
      在所要记忆的材料中,浓缩概括出略语作为提示,做到以略语带内容的记忆方法。
      缩略可以简化、概括记忆的内容,减轻大脑的负担;缩略语具有提示性,可通过记住的缩略语这一中介联想到它所概括的内容。
      如学习化学中"氧化-还原"反应时,搞清电子得失与"氧化-还原"的关系,并判断什么物质是氧化剂、什么物质是还原剂是很重要的。用"失-氧-还"这三个字的缩略语即可概括这方面的知识:失去电子的物质--氧化了--这种物质是还原剂。这一缩略语起到了很好的提示作用,对于取得较好的记忆效果很有帮助。
      这种记忆法由于简明、省力、高效而在日常用语及宣传活动中得到广泛应用。如把工业现代化、农业现代化、科学技术现代化、国防现代化概括为"四化",把有理想、有道德、有文化、有纪律的新人概括为"四有新人"等等。
      
      23.概括记忆法
      对所记材料进行提炼、抓住关键部分的记忆方法。此法多用于记忆比较复杂的知识。
      对材料进行概括,需要积极的思维活动,经过充分思考,把精华提炼出来,这一过程会加深对材料的理解,提高对材料的认识,使自己站在抽象思维的高度通盘把握材料,概括得出"结晶体",言简意赅,有代表性,又容易与头脑中原有的知识联系挂钩,易记难忘。经过概括的材料,在量上大幅度减少,在质上成倍"增长",会显著提高记忆效率。
      采用概括记忆法可有多种形式:
      ①主题概括。一篇材料总有主旨,概括出它的中心主题,就能提出要领,记住它的全部内容。
      ②内容概括。选取关键性的字句,抓住梗概。如对井田制的内容,可以简化为"君有、侯用、奴耕、井形"。需要回忆再添枝加叶就可以了。
      ③简称概括。对较长的名词、概念赋予其新的简化名称。
      ④顺序概括。把识记材料按原顺序概括,记忆时突出顺序性。如对王安石变法的内容从顺序上可概括为"一青(青苗法)、二募(募役法)、三农(农田水利法)、四方(方田均税法)、五保(保甲法)。"
      ⑤数字概括。用数字概括识记材料的内容。如"三大纪律八项注意"、"四个坚持"等等。
      自然这些方法并不总是泾渭分明的,许多情况下,通过综合运用可以取得比单独使用好得多的记忆效果。
      24.条列式记忆法
      对复杂的记忆内容,抽取出简明的要点条文,靠清晰条文的排列达到对这些内容的记忆的方法。此法多用于记忆比较复杂的材料。
      人的记忆并非简单的堆积,而是以概念、原理的网储存在记忆中。对于复杂的记忆对象仅靠简单重复、机械背诵,往往事倍功半。
      最有效的办法是把这些内容条理化,抽取出要点条文,这样既可减轻大脑负担,又可通过条文这个纲把具体内容串起来,达到清晰的记忆。
      如历史唯物主义讲到人民群众是历史的创造者时,陈述了许多理由,记忆这部分内容时可采取条列式方法,从复杂的内容中抽出要点条文:"人民群众是社会物质财富的创造者,是社会精神财富的创造者,是社会变革的决定性力量。"靠排列的条文框架,把其中的具体内容串起来,就能达到对这一复杂内容的准确、清晰的记忆。
      
      25.系统记忆法
      按照记忆对象自身的始终一贯的条理和顺序记忆的方法。此法尤其适用于记忆复杂的材料。
      人们都有这样的体验:分散的、杂乱的、片断的知识不容易记,记不多,保持不长久;有条理的系统化的知识记起来则不难,而且也会长久地保持。这是因为记忆的过程是信息输入、编码、贮存和提取的过程,人脑不是被动地接受信息,如果学习者只偏重于向大脑输入信息而忽略对这些信息进行归类编目加工,那么所获得的知识是杂乱无系统的,这不利于记忆。
      记忆效率高条件在于输入信息进行分类编码,形成系统,这样大脑所接受的信息就会形成彼此融合的暂时神经联系的系统,使每个记忆痕迹之间联上"铁环",遗忘就不会轻易发生了,靠大脑中构成的信息链,能够造成联想的有利条件,一旦忘了,也容易回忆。
      采用系统记忆法,要求找出记忆对象的内部联系和秩序,在把它们送入大脑之前进行一番归类编目的工作,那么记忆起来就会清晰、准确,使头脑易于接受。
      假如要记忆下列的10个词:科学家、绿、狗、母亲、自行车、工程师、蓝、汽车、父亲、猫。可以归纳为:职业类的科学家、工程师,亲属类的父亲、母亲,颜色类的绿、蓝,交通工具类的自行车、汽车,动物类的猫、狗。然后按编目系统输入大脑,记忆就有力、准确、清晰、牢固了。
      
      26.脉络记忆法
      学习记忆系统的科学知识时,通过目录、提纲等把握知识体系的概貌和脉络,用以统率分散的片断的知识点的方法。此法多用于记忆较系统的内容。
      学习每一门学科,都需要记忆很多内容,如果仅按内容的先后记忆这些概念、原理,则费时、费力,而且还容易遗漏,混淆。
      采用脉络记忆法可以把模糊成片的记忆对象系统化,容易驾驭知识的整体,摆正片断在体系中的位置,不仅可以帮助记忆,而且能够顺利地通过脉络回忆出各部分的内容。采用这种方法就不会把书的目录只当作寻找页码的辅助工具了,而应把它当作脉络,并记忆这个脉络,以便一想目录,全书内容就一目了然了。
      另外,根据目录、提纲等脉络,还可以决定学习记忆的进度,并使前后记忆的内容在脑海中联系起来。也可以将目录上的章节作为论述问题的提纲,看了目录就可以想到内容,最后达到征服全书的目的。
      
      27.纵横交错记忆法
      把记忆对象放在横的和纵的各种关系中进行记忆的方法。
      事物的内在联系呈纵横的立体状。记忆时如能找出这些联系,则可加深对记忆内容的理解,并把它置入知识的网络,记入脑海。而且借助纵向、横向的联系,便于通过联想回忆出这些内容,可以产生纲举目张的记忆效果。
      如对于历史人物,既要从本国发展史的纵向朝代序列来把握,又要从该时代横断面上与别国的人物、事件联系起来加以考察。这不但有助于对本国史的记忆,而且能很容易地把同时代世界各国历史的关系牢牢地收进记忆。
      又如,欧洲有许多国王的名字叫查理,要记住他们的身世、事迹,很费脑筋。如果能在横向比较的同时把他们分别作纵向的考察,就很容易了解其差别,把他们逐个搞清,横向的相关事项也会很明白。
      
      28.改错记忆法
      从自己或别人的错误中吸取教训,在改正错误的过程中吸取教训,在改正错误的过程中做到对知识准确记忆的方法。
      "发明大王"爱迪生说:"失败也是我所需要的,它和成功一样对我有价值。"英国心理学家巴特利也说:"测定智力技能的唯一标准可能是检测并摒弃谬误的速度。"错误给人以深刻的教训,通过改错建立正确的认识和记忆,从改错中弄准确所记忆的知识,就等于向错误索回了补偿。错误的教训能引起人的重视,改正错误能使正确的知识在大脑里留下深刻的印象。
      改错记忆法要求经过认真的分析和思考,深挖致错的根源,这样才能加深对正确知识的理解和记忆。改错须认真及时,既可改自己之错,又可改他人之错,做到"错一遍,精一遍"。
      如果一个学生拿到批改过的卷子或作业,见分高一笑了之,见分低一扔完事,对差错采取不负责的态度,很可能一错再错。如果运用改错记忆法,找到自己错误的原因,改变错误的记忆,汲取错误的教训,在自己的记忆中警觉起来,避免再错,那么就能正确掌握知识,大大加深记忆。
      有个小学生考中学时,虽然知道三角形面积的求法,但顺手做题时却忘记底乘高后再除以2, 这一差错使他追悔莫及,几十年后谈起此事他都记得清清楚楚,当然自那以后他再也未犯过这种毛病。
      还有的同学对改错很认真,每次试卷、作业发下来,都记下的错误,汇编成一本本的错题集。在错误后面加上对错误的更正及提醒自己今后注意的话。这样做使他从不再犯同样的错误,对曾经错过的知识记得非常牢固。
      
      
      29.闭眼记忆法
      闭上眼睛,隔断外界的视觉刺激,根据已有表象以回忆或巩固记忆的方法。
      当人们对以往的材料回忆不起来的时候,常说"闭上眼睛想一想",就是用的这种方法。闭上眼睛隔断外界的视觉刺激,可以使人们的精神在不受干扰的情况下集中起来。这种精神的集中,对记忆有着意想不到的效果,可以把曾经接受过的刺激表象显现出来。
      如见到一位面熟的人,一时又想不起在哪里见过,闭目凝思,很可能一下子再现出与他(她)接触过的情景。
      记忆新材料时,闭上眼睛,在黑暗中创设一个画面与所记内容联系起来,也会因精力集中和自己的独特联想把记忆对象深深印记得在脑海里。而且,这样的记忆一旦回忆时,一闭上眼睛就能把内容及创设的画面一同浮现在眼前。
      
      30.学后睡记忆法
      在学习记忆之后不再做其他事情,马上睡眠以保持记忆的方法。此法一般在学习文化知识时使用。
      学后马上睡眠,使记忆仅仅受到学习之前接受的信息的干扰(前摄抑制),而没有受到后来学到的知识的干扰(即倒摄抑制),因而记忆效果较好。
      德国心理学家做过实验,发现被试者在学习后不做任何事情,能回忆所学材料的56%,学习后继续用脑做别的事,则只能记住26%。
      有的科学家认为,人们在学习后很快就睡眠能促进记忆,因为睡眠分几个不同阶段,前4小时的深度无梦睡眠会增强人的记忆力,后4小时的有梦睡眠才抑制人的记忆力。还有人认为在睡4小时后再把他唤醒学习,这时的学习记忆效果更好。
      
      31.区别难度记忆法
      将所要记忆的内容划分为不同的难度等级并作出标记,合理分配精力的记忆方法。
      任何事物都是有选择才有集中,有集中才有突出,有突出才有注意。记忆许多内容,要区别难易的不同等级,对难的多用些精力,对易的少花些工夫,复习时也就能够抓住重点,这样可以取得良好的记忆效果。
      难度等级的标记,还可采用彩色,使之一目了然。如有的人根据交通规则中红绿灯的使用,用红色表示危险,标记最重要的、易错难记的部分;用黄色表示注意,表示模糊不清、记忆不清的部分;用绿色表示安全,标记容易记的部分。用这三色在书上标出记忆的内容和难易等级,既可以用彩色激发读书的兴趣,又对要记忆的内容作出合理的精力分配,顺利地达到记忆知识的目的。
      
      
      32.重点记忆法
      抓住重点围绕中心进行记忆的方法。
      万山磅礴,必有主峰;书帙九章,但挈一领。要增强记忆,必须抓住记忆的重点。现代科学呈爆炸趋势,知识量与日俱增,人生有涯,心智有限,这也要求必须抓住学习记忆的重点。爱因斯坦说过:"抓住那些能导致深邃的东西,而把其他可有可无的东西撇开不管。" 这是学习记忆必需掌握的"秘诀"。抓住重点才能减轻大脑负荷,克服生理上超限性抑制现象;可以集中时间和精力,含英咀华,探测精蕴,消化吸收,因而记忆效率更高,效果更好。
      采取这种记忆法,需要明确记忆的目标,需要处理好专与博的关系,还需要有灵活的方法。
      
      33.强烈印象记忆法
      记忆时有意识地给自己造成强烈的印象,以增强记忆的方法。这种方法多用来记忆首次接触的事物。
      记忆的保持与大脑的活动有着密切的关系,大脑皮层中与记忆有关的区域越兴奋,跟记忆无关的区域的抑制越强烈,这样注意力就更加集中在所要记忆的内容上。强烈印象记忆法就是通过感受强烈信息或放大较微弱的信息造成强烈的印象,从而把注意力集中在这些记忆的内容上着力理解、记忆这些内容,获得清晰、持久的记忆效果。
      如学习有关人口的知识,通过查找有关资料或根据现有的资料加以测算可以知道,如果照现在的速度发展下去,到2500年人均占有陆地面积仅0.04平方米,到2800年,人口的重量将超过地球本身的重量,这些数字意味着人口问题将关系到人类的存亡绝续。这样来就给大脑造成了强烈印象,会使其精力集中在人口问题思考记忆,从而获得良好的记忆效果。
      
      34.明确目标记忆法
      在学习记忆前明确记忆的目标,给予大脑明确的动力,以达到记忆目的的方法。
      学习记忆进要明确记忆的目的性,确定明确的目标,给大脑以明确的驱动力,这样可以提高大脑皮层的兴奋度,使建立的暂时神经联系得到巩固,在大脑皮层留下深深的印记,使记忆准确、持久。明确记忆的目标不仅仅是"必须记住"这样一个笼统的要求,还包括准备记忆多长时间,准确到什么程度。
      心理学家曾对明确记忆目的性的效果做过实验:两组学生都阅读同一篇1400字的论文,规定第一组的目标是限定时间读完,之后测验检查,同时被告知两周后再次测验检查;第二组只被告知阅毕检查。实验结果表明,两组阅毕检查的成绩大致相同,但两周后的检查第一组成绩明显高于第二组。这个实验说明:有明确目的性的记忆比学习后再想去记忆的效果要好得多。在学习过程中,给自己提出一个记忆目标,今天要记的内容"必须记熟",可以使记忆效果倍增。
      
      35.特征记忆法
      观察、发掘出记忆对象的突出特征,凭借那些一目了然、令人难忘的特征达到准确清晰记忆的方法。
      所要记忆的实际内容就是对象的特征。那些相类似的事物容易混淆,难于记忆,原因即在于没有充分发掘出出各自的特征。只要仔细观察,细致对比,深刻分析不同情况下的异同,总能找出所要记忆的材料或事物的特征达到准确记忆的目的。这类方法可以广泛应用于记忆一切对象,特别适于记忆同类对象中的特殊者。
      如蒙古军队在1234年灭金,这个年代数字是常用的顺序数字"1234",抓住这个特征,蒙古灭金的年代就简单易记了。又如法国大革命爆发于1789年,这个数字除前面的"1"外,后面的"789"也是顺序相连的数字,根据这个特征,也很容易记住。再如,1881年沙皇俄国强迫我国清政府签订了不平等的《中俄伊犁条约》,"1881"这个年代数字中两个"1"在外,两个"8"居中,且从左往右读与从右往左读的结果一样。根据这个特征,《中俄伊犁条约》签订的年代就容易记住了。
      
      36.循序渐进记忆法
      按照学习的内容的本来顺序,一步一个脚印地逐渐积累,陆续记忆的方法。
      南宋学者朱熹说过:"未得于前,则不敢求其后,未通于此,则不敢志乎彼。" 讲的是读书之法在于循序渐进。他还打比方说,学习记忆若不是循序渐进,尤如饿汉闯入餐馆,看到大盆小碗、鱼肉糕点,恨不得一口吞下去,粗嚼快咽,虽填满一肚子,却没有品尝到滋味,甚至因消化不良而引起疾病, 这种食多嚼不烂的学习记忆法,是不会有好结果的。良好的记忆依赖于与以往知识结构之间的联系,记忆也需要自己的基础,只有循序渐进、逐步积累,才能收到良好的效果。贪多求快,往往欲速则不达。按照循序渐进记忆法,前边的没记住不急于记后边的,像盖房子那样,每一层根基都打牢固,在牢固基础上建造、记忆,就能使房子越盖越高,知识越记越多,达到学习记忆的目的。

     

    展开全文
  • 薛斯通道的十二种买入法和四卖出法详解:            薛氏通道(XUECH)是一个非常实用又相当神奇的技术指标,用它来判断买点或卖点,能有效地规避风险并最大限度地获利。然而,薛氏通道(XUECH)虽好...

    薛斯通道包括两组通道指标,分别是长期大通道指标和短期小通道指标。股价实际上是被短期小通道包容着在长期大通道中上下运行。薛斯通道的大、小通道总共有四条轨道线:
          内上轨(黄色线或紫色线)代表短期压力,内下轨(白色线或绿色线)代表短期支撑。
          外上轨(红色线或白色线)代表长期压力,外下轨(蓝色线或黄色线)代表长期支撑。

          长期大通道反映股票的长期趋势状态,当外上轨-红色线和外下轨-蓝色线转折向上的时候,表示长期趋势已经转折向上,我们可以积极做多,参与股票的上涨。反之,当外上轨-红色线和外下轨-蓝色线转折向下的时候,表示长期趋势已经转折向下,我们要及时出局,规避股票长期下跌的风险。当外上轨-红色线、外下轨-蓝色线水平运动的时候,说明市场正处于盘整的趋势中,投资者就可以很好地利用长期大通道把握中短线趋势做高抛低吸。 
          短期小通道反映该股票的短期走势状态,当内上轨-黄色线和内下轨-白色线转折向上的时候,表示短期趋势已经转折向上,短线可以参与股票的上涨;反之,当内上轨-黄色线和内下轨-白色线转折向下的时候,表示短期趋势已经转折向下,短线要规避股票下跌的风险。短期小通道反映的是股票小周期的运行趋势,适合于短线操作。
          薛斯通道实战运用
          薛斯通道属于通道类指标,它既可以在股价的运行过程中起到压力和支撑的作用;又可以指明市场运动的方向和趋势。

          我们知道:趋势按照方向分可以分为上升趋势、下降趋势和横盘无趋势。

          那么,薛斯通道在不同的趋势运行状态下其实战运用的方法也就会不同。
          下降趋势中薛斯通道的运用
          当股票处于大的下降趋势中时,我们应该顺势而为地空仓等待市场转折点的出现。但,在下降趋势中也会有阶段性反弹的机会,只是对于大多数投资者来说,在下降趋势中捕捉超跌反弹的买卖点确实比较困难。这里,重点讲解下降趋势中如何利用薛斯通道把握股票反弹买卖点的问题。
          当外上轨、外下轨(红色线和蓝色线)转折向下的时候,意味着长期趋势向下,股价反弹触及到外上轨以后会受到外上轨的压力,一旦量能不济,就要考虑逢高出局。
          横盘阶段薛斯通道的运用
          当长期大通道红色线、蓝色线横向运动时,说明,股价趋势为横盘震荡走势,价格在通道之间上下震荡。此时为主力调整、建仓、洗盘阶段,往往预示着下一轮行情的出现。
          在波段性谷底,股价触及大通道下轨(蓝色线)时,可轻仓买进,但,一定要设好止损位。一旦股价跌破大箱体的箱底就要止损出局;而在波段性峰顶,当股价触及大通道上轨(红色线)且量能开始萎缩时,就要逢高卖出。
          上升趋势中薛斯通道的运用
          当长期大通道方向向上,即大趋势总体向上时,股价经过一波拉升以后回落到内下轨位置会受到支撑。如果,成交量能再次放大,那么,短线还将会有一波拉升,我们称之为空中加油,此时短线介入利润比较可观。
          长期大通道方向向上,内上轨金叉外上轨,说明,此时股价进入强力拉升阶段。如果,成交量不能随之放大可适当观望,如后期成交量持续放大,则通常是股价暴涨的关键。
          买入股票以后,只要股价回落没有跌破薛斯通道内上轨(黄色线),就可以继续持有,否则,一旦收盘价跌破内上轨,即表示股价进入风险区,短线务必要清仓出局,以规避潜在的下跌风险。 
          总之,薛斯通道特别适合短线抄底和追涨,对于喜欢操作短线的投资者有很大的帮助。投资者可以仔细研究,并学以致用。 

     

          薛斯通道的十二种买入法和四种卖出法 

          第一招:股价跌破内下轨道线    

    ——收阳日买入

          第二招:股价跌破外下轨道线    

    ——跌破日买入

          第三招:一线跌破双轨               

    ——跌破日买入

          第四招:内下轨道低位抬头    

    ——第二天买入

          第五招:外下轨道线低位走平抬头  

    ——抬头日买入

          第六招:内下轨道线靠拢外下轨道线   

    ——靠拢时买入

          第七招:内下轨道线跌破外下轨道线  

    ——跌破日买入

          第八招:内下轨道线上穿外下轨道线  

    ——上穿日买入

          第九招:内外下轨道线低位相向运动              

    ——相会日买入

          第十招:“三星爬坡”           

    ——第三颗星出现时买入                               

          第十一招:“散兵蹲抗”         

    ——收阳时买入

          第十二招:“两脚踏地”         

    ——两脚踏地日买入

          第十三招:“雏鸡破壳”       

    ——破壳日卖出

          第十四招:一杆捅破两重天       

    ——捅破日卖出

          第十五招:白龙回首          

    ——回首日卖出

          第十六招:小弟超兄          

    ——超过日卖出

     

          薛斯通道的十二种买入法和四种卖出法详解:

          薛氏通道(XUECH)是一个非常实用又相当神奇的技术指标,用它来判断买点或卖点,能有效地规避风险并最大限度地获利。然而,薛氏通道(XUECH)虽好,但目前应用的人却不是很多,主要是该指标还没有引起人们的广泛注意,仍然被人们当成一个无用之物冷落在一边。用薛氏通道(XUECH)判断行情有以下好处:      
          一是薛氏通道(XUECH)能让投资者自觉或不自觉地抄到大底和逃离天顶,这是其他技术指标难以做到的。
          这不是天方夜谭,也不是信口开河,它是实实在在的事实。如若不信,你可按书中的办法操作一段时间,证实一下薛氏通道(XUECH)是否真正具有上面所说的那种神奇作用。      
          二是薛氏通道(XUECH)能使投资者放开手脚驰骋股市,想买就买,想卖就卖(当然,你得按该图线显示的信号进行买卖),无忧无虑,轻松赚钱。
          薛氏通道(XUECH)不分短线、中线、长线,更不认可长线是金,短线是银一类的说法,只要按照该图线显示的信号进行操作,短线、长线都是金。     
          三是薛氏通道(XUECH)能有效地排除外界的干扰,稳定投资者的心态,关键时刻不糊涂,不自乱阵脚,使自己成为一个永不迷失方向的投资者。
          大家知道,外界对投资者的影响是相当大的,无论是新股民还是老股民,常因外界的影响而身不由己地改变自己的初衷,最后导致失败。运用薛氏通道(XUECH)就可排除干扰,取得成功。 

          薛斯通道买卖十六招之第一招:股价跌破内下轨道线-收阳日买入

          股价跌破薛氏通道(XUECH)内下轨道线的图线形态较好辨认,即,股价原本在内上、下轨道线之间运动,某日,股价忽然跌破了内下轨道线,我们就把这种形态叫做股价跌破内下轨道线走势形态。

          股价跌破内下轨道线,是做空能量得到进一步释放的表现。当做空能量释放得差不多时,个股就会止跌反弹,那时,其股价也就是近期的底部。

          股价跌破内下轨道线的走势,可在上升行情、下降行情以及横向盘整行情中出现。

          在上升行情中出现时,后市上升的力度一般较大,获利较为可靠,短中长线皆宜。

          在下降行情中出现时,也能获利,但升幅有限,只宜做短线。

          在横向盘整行情中出现时,股价多进行箱型运动,适宜高抛低吸做差价。
          操作说明:

          股价跌破内下轨道线的走势,可以说是有一定可信度的买入信号,但在具体操作上,尚需要慎重对待,请投资者注意:
          1、上升行情中出现的跌破内下轨道线的走势,是强势调整结束的信号。后市,股价将会出现一波新的上升行情。投资者应果断介入,不要错过这一买入机会。但在操作时,要结合K线图的走势,选择最佳买入时机,方能达到提高收益的目的。笔者的经验是,跌破日收阳线,可在当日买进;跌破日收阴线时,则应等到收阳线后,才可以买入。
          2、在一波下降行情的下跌途中,股价跌破内下轨道线的走势一般会出现三次。第一和第二次跌破后的反弹力度一般较弱,有时,做不出差价,需要谨慎操作,只要有微利,就应获利了结,不可贪婪,不然,就会因小失大。缺乏短线经验的投资者,最好不要抢反弹,若硬是做了,也应在买进股票后,设置止损点,一旦走势不妙,就应立即止损。第三次出现的跌破走势,反弹力度普遍较强,可放心操作。
          3、在下降行情中,股价跌破内下轨道线后,有时,只出现微弱的反弹就继续下跌,紧随其后,又出现一次跌破走势。应对的办法是——股价在未跌破内下轨道线之前就跌破了止损点时,应按止损点的要求果断止损;如果,股价第二次跌破内下轨道线,但,未跌破止损点时,可进行补仓,摊低成本,待股价反弹到内上轨道线附近时,一次性卖出,仍可获利。
          4、在上升行情中,股价跌破内下轨道线后,有时,出现连续几天的跌破形态。如果,跌破的低点一底比一底高,就应耐心持股,不可惊慌卖出。但,在下降行情中出现多天连续跌破内下轨道线,且一底比一底低时,应提高警惕,股价跌破止损点时,就得果断出局。
          5、股价跌破内下轨道线的走势,只适用于薛斯通道日线图;周线图只有在上升途中出现时,有效性才较可靠,在下降途中出现时,常会出现一买进股价就向下跌落的走势,稍有不慎,就有可能掉进陷阱。
          薛斯通道买卖十六招之第二招:股价跌破外下轨道线-跌破日买入

          此招是前招的延伸招,比前招的操作性更强,有效性更高,获利更可靠。因为,股价跌破内下轨道线,表明股票已严重超卖,显示为买入信号,可进场买入。而外下轨道线处在内下轨道线之下,股价跌破外下轨道线,无疑是超卖又超卖了,双重超卖信号叠加,不用说,比单一超卖信号更具可靠性。

          事实上,股价跌破外下轨道线,就是调整结束的信号。在调整结束时买进股票,就等于敞着口袋接钞票了。

          股价跌破外下轨道线的走势,与第一招的走势一样,可在上升行情和下降行情的途中出现,也可以在盘整行情中形成,无论在什么位置出现,均是可靠的买入信号。该形态出现的几率比第一招要小,故有效性就更高,反弹的力度也较大。根据笔者的经验,股价跌破外下轨道线后,后市反弹的幅度一般不会少于5%,有的甚至达到30%以上。
          操作说明:
          1、股价在上升行情中跌破外下轨道线的走势,是非常可信的抄底信号,应大胆买入。可以说,只要买进了股票,就有钱赚。上升行情中出现的股价跌破外下轨道线的走势,是千载难逢的抄底机会,应果断介入,不可错失。
          2、在下降途中,股价跌破外下轨道线的走势也是很可信的买入信号,应积极介入,获利也较可靠。但,在个别情况下,须要谨慎。比如,股价瞬间跌破薛斯通道外下轨道线后,又很快回升到内下轨道线内,当日,收一条长下影小实体的阴线。这是庄家试盘的信号,不宜操作。

          这一走势,给我们提供了两条信息:

          一是提供庄家打算进场的信息。

          股价经过长期下跌和深跌后,庄家就要考虑进场了,庄家进场前,一般要对散户的持股情况进行摸底,试探散户手中的筹码的轻重、散户手中的筹码不重时,就直接开始建仓,若散户手中的筹码较重时,就得先震仓,后吸筹。常用的震仓手段就是疯狂砸盘,有时,是开盘即跌停,后拉起;有时,是高开低走,将股价砸跌5点以上后再拉起。庄家在砸盘和拉盘的过程中,就可以大致摸清散户的持筹情况,然后,决定进场时间。

          二是提供了股价已接近底部,但还有最后一跌的信息。

          股价瞬间跌破薛氏通道外下轨道线的走势,是股价离底部不远的信号,即使还有最后一跌,也不会跌得很深,最后一跌出现后,就可判断底部快到了,只要再次出现股价跌破薛斯通道外下轨道线时,就可以放心买进了。
          3、股价跌破外下轨道线的走势无论是在上升行情中还是在下降行情中出现的几率均较小,平时较难碰到,一旦碰到时,就应果断买入,千万不要错过这一良机。若没碰到时,也不要死等。可根据第一招的信号,或后面介绍的其他信号买入,这样,才不至于踏空,失去赚钱的机会。
          薛斯通道买卖十六招之第三招:一线跌破双轨--跌破日买入

          一线破双轨,指的是在下降行情中,如果某日出现了一条大阴线,将薛斯通道的内外下轨道线同时跌破,这种走势,就称为一线破双轨。

          一线破双轨是千载难逢的买入机会。在当天或第二天,无论什么价位买进,都是一种幸运。一线破双轨是股市下调行情即将结束的信号,此时买入,正好赶上一波反弹行情,不但风险小,而且,获利极为可靠,有经验的投资者,是不会轻易放过这一买入机会的。

          为什么说一线破双轨走势是可信的买入信号呢?

          原因很简单,因为,股价在一天内同时跌破薛斯通道的内外下轨道线时,表示跌势很急,做空的能量消耗过大,是一种严重的超卖行为,后市卖压就会减轻,股价就会由熊变牛,转势向上,走出一波反弹行情。
          从另外一个角度看,还可以将一线破双轨走势理解为庄家的震仓行为。庄家为了在低位吸收到廉价的筹码,经常在阴跌之后,来一次剧烈的震仓,将那些顽固不化的多头散户手上的筹码震出来,为今后的上拉行情做铺垫。在震仓时,最容易出现一线破双轨的走势,股价在一日之内的跌幅,可达到3%以上,人们被吓怕后,纷纷逃命,庄家就张开大网,将震出来的筹码,通通网进他的帐户,这就是人们常讲的空头陷阱。散户掉进空头陷阱是最难受的,不但在地板价卖出了股票,反而,还要在高于卖出价的价位上重新买回来,这一出一进,加上手续费,一次不顺心的操作,就会折腾掉成千上万的资金。应用一线破双轨走势,就可避免空头陷阱的危害。
          一线破双轨走势有两种形态:

          一种是内下轨道线处在外下轨道线的上方,股价将两轨跌破;

          一种是内下轨道线处在外下轨道线的下方,股价将两轨跌破。

          这两种跌破形态,均显示强烈的买入信号,据次操作,都能获利。
          一、内下轨道线在外下轨道线上方一线破双轨形态剖析
          该形态多出现在股价调整结束的尾声,形态特征是内下轨道线和外下轨道线,均由左上向右下方向运动,内下轨道线在靠近外下轨道线时,急剧下跌的股价,则在一天内跌破了内、外下轨道线,其排列是,内下轨道线在上,外下轨道线居中,股价的最低点处在最下,形成空头排列。该形态可在股市行情的任何走势中出现,且在低价圈中出现的较多。此处出现的一线破双轨走势有效性最高,获利最为可靠。
          二、内下轨道线处在外下轨道线下方的一线破双轨形态剖析
          该形态的特征是,内下轨道线在外下轨道线之下,股价的最低点又在内下轨道线之下,与上一形态不同之点就是内外下轨道线的排列次序有所改变。本形态的买入信号更为强烈,保险系数更大,成功率相当高,是最为可靠的赚钱招。
          操作说明:
          上述两种形态的一线破双轨走势,均是可信的抄底信号,据此买入,获胜的几率很大。但在具体操作时,应根据不同情况区别对待:
          1、内下轨道线处于外下轨道线之上的一线破双轨走势,出现的几率较高,并且能在任何位置出现,但,在下降途中出现时,后市反弹的力度一般较弱,只宜做短线,快进快出,见好就收。若是贪多恋战,有可能出现偷鸡不成蚀把米的情况。该形态在其它位置出现时,则可不必那么谨慎,适当延长一点持股时间是可以的,但不能买进股票后,不闻不问,以至于失去最佳卖出时间。这种马放南山,刀枪入库的松懈思想,也是不可取的。
          2、内下轨道线在外下轨道线之下的一线破双轨走势,出现的几率较小,有的股票上市几年来一次都未出现过,说明这一形态,比内下轨道线在外下轨道线之上的一线破双轨走势更为有效(出现几率越小的技术指标有效性越高)更可放心操作。即是说,这一形态,无论出现在什么位置,均可放心买入。只要是在一线破双轨形成日买进股票,都可以获利,而且,利润率要比内下轨道线在外下轨道线之上的一线破双轨走势的利润率高得多。

          内下轨道线在外下轨道线之下的一线破双轨走势,是非常可信的买入信号,应果断操作,不要轻易失去这一抄底机会。
          3、一线破双轨走势形成的当日,其股价不一定是近期的最低点,有时,一线破双轨形成后,股价还会创出新低,而且,有相当大的跌幅,遇到这种情况,千万不要紧张,待股价走稳后,可进行补仓,摊低成本。无资金补仓者,应持股不动,等待后市的涨升。根据经验,一线破双轨走势形成后,一般是三五天就会反弹,获利后再抛出。
          4、股票除权后形成的一线破双轨形态,有效性较差,后市,股价究竟是升是降难以判断。对待除权后出现的一线破双轨走势,要慎重操作,没有十足的把握,不宜介入,以免造成不必要的损失。

          薛斯通道买卖十六招之第四招:内下轨道线低位抬头-第二天买入 
          当股市行情转入熊市后,股价不断向下跌落,各种技术指标也跟着下降,毫无疑问,薛斯通道的内下轨道线也无法扭转这一跌势,同样也会跟着股价向下运行。然而,如果某一日,内下轨道线的数值出现了高于前一日的数值时,你就得留意了,这是熊市即将走到尽头(或是调整到位)的信号,股价下跌的空间已经有限,随时会反弹,投资者应做好抄底准备,迎接新一轮上升行情的到来。 
          内下轨道线低位抬头的走势较好辨认,只要是股市行情经过一段深跌后,内下轨道线从高位降到了低位,不再下降,而转势上行,这种走势就叫内下轨道线低位抬头,如果第二天,内下轨道线继续向上,则可确认见底有效,可进场买入。 
          内下轨道线低位抬头走势有两种形态:

          一为内下轨道线低位走平抬头形态。即,内下轨道线降到低位后,先出现2~5天的平行移动,然后,再抬头向上的走势。

          一为内下轨道线低位直接抬头形态。即,内下轨道线在低位抬头前,不经平移这一过程,由低点出现日,直接转势向上,这种不经过平移走势的抬头形态,称为内下轨道线低位直接抬头。这两种形态均是可信的见底信号,可放心操作,后市或多或少会有收获。 
          操作说明: 
          薛斯通道内下轨道线低位抬头走势形态是十分可信的买入信号,应积极参与,不要错过这一抄底机会,但在操作过程中,应注意以下几点: 
          1、内下轨道线低位抬头走势的两种形态,可在上升行情的上升途中、下降行情的下降途中、熊市行情的尾声以及盘整行情的横向整理期间即可出现,无论出现在什么位置,后市均有一涨,只是涨升的幅度有所不同罢了。投资者只要操作得当,都可获利。一般来讲,该形态在下降行情的尾声和上升行情的上升途中出现时,有效性要高一些,后市,反弹的幅度也相应大一些。一般投资者应积极介入,获利较为可靠。该形态在下降途中出现时,后市反弹的力度一般较弱,缺乏短线操作经验的投资者,最好不要介入,以防中途挨套。 
          出现在熊市行情的下降途中的内下轨道线低位抬头走势,后市上升幅度除去买不到最低价,卖不出最高价和交易费因素外,很难做出差价来,买进后极易挨套,应避免介入。内下轨道线低位抬头形态在上升行情的调整期出现时,表明股价已调整到位,新一轮涨升行情会随之而来,需果断买入,防止踏空。在谷底出现时,多为熊转牛的反转信号,应坚决买入,这是最难得的赚钱机会,错过这一机会,后面就难做了。 
          2、内下轨道线低位抬头走势出现的当日,股价有时还处于相对高位(即尚未调整到位),操作前,最好结合K线图的走势,选择最佳买点。 
          3、内下轨道线低位抬头的两种形态最保险的进货时间是,内下轨道线低位走平抬头(或直接抬头)后的数值,超过走平(或直接抬头)前两天的数值时,才可买入,尚未达到这一要求时,则需慎重对待。 
          4、内下轨道线低位走平抬头和内下轨道线低位直接抬头两种走势形态虽然都是可信的买入信号,但内下轨道线低位抬头后,第二天或第三天,有可能又回头,甚至下跌,给判断带来困难甚至失误。

          在使用这一招时,应结合薛斯通道的两条外轨道线的走势进行分析,可减少误判。通常情况下,内下轨道线抬头向上时,若两条外轨道线也同时或已经抬头向上,后市反弹的几率较高,可放心操作;若内下轨道线抬头向上,两条外下轨道线则仍然向下降落,后市反弹的几率会相应降低。还可根据K线与成交量的走势,对内下轨道线低位抬头走势形态的有效性进行印证,即是说——当内下轨道线低位抬头走势形态出现时,K线和成交量均配合较好,也可认定此时出现的内下轨道线低位抬头走势形态是有效的,可放心操作。如果,K线图和成交量均未出现向上买入信号,而只是单一的出现了内下轨道线低位抬头走势形态时,则要慎重对待。 
          薛斯通道买卖十六招之第五招:外下轨道线低位走平抬头—抬头日买入

          薛斯通道的外下轨道线,由左上向右下运动到低位时,如果,连续两天以上出现同值,就称为低位走平;走平后,外下轨道线线值增加了,就称为抬头。

          外下轨道线低位走平抬头形态,一般显示的是中长线见底信号,后市,会出现一波较大的上升行情,是投资者抄底的最佳时机。如果能适时介入,后市获利相当丰厚。
          外下轨道线低位走平抬头后,股价反弹的原理是:股价下跌的初期,薛斯通道(XUECH)的四条轨道线,都会随着股价的下跌而向下运动,当股价跌到一定深度,薛斯通道(XUECH)的外下轨道线拒绝下跌时,表明做空能量已近枯竭,尽管股价还未止跌,但离底部已经不远了。
          薛斯通道买卖十六招之第六招:内下轨道线靠拢外下轨道线-靠拢时买入
          此招是依据薛斯通道内下轨道线和外下轨道线的离、靠走势总结出来的一种抄底方法。即,内下轨道线靠拢外下轨道线时就买,内下轨道线远离外下轨道线时则卖。
          内下轨道线靠拢外下轨道线的走势有两种形态:

          一是内下轨道线靠拢外下轨道线时有距离;

          二是内下轨道线靠拢外下轨道线时没有距离,呈重合或交叉状态。

          这两种形态可在任何位置出现,但,在上升途中或下降途中出现的次数要多一些,均显示为买入信号,可放心操作。
          内下轨道线靠拢外下轨道线形成的机理,是因两线所设置的参数不同而形成的。内下轨道线的参数一般为30,外下轨道线的参数一般为90,参数小的图线,运动速度快一些,参数大的图线,运动速度要慢一些。两条运动速度快慢不一的图线,就会出现时而靠拢和时而离开的走势。远离时显示超买,发出卖出信号。靠拢时,显示超卖,发出买入信号。投资者可利用内下轨道线离、靠外下轨道线的这一走势,来寻找买点或卖点。

          我个人觉得,这个方法短时间之内可能无法做到放心操作。最简单地说,靠近和交叉就是两个状态,如果,靠近的时候买,买完交叉了,就是赔了,再加上止损,肯定是不靠谱啊不靠谱。谁有好方法,欢迎拍砖,一起挣钱。
          薛斯通道买卖十六招之第七招:内下轨道线跌破外下轨道线-跌破日买入
          股市行情进入熊市以后,就会出现一段较长时间的下跌走势,股价也会一波接一波的向下跌落,作为技术指标的薛斯通道(XUECH),也会随着股价的跌落向下运动,在股价小幅向下波动时,薛斯通道的内下轨道线,一般处在外下轨道线的上方,股价大幅向下波动时,因薛斯通道内下轨道线的参数小于外下轨道线的参数,运动速度快于外下轨道线,就会向外下轨道线靠拢,进而下穿外下轨道线,形成内下轨道线跌破外下轨道线的走势形态。该形态是股价即将见底的信号(至少是波段性底部),后市会出现一波中级以上的上升行情,在此买入,获利较为可靠。 
          
    薛斯通道买卖十六招之第八招:内下轨道线上穿外下轨道线-上穿日买入
          按说,本招可以放在“内下轨道线跌破外下轨道线”里一起介绍,因为,这两招的走势离得很近,内下轨道线跌破外下轨道线后,紧接着就会出现内下轨道线上穿外下轨道线走势。考虑本招内容相当重要,所以,专门当作一个招数介绍。

          本招与前招均是难得的抄底信号,但,两个招式的买点位置恰恰相反。

          前招是内下轨道线由上向下穿过外下轨道线时买入;

          本招则是内下轨道线由下向上穿过外下轨道线时买入。

          根据薛斯通道的走势规律,内下轨道线跌破外下轨道线后,内下轨道线只会短时间在外下轨道线的下方运动,多则十天半月,少则三五日就会回到外下轨道线的上方来。内下轨道线返回外下轨道线上方的当日,多半是股价第二次筑底结束的时间,显示为强烈的买入信号。此时进货,比在内下轨道线跌破外下轨道线时买进更加保险。
          内下轨道线由下向上穿越外下轨道线的买入机理有两点:

          其一是因为内下轨道线跌破外下轨道线时,就是明显的超卖信号,做空能量得到大量释放,获利筹码已基本清除。股谚云空头不死,股难不已。出现严重超卖走势后,表明空头已经死得差不多了,卖股的人少了,股价也就跌到了尽头。

          其二是因为内下轨道线由下向上穿过外下轨道线时,意味着多头在进场,买进股票的人数增多,卖出股票的人数减少,供小于求,产生新的不平衡,后市股价必然要上涨,此时买进股票,就能够稳赚不蚀。 
          
    薛斯通道买卖十六招之第九招:内外下轨道线低位相向运动—相会日买入
          熊市行情的尾声,薛斯通道的内下轨道线,有时会出现与外下轨道线底背离的走势,即,内下轨道线由上向下运动,外下轨线则由下向上挺升,内、外两条下轨道线相向而行,这种底背离走势,是行情即将见底的重要信号。投资者应作好进场的准备。 
          
    薛斯通道买卖十六招之第十招:第三颗星出现时买入
          三星爬坡的形态特征是:薛斯通道(XUECH)处于上升趋势。内下轨道线向右倾斜上升.坡度较缓。此时,若出现贴着内下轨道线向上挺升的三条星形小阳线(其中夹一条小阴线也可),就称为三星爬坡。

          三星爬坡的三颗星,其走势一般是一底比一底高,一顶也比一顶高,且每颗星的实体都不大,在K线图上,类似红三兵。三星爬坡走势,是庄家拉抬股价的重要特征之一。庄家在拉抬股价前,一般要做些准备工作,其中,将图线做得好看一些是首要的一着,而三星爬坡形态,又是好看图线中最俊俏的一种,所以,该形态一出现,就可断定庄家进场了,后市,会有好戏出台,票友们(指投资者)此时也应买票入场,与庄家同乐。
          薛斯通道买卖十六招之第十一招:散兵蹲坑-收阳日买入 
          散兵蹲坑就是股价经过一段较长时间的下跌后,某日,一条K线(或连续多条K线)的收盘价,跌进由薛斯通道内下轨道线与外下轨道线相交(内下轨道线处在外下轨道线之下)形成状如鲫鱼口的一种走势形态。 
          
    薛斯通道买卖十六招之第十二招:两脚踏地-右脚踏地日买入
          两脚踏地指的是股价两次跌回到薛斯通道内下轨道线上的走势。即,股价第一次跌回到内下轨道线附近后出现反弹,向上涨升。当上升到内上轨道线附近时,由于内上轨道线的反压,股价再次跌回到内下轨道线上。这种前后两次跌回到内下轨道线的走势,就称为两脚踏地。第一次跌到内下轨道线的低点,谓之左脚踏地,称为左底。第二次跌回到内下轨道线的低点,谓之右脚踏地,称为右底。左右两个底部低点,均是买入时机,而右底的买入信号更为强烈,所以右底出现后,应及时跟进:不要错过这一买入机会。在右底买进的股票,一般可获利5%~10%,个别情况,可达到20%以上。 
          
    薛斯通道买卖十六招第十三招:雏鸡破壳-破壳日卖出
          股价在上涨过程中,某日,出现了向上穿越薛斯通道内上轨道线的走势,此为雏鸡破壳。
          操作说明:

          1、上升途中出现的雏鸡破壳走势,一般出现三次。第一、第二次出现后,股价调整到位时,可以考虑补回。但,第三次出现后,就不宜再介入了,其多为中长线的见顶信号,也是牛、熊待转折的点位。
          2、下降途中出现的雏鸡破壳走势,属于下跌抵抗形态,卖出后,均不能抢反弹。
          3、盘档行情中出现的雏鸡破壳走势,多为箱型整理形态,是进行高抛低吸做差价的绝好机会。其出现日卖出,股价调整到箱底时买回。然后,再在箱顶卖出,又在箱底买回。一段盘档行情,至少可来回做两趟,累计收益不亚于一波中等级别的上升行情。
          4、雏鸡破壳走势中的破壳K线,有时,连续出现多条,到底以哪一条K线作为卖出的点位呢?一般来讲,只要K线上穿了内上轨道线,就可卖出。有时,为了多获利,则需根据股价上升所到到的幅度来确定。如果,股价已有10%以上的升幅,此时出现,就应果断卖出。如果,升幅不足5%,则可再观察一两天后,再做卖出决策。

          薛斯通道买卖十六招之第十四招:一杆捅破两重天—捅破日卖出
          股价上升到高位后,某日,一条长大的K线(不分阴阳)将内外上轨道线一并捅穿,这种走势,称为一杆捅破两重天。
          该形态显示为中长期顶部信号,无论获利与否.均应卖出股票。其原因是因为,股价起伏不大时,其股价一般多在两条内轨道线中间运动.当股价上穿了内上轨道线时.表明,已有一定的升幅,获利盘会随时吐出筹码,引起股价下跌,一旦股价在一日内竟连穿内外两条上轨道线,则表明股价涨升过多过急,获利盘就会毫不犹豫地涌现,造成股价大跌。这一跌势形成后,股价向下调整的时间一般会拖得较长,如不能及时在高位卖出,就有可能套牢。

          所以,一杆捅破两重天是逃顶的重要信号,应果断地卖出股票。 
          
    薛斯通道买卖十六招之第十五招:白龙回首一回首日卖出
          白龙回首指的是薛斯通道的外上轨道线由低位上升到高位后回头下行的一种走势。因外上轨道线在电脑屏幕上是一条白色的曲线,如同一条腾空而起的白龙,进入高空后回头向下,有如白龙探望之态,故名白龙回首。
          该走势有两种形态:

          一是外上轨道线在高位勾头前有一段走平的过程。即,外上轨道线在高位连续两天或多天出现同值的走势后,才勾头向下。

          一是外上轨道线上升到高位后。不经走平这一过程,就直接勾头向下。

          这两种形态,均是有效的股价见顶信号.应及时卖出股票。

          外上轨道线高位勾头卖出原理很好理解,因为,外上轨道线的参数较大,它的走势相当于30日移动平均线.外上轨道线上升到高位时,表明股市行情已经上升了较长时间,且有相当大的升幅,获利筹码累积较厚,庄家己在悄悄出货,图线上的信号就是外上轨道线的不涨反跌。外上轨道线高位勾头,就是庄家在出货。
          薛斯通道买卖十六招之第十六招:小弟超兄-超过日卖出
          笔者把薛斯通道的内、外上轨道线比作两个正在发育成长的小兄弟,处在上面的外上轨道线数值,一般大于内上轨道线数值,称为兄。处在下面的内上轨道线数值,因小于外上轨道线数值,是为弟。

          如果,某一天,内上轨道线上穿了外上轨道线,即内上轨道线的数值大于外上轨道线的数值时,则称之为小弟超兄。
          小弟超兄走势是股市行情上升到极限的一种显示,也是牛市即将转为熊市的重要征兆,是投资者逃离顶部的关键时刻。如能在此卖出股票,就能最有效地保住所取得的赢利。如不能在此卖出,拖延了时间,错过了最佳的卖出时间,轻则减少收益,重则导致功亏一箦。
          小弟超兄走势多数出现在上升行情的波段顶部或大天顶的项部;少数则出现在下降行情的下降途中。但,无论出现在什么位置,小弟超兄均是强烈的卖出信号,应果断卖出股票。该形态有两处卖点:

          第一卖点为内上轨道线上穿外上轨道线的当日或第二天;

    展开全文
  • 本文由@浅墨_毛星云 出品,首发于知乎专栏,...不知不觉中,专栏中【《Real-Time Rendering 3rd》 提炼总结】系列文章已经增加到了十二篇。从2017年写到了2018年,从渲染管线、高级着色、延迟渲染,一路写到全局光照


    本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处。  
    文章链接: https://zhuanlan.zhihu.com/p/32928016


    这是一篇很特殊的文章。它将会是这个系列文章主线的最后一篇。

    不知不觉中,专栏中【《Real-Time Rendering 3rd》 提炼总结】系列文章已经增加到了十二篇。从2017年写到了2018年,从渲染管线、高级着色、延迟渲染,一路写到全局光照、光线追踪、非真实感渲染,到这篇文章的渲染管线优化。

    相信不仅是我自己在阅读和总结“实时渲染的圣经”《Real-Time Rendering 3rd》的过程中受益良多,一路阅读这个系列文章的朋友们,也应该是颇有收获。

    感谢大家一直以来的支持与陪伴。




    导读


    这篇文章约1万8千字,构成主要分为上篇(渲染管线瓶颈定位策略),下篇(渲染管线优化策略),以及常用的性能分析工具的列举三部分,详细目录如下。

      • 一、渲染管线的构成
      • 二、渲染管线优化策略概览
      • 上篇:渲染管线的瓶颈定位
        • 3.1 光栅化阶段的瓶颈定位
          • 3.1.1 光栅化操作的瓶颈定位
          • 3.1.2 纹理带宽的瓶颈定位
          • 3.1.3 片元着色的瓶颈定位
        • 3.2 几何阶段的瓶颈定位
          • 3.2.1 顶点与索引传输的瓶颈定位
          • 3.2.2 顶点变换的瓶颈定位
        • 3.3 应用程序阶段的瓶颈定位
      • 下篇:渲染管线的优化策略
        • 4.1 对CPU的优化策略
          • 4.1.1 减少资源锁定
          • 4.1.2 批次的尺寸最大化
        • 4.2 应用程序阶段的优化策略
          • 4.2.1 内存层面的优化
          • 4.2.2 代码层面的优化
        • 4.3 API调用的优化策略
        • 4.4 几何阶段的优化策略
          • 4.4.1 减少顶点传输的开销
          • 4.4.2 顶点处理的优化
        • 4.5 光照计算的优化策略
        • 4.6 光栅化阶段的优化策略
          • 4.6.1 加速片元着色
          • 4.6.2 减少纹理带宽
          • 4.6.3 优化帧缓冲带宽
      • 主流性能分析工具列举
      • 更多性能优化相关资料

    文中列举了渲染管线各个阶段中用到的几十种主流的优化策略。其中,个人印象比较深刻的优化方法有使用实例(Instance)结合层次细节和impostors方法来对多人同屏场景的渲染进行优化,以及使用纹理页(Texture Pages)来进行批次的尺寸最大化。

    这篇文章会是《Real-Time Rendering 3rd》第十五章“Pipeline Optimization”和《GPU Gem I》第28章“Graphics Pipeline Performance”的一个结合,而不是之前一贯的《Real-Time Rendering 3rd》的单篇章节为主线。

    需要吐槽的是,如果你对照阅读《GPU Gem I》的英文原版和中文翻译版,会发现中文翻译版中有一些不合理甚至曲解英文原文意思的地方,在第五部分性能与实这一部分尤其明显。


    OK,正文开始。



    一、渲染管线的构成


    通常,可以将渲染管线的流程分为CPU和GPU两部分。下图显示了图形渲染管线的流程,可以发现,在GPU中存在许多并行运算的功能单元,本质上它们就像独立的专用处理器,其中存在许多可能产生瓶颈的地方。包括顶点和索引的取得、顶点着色(变换和照明,Transform & Lighting,即T&L)、片元着色和光栅操作( Raster Operations ,ROP)。


    图1 图形渲染管线


    如《Real-Time Rendering 3rd》第二章所述, 图形的渲染过程基于由三个阶段组成的管线架构:

      • 应用程序阶段(The Application Stage)
      • 几何阶段(The Geometry Stage)
      • 光栅化阶段(The Rasterizer Stage)


    基于这样的管线架构,其中的任意一个阶段,或者他们之间的通信的最慢的部分,都可能成为性能上的瓶颈。瓶颈阶段会限制渲染过程中的整个吞吐量,从而影响总结渲染的性能,所以不难理解,瓶颈的部分便是进行优化的主要对象。


    图2 渲染管线架构


    若有对渲染管线架构不太熟悉的朋友,具体可以移步回看这个系列的第二篇文章《【《Real-TimeRendering 3rd》 提炼总结】(二) 第二章 · 图形渲染管线 The Graphics Rendering Pipeline



    二、渲染管线的优化概览


    准确定位瓶颈是渲染管线优化的关键一步。若没有很好确认瓶颈就进行盲目优化,将造成大量开发的工作的无谓浪费。

    根据以往的优化经验,可以把优化的过程归纳为以下基本的确认和优化的循环:

      • Step 1. 定位瓶颈。对于管线的每个阶段,改变它的负载或计算能力(即时钟速度)。如果性能发生了改变,即表示发现了一个瓶颈。
      • Step 2. 进行优化。指定发生瓶颈的阶段,减小这个阶段的负载,直到性能不再改善,或者达到所需要的性能水平。
      • Step 3. 重复。重复第1步和第2步,直到达到所需要的性能水平。


    需要注意的是,在经过一次优化步骤后,瓶颈位置可能依然在优化前的位置,也可能不在。比较好的想法是,尽可能对瓶颈阶段进行优化,保证瓶颈位置能够转移到另外一个阶段。在这个阶段再次成为瓶颈之前,必须对其他阶段进行优化处理,这也是为什么不能在一个阶段上进行过多优化的原因。

    同一帧画面中,瓶颈位置也有可能改变。由于某个时候要渲染很多细小的三角形,这个时候,几何阶段就可能是瓶颈;在画面后期,由于要覆盖屏幕的大部分三角形单元进行渲染,因此这时光栅阶段就可能成为瓶颈。因此,凡涉及渲染瓶颈问题,即是指画面中花费时间最多的阶段。

    在使用管线结构的时候应该意识到,如果不能对最慢的阶段进行进一步优化,就要使其他阶段与最慢阶段的工作负载尽可能一样多(也就是既然都要等瓶颈阶段,不妨给其他阶段分配更多任务来改善最终的表现,反正是要等)。由于没有改变最慢阶段的速度,因此这样做并没有改变最终的整个性能。例如,假定应用程序阶段成为瓶颈,需要花费50ms,而其他阶段仅需要花费25ms。这意味着,在不改变管线渲染速度(50ms,即每秒20帧)的情况下,几何阶段和光栅化阶段可以在50ms内完成各自任务。这时,可以使用一个更高级的光照模型或者使用阴影和反射来提高真实感(在不增加应用程序阶段工作负载的前提下)。

    管线优化的一种大致思路是,先将渲染速度最大化,然后使得非瓶颈部分和瓶颈部分消耗同样多的时间(如上文所述,这里的思想是,既然要等,不等白不等,不妨多给速度快的部分分配更多工作量,来达到更好的画面效果)。但这种想法已经不适于不少新架构,如XBOX 360,因其为自动加载平衡计算资源。

    因为优化技术对于不同的架构有很大的不同,且不要过早地进行优化。在优化时,请牢记如下三句格言:

      • “KNOW YOUR ARCHITECTURE(了解你所需优化的架构)”
      • “Measure(去测量,用数据说话)”
      • “We should forget about small efficiencies, say about 97% of the time: Premature optimization is the root of all evil.”(我们应该忘记一些小的效率,比如说97%的时间:过早的优化是万恶之源。)- Donald Knuth


    OK,下面开始,本文的上篇,渲染管线的瓶颈定位。



    三、上篇:渲染管线的瓶颈定位策略


    正确定位到了瓶颈,优化工作就已完成了一半,因为可以针对管线上真正需要优化的地方有的放矢 。

    提到瓶颈定位,很多人都会想到Profiler工具。Profiler工具可以提供API调用耗时的详细信息,由此可以知道哪些API调用是昂贵费时的,但不一定能准确地确定管道中哪些阶段正在减慢其余部分的速度。(PS:本文文末提供了一系列常用的profiler工具的列表)

    确定瓶颈的方法除了用Profiler查看调用耗时的详细信息这种众所周知的方法外,也可以采用基于工作量变化的控制变量法。设置一系列测试,其中每个测试减少特定阶段执行的工作量。如果其中一个测试导致每秒帧数增加,则已经找到瓶颈阶段。

    而上述方法的排除法也同样可行,即在不降低测试阶段的工作量的前提下减少其他阶段的工作量。如果性能没有改变,瓶颈就是工作负载没有改变的此阶段。

    下图显示了一个确认瓶颈的流程图,描述了在应用程序中精确定位瓶颈所需要的一系列步骤。


    图3 确认渲染管线瓶颈流程图 @ 《GPU GEMS I》


    整个确认瓶颈的过程从渲染管线的尾端,光栅化阶段开始,经过帧缓冲区的操作(也称光栅操作),终于CPU(应用程序阶段)。虽然根据定义,某个图元(通常是一个三角形)只有一个瓶颈,但在帧的整个流程中瓶颈有可能改变。因此,修改流水线中多个节点的负载常常会影响性能。例如,少数多边形的天空包围盒经常受到片元着色或帧缓冲区存取的限制:只映射为屏幕上几个像素的蒙皮网络时常受到CPU或顶点处理的约束。因此,逐个物体地改变负载,或逐个材质地改变负载时常是有帮助的。

    另外,管线的每个阶段都依赖于GPU频率(分为GPU Core Clock ,GPU核心频率,以及GPU Memory Lock,GPU显存频率),这个信息可以配合工具 PowerStrip(EnTech Taiwan 2003),减小相关的时钟速度,并在应用中观察性能的变化。


    下文将按照按照优化定位的一般顺序(即上述图中的流程),按光栅化阶段、几何阶段、应用程序阶段的的顺序来依次介绍瓶颈定位的方法与要点。



    3.1 光栅化阶段的瓶颈定位


    众所周知,光栅化阶段由三个独立的阶段组成: 三角形设置,像素着色器程序,和光栅操作。

    其中三角形设置阶段几乎不会是瓶颈,因为它只是将顶点连接成三角形。而测试光栅化操作是否是瓶颈的最简单方法是将颜色输出的位深度从32(或24)位减少到16位。如果帧速率大幅度增加,那么此阶段瓶颈。

    一旦光栅化操作被排除,像素着色器程序的是否是瓶颈所在可以通过改变屏幕分辨率来测试。如果较低的屏幕分辨率导致帧速率明显上升,像素着色器则是瓶颈,至少在某些时候会是这样。当然,如果是渲染的是LOD系统,就需斟酌一下是否瓶颈确实是像素着色器了。

    另一种方法与顶点着色器程序所采用的方法相同,可以添加更多的指令来查看对执行速度的影响。当然,也要确保这些额外的指示不会被编译器优化。


    下文将对光栅化阶段三个常常可能是瓶颈的地方进行进一步论述。



    3.1.1 光栅化操作的瓶颈定位


    光栅化操作的瓶颈主要与帧缓冲带宽(Frame-Buffer Bandwidth)相关。众所周知,位于管线末端的光栅化操作(Raster

    Operations,常被简称为ROP),用于深度缓冲和模板缓冲的读写、深度缓冲和模板缓冲比较,读写颜色,以及进行alpha 混合和测试。而光栅化操作中许多负载都加重了帧缓冲带宽负载。

    测试帧缓冲带宽是否是瓶颈所在,比较好的办法是改变颜色缓冲的位深度,或深度缓冲的位深度(也可以同时改变两者)。如果此操作(比如将颜色缓冲或深度缓冲的深度位从32位减少到16位)明显地提高了性能,那么帧缓冲带宽必然是瓶颈所在。

    另外,帧缓冲带宽也与GPU显存频率(GPU memory clock)有关,因此,修改该频率也可以帮助识别瓶颈。


    3.1.2 纹理带宽的瓶颈定位


    在内存中出现纹理读取请求时,就会消耗纹理带宽(Texture Bandwidth)。尽管现代GPU的纹理高速缓存设计旨在减少多余的内存请求,但纹理的存取依然会消耗大量的内存带宽。

    在确认光栅化操作阶段是否是瓶颈所在时,修改纹理格式比修改帧缓冲区的格式更麻烦。所以,比较推荐使用大量正等级mipamap细节层次(LOD)的偏差,让纹理获取访问非常粗糙的mipmap金字塔级别,来有效地减小纹理尺寸。同样,如果此修改显著地改善性能,则意味着纹理带宽是瓶颈限制。

    纹理带宽也与GPU显存频率相关。


    3.1.3 片元着色的瓶颈定位


    片元着色关系到产生一个片元的实际开销,与颜色和深度值有关。这就是运行”像素着色器(Pixel Shader )“或”片元着色器(Fragment Shader )“的开销。片元着色(Fragment shading)和帧缓冲带宽(Frame-Buffer Bandwidth)由于填充率(Fill Rate)的关系,经常在一起考虑,因为他们都与屏幕分辨率相关。尽管它们在管线中位于两个截然不同的阶段,区分两者的差别对有效优化至关重要。

    在可编程片元处理的高级GPU出现之前,片元着色几乎没有什么局限性,时常是帧缓冲带宽引起的屏幕分辨率和性能之间不可避免的瓶颈。但随着开发者利用新的灵活性制造出一些新奇的像素,片元着色的性能问题也就出现了。

    改变分辨率是确定片元着色是否为瓶颈的第一步。因为在上述光栅化操作步骤中,已经通过改换不同的深度缓冲位,排除了帧缓冲区带宽是瓶颈的可能性。所以,如果调整分辨率使得性能改变,片元着色就可能是瓶颈所在。而辅助的鉴别方法可以是修改片元长度,看这样是否会影响性能。但是要注意,不要添加可以被一些“聪明”的设备驱动轻松优化的指令。

    片元着色的速度与GPU核心频率有关。



    3.2 几何阶段的瓶颈定位


    几何阶段是最难进行瓶颈定位的阶段。这是因为如果在这个阶段的工作负载发生了变化,那么其他阶段的一个或两个阶段的工作量也常常发生变化。为了避免这个问题,Cebenoyan [1] 提出了一系列的试验工作从光栅化阶段后的管线。

    在几何阶段有两个主要区域可能出现瓶颈:顶点与索引传输( Vertex and

    Index Transfer)和顶点变换阶段(Vertex Transformation Stage)。要看瓶颈是否是由于顶点数据传输的原因,可以增加顶点格式的大小。这可以通过每个顶点发送几个额外的纹理坐标来实现,例如。如果性能下降,这个部分就是瓶颈。

    顶点变换是由顶点着色器或固定功能管线的转换和照明功能完成的。对于顶点着色器瓶颈, 测试包括使着色器程序更长。为了确保编译器没有优化这些附加指令,必须采取一些注意事项。对于固定功能管线,可以通过打开附加功能(如镜面高光)或将光源转换成更复杂的形式(例如聚光灯)来提高处理负荷。

    下文将对几何阶段两个常可能是瓶颈的阶段的定位方法进行进一步论述。



    3.2.1 顶点与索引传输的瓶颈定位


    GPU渲染管线的第一步,是让GPU获取顶点和索引。而GPU获取顶点和索引的操作性能取决于顶点和索引的实际位置。其位置通常是在系统内存中(通过AGP或PCI Express总线传送到GPU),或在局部帧缓冲内存中。通常,在PC平台上,这取决于设备驱动程序而不是应用程序,而现代图形API允许应用程序提供使用提示,以帮助驱动程序选择正确的内存类型。

    可以通过调整顶点格式的大小,来确定得到顶点或索引传输是否是应用程序的瓶颈。

    如果数据放在系统内存内,得到顶点或索引的性能与AGP或PCI Express总线传输速率有关;如果数据位于局部缓冲内存,则与内存频率有关。

    如果上述测试对性能都没有明显影响,那么顶点与索引传输阶段的瓶颈也可能位于CPU上。我们可以通过对CPU降频来确认这一事实,如果性能按比例进行变化,那么CPU就是瓶颈所在。


    3.2.2 顶点变换的瓶颈定位


    渲染管线中的顶点变换阶段(Vertex Transformation Stage)负责输入一组顶点属性(如模型空间位置、顶点法线、纹理坐标等等),以及生产一组适合裁剪和光栅化的属性(如齐次裁剪空间位置,顶点光照结果,纹理坐标等等)。当然,这个阶段的性能与每个顶点完成的工作,以及正在处理的顶点数量有关。

    对于可编程的顶点变换,只要简单地改变顶点程序的长度,就能确定顶点处理是否是瓶颈。如果此时发生性能的变化,就可以判定顶点处理阶段是瓶颈所在。如上文提到过的,如果要增加指令,在添加富有意义的指令时需要留心,

    以防止被编译器或驱动将指令优化掉。例如,因为驱动程序通常不知道程序编译时常量的值,没有被常量寄存器引用的空操作指令(no-ops)不能被优化(如加入一个含有值为零的常量寄存器)。

    对于固定功能的顶点变换,判定瓶颈则有点麻烦。试着通过改变顶点的工作,例如修改镜面光照或纹理坐标生成的状态来修改负载。

    另外需要注意,顶点处理的速度与GPU核心频率有关。



    3.3 应用程序阶段的瓶颈定位


    以下是应用程序阶段的瓶颈定位的一些策略的总结:

      • 可以用Profiler工具查看CPU的占用情况。主要是看当前的程序是否使用了接近100%的CPU占用。比如AMD出品的Code
        Analyst代码分析工具,可以对运行在CPU上的代码进行分析和优化。Intel也出品了一个称为Vtune的工具,可以分析在应用程序或驱动器(几何处理阶段)中时间花费的位置情况。
    • 一种巧妙的方法是发送一些其他阶段工作量极小甚至根本不工作的数据。对于某些API而言,可以通过简单地使用一个空驱动器(就是指可以接受调用但不执行任何操作)来取代真实驱动器来完成。这就有效地限制了整个程序运行的速度,因为我们没有使用图形硬件,因此CPU始终是瓶颈。通过这个测试,我们可以了解在应用阶段没有运行的阶段有多大的改进空间。也就是说,请注意,使用空驱动程序还隐藏了由于驱动程序本身和阶段之间的通信所造成的瓶颈。
    • 另一个更直接的方法是对CPU 进行降频( Underclock)。如果性能与CPU速率成正比,则应用程序的瓶颈与CPU相关。但需要注意,降频的方法可以帮助识别瓶颈,也有可能导致一个之前不是瓶颈的阶段成为瓶颈。
    • 另外,则是排除法,如果GPU阶段没有瓶颈,那么CPU就一定是瓶颈所在。




    四、下篇:渲染管线的优化策略


    一旦确定了瓶颈位置,就可以对瓶颈所处阶段进行优化,以改善我们游戏的性能。下面根据解决问题的不同阶段,对一些优化策略进行了分类整理,将分为六个部分来进行呈现:

      • 对CPU的优化策略
      • 应用程序阶段的优化策略
      • API调用的优化策略
      • 几何阶段的优化策略
      • 光照计算的优化策略
      • 光栅化阶段的优化策略


    4.1 对CPU的优化策略


    许多应用的瓶颈都位于CPU,有的是正当理由(如复杂的物理或AI运算)导致,有的是因为不好的批处理或资源管理导致。如果已经发现应用程序受到CPU限制,可以试行下列建议,以对渲染管线中CPU的性能进行优化。


    4.1.1 减少资源锁定


    每当执行一个需要访问GPU的同步操作,就可能严重堵塞GPU管线,这将消耗CPU和GPU两者的周期。CPU必须保持在一个循环中,等待GPU管线工作,直到它闲下来并返回所请求的资源,这种等待会造成CPU周期的浪费。然后GPU等待对管线的再填充,这种等待又造成GPU周期的浪费。

    上述的锁定发生在以下情况下:

      • 对前面正在渲染的表面进行锁定或读出时
      • 对GPU正在读的表面进行写入,例如纹理或顶点缓冲区

    而减少资源锁定的方法,可以尝试避免访问渲染期间GPU正在使用的资源。


    4.1.2 批次的尺寸最大化


    这个策略也可以称为“将批次的数量减到最小”。

    批次(batch)是调用单个API渲染所做的一组基本渲染。用来绘制几何体的每个API函数调用,都有对应的CPU消耗。因此最大限度地增加每次调用所提交的三角形的数量,CPU渲染给定数目三角形的消耗就可以减到最小。也即批次的尺寸乘以批次数量得到的工作总量一定,此消彼长。

    使批次最大化的技巧列举如下:

      • 若使用了三角形带(Triangle Strips),则使用退化三角形(Degenerate Triangles)将不相交的条带拼接起来。这样就能够一次发送多条三角形带,以便能在单个Draw Call中共享材质。
      • 使用纹理页(Texture Pages)。不同物体使用不同纹理时,批次时常会被打破,若通过把多个纹理安排进单个的2D纹理内并适当设定纹理坐标,就能在单个Draw Call中发送使用了多个纹理的几何体。此技术可能存在mipmapping和反走样的问题,而回避大部分这类问题的技术是,把单个的2D纹理打包到一个立方体贴图的各个面内。
      • 使用Shader分支来增加单个批次大小从而合批。现代GPU具有灵活的顶点和片元处理管线。允许Shader里有分支。例如,若两个分开的批次,因为其中一个需要四个骨骼蒙皮顶点着色器,而另一个需要两个骨骼蒙皮顶点着色器,你可以编写一个顶点着色器来遍历所需的骨骼数量,累积混合权重,然后在权重相加为一个时跳出循环。这样两个批次就可以合并为一个。在不支持shader分支的架构上,可以实现相似的功能,方法是上述两种情况都使用4块骨骼的顶点着色器,对骨骼数量不足4块的顶点,将其骨骼权重因子设置为0。
      • 将顶点着色器常量内存(vertex shader constant memory)作为矩阵查找表(Lookup Table of matrices)使用。通常,当许多小对象共享所有的属性,但仅矩阵状态不同时(例如,含相似树木的森林,或一个粒子系统),批次就会遭到破坏。这时,可以把n个不同的矩阵加载到顶点着色器常量内存中,并将索引以每个对象的顶点格式存储在常量内存中。然后使用此索引查询顶点shader的常量内存,并使用正确的变换矩阵,从而一次渲染n个对象。
      • 尽可能远地往管线下端推迟决策。若要速度更快,应该使用纹理的alpha通道作为发光值,而不是打破批次,为光泽设定一个像素shader常量。同样地,把着色数据放入纹理和顶点可以使单个批次的提交量更大。


    4.2 应用程序阶段的优化策略


    对应用程序阶段的优化,可以通过提高代码的执行速度,以及提到程序的存储访问速度(或者减少存储访问的次数)来实现。下面将给出一些通用的优化技术,适用于大多数的CPU。

    最基本的代码优化策略包括为编译器打开优化标志。通常有很多不同的标志,一般需要检查哪些标志可以应用于程序代码中,而且对所使用的优化选项一般不做任何假设。例如,可以将编译器的开关设置为“最小代码大小(minimize code size)”而不是“速度优化(optimizing for speed)”,这样可以导致代码执行速度的提高,因为缓冲性能提高了。此外,如果可能的话,可以尝试不同的编译器,因为不同编译器一般是按照不同的方式进行优化的。

    对于代码优化来说,定位大部分时间花在哪部分代码是很关键的。一个好的代码profiler是找到大部分运行时间都花费在代码哪里的关键。然后在这些地方进行优化工作。而这些位置通常是内部循环,或是每帧执行多次的代码片段。(PS:本文文末提供了一系列常用的profiler工具的列表)

    优化的基本原则是尝试多种策略,包括重新检查算法,假设,以及代码语法等,也就是尽可能多的尝试各种变化情况。

    下文将从内存层面和代码层面进一步说明。


    4.2.1 内存层面的优化


    对于存储层次结构来说,如何在各种不同的CPU体系结构上编写执行速度较快的代码变得越来越重要。在编写程序时,应该注意下列准则:

      • 在代码中连续访问的存储内容在内存中也应保持连续存储。例如,当渲染一个三角形网格的时候,如果访问的顺序是:纹理坐标#0、法线#0、颜色#0、顶点#0、纹理坐标#1、法线#1等,那么在内存中也应该按这个顺序连续存储。尽量避免指针的间接、跳转,以及函数调用,因为它们很容易显著降低CPU中缓冲的性能。比如当一个指针指向另一个指针,而这个指针又指向其他指针时,以此类推,类似典型的链表和树结构,而这将导致数据缓存未命中(cache misses for data)。为了避免这种情况,应该尽可能使用数组来代替。

    PS: 上述条准则的思想有点类似《Game Programming Patterns》书中讲到的数据局部性模式(Data Locality pattern),具体可以参考《Game Programming Patterns》这本书的web版关于数据局部性模式的讲解:gameprogrammingpatterns.com

      • 某些系统中,默认的内存分配和删除功能可能比较慢,因此,在启动时最好为相同大小的对象分配一个大的内存池,然后使用自己分配或空闲部分来处理该池的内存。
      • 尽量尝试去避免在渲染循环中分配或释放内存。例如,可以单次分配暂存空间(scratch space),并且使用栈、数组等其他仅增长的数据结构(也可以使用标志位来标识哪些元素应该被视为已删除)。
      • 对数据结构尝试用不同的组织形式。例如,Hecker[2]指出,对于一个简单的矩阵乘法器而言,通过不同的矩阵结构可以节省大量的计算开销。例如,一个结构数组如下:
    struct Vertex {float x,y,z;} 
    Vertex myvertices[1000];

    或者为:

    struct VertexChunk {float x[1000],y[1000],z[1000];} 
    VertexChunk myvertices;

    对于给定的体系结构而言,上述第二种结构对于SIMD命令来说要更好一些。但是随着顶点数目的增多,高速缓存的命中失误率也会随之增多。当数组大小增加到一定程度时,下面这种混合方案可能是最好的一种选择:

    struct Vertex4 {float x[4],y[4],z[4];} 
    Vertex4 myvertices[250];


    4.2.2 代码层面的优化


    下面的会列出编写与计算机图形相关的高效代码的一些技术。这些方法随着编译器和不断发展的CPU而有所不同,但大多数已经保存了很多年(主要是针对C/C++而言):

      • 善用SIMD。单指令多数据流(Single Instruction Multiple Data,SIMD),例如Intel的MMX或SSE,以及AMD的3D Now!指令集,在很多情形下能获得很好的性能,可以并行计算多个单元,且比较适合用于顶点操作。
      • 使用float转long转换在奔腾系列处理器上速度较慢。如果可以请尽量避免。
      • 尽可能避免使用除法。相对于其他大多数指令而言,执行除法指令所需要的时间大约是执行其他指令所需时间的2.5倍或更多。
      • 许多数学函数,如sin、cos、tan、exp、arcsin等,计算开销较高,使用的时候必须小心。如果可以接受低精度,那么只需要使用麦克劳林(MacLaurin)或泰勒(Taylor)级数的前几项即可。由于现代CPU对内存的访问的代价依然很高,因此使用级数的前几项比使用查找表(Lookup Tables)强得多。
      • 条件分支会有一定的开销,Shader中的条件分支开销尤甚。尽管大多数处理器都有分支预测功能,但是这意味着只有准确地进行分支预测,才有可能降低计算开销。错误的分支预测对一些体系结构、特别是对于具有深管线的体系结构来说,计算开销通常会较高。
      • 对于经常调用的小函数使用内联(Inline)。
      • 在合理的情况下减少浮点精度,比如用float代替double。而当选用float型来代替double型数据时,需要在常数末尾加上一个f。否则,整个表达式就会被强制转换为double型;因此,语句float x =2.42f;要比float x = 2.42;执行得更快。
      • 尽可能使用低精度数据,让发送到图形管线的数据量更少。
      • 虚函数方法、动态转换、(继承)构造,以及按值传递结构体(passing structs by value)都会对效率造成一定影响。据了解,一帧画面中大约有40%的时间花费在用于模型管理的虚拟继承层次结构上。Blinn提出了一种技术[3],可以避免计算C++中向量表方面的一部分开销。


    4.3 API调用的优化策略


    上文已经提到,批次(batch)是调用单个API渲染所做的一组基本渲染。用来绘制几何体的每个API函数调用,都有对应的CPU消耗。改进批次过小问题的方法有很多种,且它们都有共同的目标——更少的API调用。以下是一些要点。

      • 一种减少API调用的方法是使用某种形式的实例(Instance)。大多数API都支持在一次调用中拥有一个对象并进行多次绘制。因此,与其为森林中的每一棵树单独调用API,不如使用单次调用来渲染树模型的许多副本。如下图。

    图4 植被实例(Vegetation instancing)。所有同样颜色的物体在一个Draw Call中进行渲染。


    PS: 此思想有点类似设计模式中的享元模式(flyweight pattern)。具体可以参考《Game Programming Patterns》这本书的web版关于享元模式的精彩讲解:gameprogrammingpatterns.com


      • 进行批处理(batching)。批处理的基本思想是将多个对象合并成一个对象,因此只需要一个API调用便可以渲染整个集合。批处理中的合并可以一次性完成,且缓冲区对静态对象集合都能每帧进行重用。对于动态对象,可以使用多个网格填充单个缓冲区。但这种基本方法的局限性是,网格中的所有对象都需要使用一组相同的着色器程序,即相同的材质。
      • 可以用不同的颜色来合并对象,例如,通过用标识符对每个对象的顶点进行标记。着色器程序可以根据此标识符,查找使用什么颜色来遮挡物体。同样的想法可以扩展到其他表面属性。类似地,附于表面的纹理也可以用于标识使用哪种材质。而单独物体的光照贴图需合并成纹理图集(texture atlases)或纹理数组(texture array)。
      • 多人同屏的场景很适合使用实例进行渲染,其中每个角色都拥有独特的一套外表。而进一步的变化可以添加随机的肤色和贴花。这种基于实例的方法也可以结合LOD技术进行。如下图。

    图5 多人同屏场景(crowd scene)。使用实例(instance)来减少Draw Call,也可以结合LOD技术使用,比如对于远处的模型,使用 impostors进行渲染。


      • 提高性能的另一种方法是通过将具有类似渲染状态的对象(顶点和像素着色器、纹理、材质、光照、透明度等)分组并将它们按顺序渲染,从而最小化状态更改
      • 改变状态时,有时需要完全或部分地清理管线。出于这个原因,改变着色器程序或材质参数可能非常昂贵。具有使用共享材质(shared material)的节点可以进行分组,以获得更好的性能,而用共享纹理(shared texture)绘制多边形可以减小纹理缓存的抖动。另外,正如上文提到的,一种减少纹理改变的变化的方法便是把一些纹理图像到一个大的纹理图集或纹理数组中。
      • 理解对象缓冲(object buffer)在渲染时的分配和存储方式也同样重要。对于一个含CPU和GPU的系统,GPU和CPU有各自的内存,而图形驱动程序通常控制对象所在的位置,它也可以给出存储在何处是更优的建议。一个常见的类型分类是静态与动态缓冲区。如果一个物体不形变,或者形变可以完全由着色器程序(如蒙皮)完成,那么在GPU内存中存储对象的数据是较为合适的。而该对象的不变属性可以通过将其存储在为静态缓冲区中。通过这种方式,不必在渲染的每帧在总线上发送这些不变的数据,从而避免在管线的这一阶段出现瓶颈。


    4.4 几何阶段的优化策略


    几何阶段主要负责变换、光照、裁剪、投影,以及屏幕映射。其中,变换和光照过程比较容易优化,其他几个部分的优化稍显困难。以下是一些要点:

      • 变换、光照、裁剪、投影,以及屏幕映射操作可以使用较低精度的数据,以减小开销。
      • 合理地使用索引和顶点缓冲区可以帮助几何阶段减小计算量。
      • 可以简化模型来减小整个管线的顶点和绘制图元的数量,以降低顶点数据传输和顶点变换成本。而诸如视锥裁剪和遮挡剔除之类的技术避免了将全部的图元发送到管线。
      • 可以使用缓存感知(cache-oblivious)布局算法,其中顶点以某种形式排列,以最大限度地提高缓存重用性,从而节省处理时间。(具体可见RTR3原文 12.4.4节)
      • 同理,为了节省内存和访问时间,尽可能在顶点、法线、颜色和其他着色参数上,选择更低精度的数据格式。有时我们会在half、single、double。float精度之间做选择,需要注意,除了其中因为精度更低带来的速度提升外,有些格式也会因为是硬件内部使用的原生格式(native format)而更快。
      • 减少内存使用的另一种方法是将顶点数据存储在压缩格式中。对此,Deering [4]深入讨论了这种技术. Calver [5]提出了各种方案,使用顶点着色器进行解压。zarge [ 6 ]也指出,数据压缩也有助于调整顶点格式缓存线。而Purnomo等人[ 7 ]结合简化方法和顶点的量化技术,使用图像空间的度量,提出了为一个给定的目标网格尺寸优化网格的方案。


    4.4.1 减少顶点传输的开销


    顶点传递是瓶颈的可能性很小,但也偶有发生。假如顶点或索引(索引是瓶颈的可能性更小)的传递是应用瓶颈,可以试着使用下列各项策略:

      • 在顶点格式中使用尽可能少的位。位数足够即可,不需要对所有数据都使用浮点格式(例如对颜色)。
      • 在顶点程序中产生可推导的顶点属性,而不是把他们存储在输入顶点格式中。例如,正切线(tangent)、法线(normal)和副法线(binormal)通常不需要都存储。给出任意两个,能用Vertex-program简单叉积推导出第三个。这项技术,即为用顶点处理速度去换取顶点传输速率。
      • 使用16位的索引代替32位的索引。16位索引更容易查找。移动起来更轻量,而且占用的内存更少。
      • 以相对连续的方式访问顶点数据。当访问顶点数据时现代GPU可以进行缓存。因为在任意内存层次中,引用的空间局部性有助于最大化缓存的命中率,这可以减少对带宽的要求。


    4.4.2 顶点处理的优化


    顶点处理是现代GPU的瓶颈可能性很小,但是也偶有发生,这取决于所使用的模式和目标硬件。如果发现顶点处理是瓶颈所在,可以试用如下列举的各项策略:

      • 对变换和照明(T&L)后的顶点存储进行优化。现代GPU有一个小的先入先出(FIFO)的缓存,用于存储最近所转换的顶点结果:命中这个高速缓冲器可以保存所有的变换和照明,以及所有流水线早先完成的工作。为了利用这个缓存的优势,必须使用经过索引的图元,而且必须对顶点进行排序,以最大化网格上的引用局部性。可以帮助完成这个任务的工具有D3DX和NVTriStrip等。
      • 减少所处理的顶点数。这是能想到的很基本的解决方案。但是使用简单的层次细节方案,例如一组静态的LOD,确实有助于减少顶点处理的负担。
      • 使用顶点处理LOD。在使用层次细节减少所处理的顶点数时,可以试着把层次细节用于顶点计算本身。例如,对远处的任务没必要完全做4块骨骼的蒙皮,或许可以使用更轻量的光照近似。而如果当前材质的shader是多通道的,那么减少位于远处低LOD级别的渲染通道数量,也会减少顶点处理的成本。
      • 把每个物体的计算留给CPU去做。每个物体或每帧都改变的计算时常在顶点着色器中进行。例如,将方向光矢量转换到视点空间的通常在顶点shader中进行,虽然计算结果只是每帧改变一次。
      • 使用正确的坐标空间。坐标空间的选择时常影响计算视点程序值所需的指令数。例如,计算顶点光照时,如果顶点法线存储在物体空间中,而方向光矢量存储在视图空间中,就须在顶点shader中转换其中之一,将两者转换到统一空间下。而如果改为在CPU上对每个物体一次性地把光矢量转换到物体空间,再进行逐个顶点的转换就没有必要了,这样就节省了GPU顶点处理的运算量。
      • 使用顶点分支来“提前结束”计算。例如,若在顶点着色器中循环多个光源,然后进行法线、[0,1]低动态范围的光照,你可以判断饱和度到1,或者远离光源的顶点,来break掉,避免进一步无用的计算。对于蒙皮阶段有一个类似的优化,当权重之和达到1时,停止计算(因此所有后来加权的值是0)。需要注意,这个方法是否生效,依赖于GPU如何实现顶点分支,无法在所有架构上保证性能的改善。


    4.5 光照计算的优化策略


    考虑光照的影响可以每顶点,每像素的进行计算,光照计算可以通过多种方式进行优化:

      • 首先,应该考虑使用的光源类型,以及可以考虑是否所有的多边形都需要光照。有时模型只需纹理贴图,或者在顶点使用纹理,或只需要顶点颜色。那么很多多边形就无需进行光照计算。
      • 如果光源是静态的,且照明对象是几何体,那么漫反射光照和环境光可以预先计算并存储在顶点颜色中。这样做通常被称为烘焙照明(baking lighting)。一个预光照(prelighting)更复杂的形式是使用辐射度(Radiosity)方法预先计算场景中的漫反射全局光照,而这样的光照可以存储在顶点颜色或光照贴图(lightmaps)中。
      • 控制光源的数量。光源的数量影响几何阶段的性能,更多的光源意味着更少的速度。此外,双面的光照可以比单面光照更为昂贵。当对光源使用固定功能距离衰减时,根据物体与光源的距离来关闭/打开光源是有较为有用,且几乎不会被察觉。而距离足够大时,可以关掉光源。
      • 一种常见的优化方法是根据光源的距离来进行剔除,只渲染受本地光源影响的对象。
      • 另一种减少工作的方法是禁用光源,取而代之的是使用环境贴图(environment map)
      • 如果场景拥有大量光源,可以使用延迟着色技术来限制计算量和避免状态的变化。


    4.6 光栅化阶段的优化策略


    光栅化阶段可以以多种方式进行优化。现将主流的优化策略列举如下:

      • 善用背面裁剪。对封闭(实心)的物体和无法看到背面的物体(例如,房间内墙的背面)来说,应该打开背面裁剪开关。这样对于封闭的物体来说,可以将需光栅化处理的三角形数量减少近50%。但需要注意的是,虽然背面裁剪可以减少不必要的图元处理,但需要花费一定的计算量来判断图元是否朝向视点。例如,如果所有的多边形都是正向的,那么背向裁剪计算就会降低几何阶段的处理速度。
      • 一种光栅化阶段的优化技术是在特定时期关闭Z缓冲(Z-buffering)。例如,在清楚帧缓冲之后,必须要进行深度测试也可以直接渲染出任何背景图像。如果屏幕上的每个像素保证被某些对象覆盖(如室内场景,或正在使用背景天空图),则不需要清楚颜色缓冲区。同样,确保只有在需要时才使用混合模式(blend modes)。
      • 值得一提的是,如果在使用Z缓冲,在一些系统上使用模板缓冲不需要额外的时间开销。这是因为8位的模板缓冲的值是存储为24位z深度值的同一个word中。
      • 优先使用原生的纹理和像素格式。即使用显卡内部使用的原生格式,以避免可能会有的从一种格式到另一种格式的昂贵转换。
      • 另一种适用于光栅化阶段的优化技术是进行合适的纹理压缩。如果在送往图形硬件之前已经将纹理压缩好,那么将它发送到纹理内存中的速度将会非常迅速。压缩纹理的另一个优点是可以提高缓存使用率,因为经过压缩的纹理会使用更少的内存。
      • 另一种有用的相关优化技术是基于物体和观察者之间的距离,使用不同的像素着色器。例如,在场景中有三个飞碟模型,最接近摄像机的飞碟的可能用详细的凹凸贴图来进行渲染,而另外两个较远的对象则不需要渲染出细节。此外,对最远的飞碟可以使用简化的镜面高光,或者直接取消高光,来简化了计算量以及减少采样次数。
      • 理解光栅化阶段的行为。为了很好地理解光栅阶段的负荷,可以对深度复杂度进行可视化,所谓的深度复杂度就是指一个像素被接触的次数。生成深度复杂度图像的一种简单方法就是,使用一种类似于OpenGL的glBlendFunc(GL ONE,GL ONE)调用,且关闭Z缓冲。首先,将图像清除成黑色;然后,对场景中所有的物体,均使用颜色(0,0,1)进行渲染。而混合函数(blend function)设置的效果即是对每个渲染的图元来说,可以将写入的像素值增加(0,0,1)。那么,深度复杂度为0的像素是黑色,而深度复杂度为255的像素为全蓝色(0, 0, 255)。
      • 可以通过计数得到通过Z缓冲与否的像素的数量,从而确定需进一步优化的地方。使用双通道的方法对那些通过或没通过Z缓冲深度测试的像素进行计数。在第一个通道中,激活Z缓冲,并对那些通过深度测试的像素进行计数。而对那些没有通过深度测试的像素进行计数,可以通过增加模板缓冲的方式。另一种方法是关闭Z缓冲进行渲染来获得深度复杂度,然后从中减去第一个通道的结果。

    通过上述方法得到结果后,可以确认:

    (1)场景中深度复杂度的平均值、最小值和最大值

    (2)每个图元的像素数目(假定已知场景中图元的数目);

    (3)通过或没有通过深度测试的像素数目。

    而上述这些像素数量对理解实时图形应用程序的行为、确定需要进一步优化处理的位置都非常有用。

    通过深度复杂度可以知道每个像素覆盖的表面数量,重复渲染的像素数量与实际绘制的表面的多少是相关的。假设两个多边形覆盖了一个像素,那么深度复杂度就是2。如果开始绘制的是远处的多边形,那么近处的多边形就会重复绘制整个远处的多边形,重绘数量也就为1。如果开始绘制的是近处的多边形,那么远处的多边形就不会通过深度测试,从而也就没有重绘问题。假设有一组不透明的多边形覆盖了一个像素,那么平均绘制数量就是调和级数:

    H(n)=1+\frac{1}{2}+\frac{1}{3}+...+\frac{1}{n} \\

    上式背后所包含的逻辑是:第一个绘制的多边形是一次绘制:第2个多边形在第一个多边形之前绘制的概率是1/2:第三个多边形在前两个多边形前绘制的概率是1/3。依次类推,当n取极极限时:

    \lim_{n\rightarrow \infty }H(n) = ln(n)+\gamma \\

    其中,γ=0.57721…是Euler-Mascheroni常量。当深度复杂度很低时,重绘量会急剧增加,但增加速度也会逐渐减少。深度复杂度为4,平均绘制2.08次,深度复杂度为11,平均绘制3.02次,但深度复杂度为12367,平均绘制10次。

    通过进行粗排序,并从前向后场景的渲染对性能提升会有帮助。这是因为后面绘制的被遮挡物体无需写入颜色缓冲区或Z缓冲区中。此外,在到达像素着色器程序之前,像素片元也可以被遮挡剔除硬件丢弃掉。


    • 另一种称为“early z pass”的技术对带复杂片元着色器的表面很有用。即首先渲染z缓冲,然后再对整个场景进行渲染。此方法对于避免不必要的像素着色器的计算非常有用,因为只有可见的表面才会进行像素着色的计算。而通过BSP树遍历或显式地排序提供了一个粗略的前后顺序,可以提供很多优势,而不需要额外的Pass。


    4.6.1 加速片元着色


    如果你正在使用长而复杂的片元着色器,那么往往瓶颈就处于片元着色器中。若果真如此,那么可以试试如下这些建议:

      • 优先渲染深度。在渲染主要着色通道(Pass)前,先进行仅含深度的通道(depth-only (no-color) pass)的渲染,能显著地提高性能,尤其是在高深度复杂性的场景中。因为这样可以减少需要执行的片元着色量,以及帧缓冲存储器的存取量,从而提高性能。而为了发挥仅含深度的通道的全部优势,仅仅禁用颜色写入帧缓冲是远远不够的,同时也应该禁用所有向片元的着色,甚至禁用影响到深度以及颜色的着色(比如 alpha test)。
      • 帮助early-z优化(即Z缓冲优化),来避免多余片元处理 。现代GPU配有设计良好的芯片,以避免对被遮挡片元的着色,但是这些优化依赖场景知识。而以粗略地从前向后的顺序进行渲染,可以明显提高性能。以及,先在单独的pass中先渲染深度(见前一条tip),通过将着色深度复杂度减少到1,可以有效地帮助之后的pass(主要的昂贵的shader计算的位置)进行加速。
      • 在纹理中存储复杂功能。纹理作为查找表( lookup tables)其实非常好用,而且可以无消耗地过滤它们的结果。一个典型例子便是单位立方体贴图,它仅允许以一个单一纹理查找的代价来高精度地对任意向量进行标准化。
      • 将更多每片元的工作移到顶点着色器。对于优化的大方向而言,正如顶点着色器中的每个物体的计算量工作应该尽可能地移到CPU中一样,每顶点的计算也应该尽量被移到顶点着色器(连同在屏幕空间中线性插值计算)。常见的例子包括计算向量和坐标系之间的变换向量。
      • 使用必需的最低精度。诸如DirectX之类的API允许我们在着色器代码中指定精度,以减少精度高所带来的额外计算量。很多GPU都可以利用这些提示来减少内部精度以及提高性能。
      • 避免过度归一化(Normalization)。在写shader时,对每个步骤的每个矢量都进行归一化的习惯,常常被调侃为“以归一化为乐(Normalization-Happy)”。这个习惯通常来说其实是不太好的习惯。我们应该意识到不改变长度的变换(例如标准正交基上的变换)和不依赖矢量长度的计算(例如正方体贴图的查询)是完全没必要进行归一化后再进行的。
      • 考虑使用片元着色器的LOD层次细节。虽然片元着色器的层次细节不像顶点着色器的层次细节影响那么大(由于投射,在远处物体本身的层次细节自然与像素处理有关),但是减少远处着色器的复杂性和表面的通道数,可以减少片元处理的负载。
      • 在不必要的地方禁用三线性过滤。在现代GPU结构的片元着色器中计算三线性过滤(Trilinear filtering),即使不消耗额外的纹理带宽,也要消耗额外的循环。在mip级别转换不容易辨别的纹理上,关掉三线性过滤,可以节省填充率。
      • 使用尽可能简单的Shader类型。在Direct3D和OpenGL中,对片元进行着色都有多种方法。举例来说,在Direct3D 9中,可以指定片元着色的使用,随着复杂性和功率的增加,有纹理阶段、像素shader版本 1.x、像素 shader版本 2.x,以及像素shader 3.0等。一般而言,应该使用最简单的着色器版本来创建预期的效果。更简单的着色版本提供了更多的一些隐式编译选项,通常可以用来让它们更快地被GPU驱动程序编译成处理像素的原生代码。


    4.6.2 减少纹理带宽


    如果发现内存带宽是瓶颈,但是大部分结果又要从纹理中取得,那么可以考虑以下方面的优化。

      • 减少纹理尺寸。考虑目标分辨率和纹理坐标。如果玩家是不是真的会看到最高级别的mip级别,如果不是,就应该考虑缩减纹理大小。此方法在超载的帧缓冲存储器从非本地存储器(例如系统存储器,通过AGP或PCI Express总线)强制进行纹理化时会非常有用。一个NVIDIA在2003年出品的名叫NVPerfHUD的工具可以帮助诊断这个问题,其显示了各个堆(heaps)中由驱动所分配的内存量。
      • 压缩所有的彩色纹理。应该压缩作为贴花或细节的一切纹理,根据特定纹理alpha的需要,选用DXT1、DXT3或DXT5进行压缩。这个步骤将会减少内存使用,减少纹理带宽需求,并提高纹理缓存效率。
      • 避免没必要的昂贵纹理格式。64位或128位浮点纹理格式,显然要花费更多带宽,仅在不得已时才可以使用它们。
      • 尽可能地在缩小的表面上使用mipmapping。mipmapping除了可以通过减少纹理走样改善质量外,还可以通过把纹理内存访问定位在缩小的纹理上来改善纹理缓存效用。如果发现某个mipmapping使表面看起来很模糊,不要禁用mipmapping,或增加大的LOD级别的基准偏移,而是使用各向异性过滤(anisotropic filtering),并适当调整每个批次各向异性的级别。


    4.6.3 优化帧缓冲带宽


    管线的最后阶段,光栅化操作,与帧缓冲存储器直接衔接,是消耗帧缓冲带宽的主要阶段。因此如果带宽出了问题,经常会追踪到光栅化操作。下面几条技巧将讲到如何优化帧缓冲带宽。

      • 首先渲染深度。这个步骤不但减少片元着色的开销(见上文),也会减少帧缓冲带宽的消耗。
      • 减少alpha混合。当alpha混合的目标混合因子非0时,则要求对帧缓冲区进行读取和写入操作,因此可能消耗双倍的带宽。所以只有在必要时才进行alpha混合,并且要防止高深度级别的alpha混合复杂性。
      • 尽可能关闭深度写入。深度写入会消耗额外的带宽,应该在多通道的渲染中被禁用(且多通道渲染中的最终深度已经在深度缓冲区中了)。比如在渲染alpha混合效果(例如粒子)时,也比如将物体渲染进阴影映射时,都应该关闭深度写入。另外,渲染进基于颜色的阴影映射也可以关闭深度读取。
      • 避免无关的颜色缓冲区清除。如果每个像素在缓冲区都要被重写,那么就不必清除颜色缓冲区,因为清除颜色缓冲区的操作会消耗昂贵的带宽。但是,只要是可能就应该清除深度和模板缓冲区,这是因为许多早期z值优化都依赖被清空的深度缓冲区的内容。
      • 默认大致上从前向后进行渲染。除了上文提到的片元着色器会从默认大致上从前向后进行渲染这个方法中受益外,帧缓冲区带宽也会得到类似的好处。早期z值硬件优化能去掉无关的帧缓冲区读出和写入。实际上,没有优化功能的老硬件也会从此方法中受益。因为通不过深度测试的片元越多,需要写入帧缓冲区的颜色和深度就越少。
      • 优化天空盒的渲染。天空盒经常是帧缓冲带宽的瓶颈,因此必须决定如何对其进行优化,以下有两种策略:

    (1)最后渲染天空盒,读取深度,但不写入深度,而且允许和一般的深度缓冲一起进行早期early-z优化,以节省带宽。

    (2)首先渲染天空盒,而且禁用所有深度读取和写入。

    以上两种策略,究竟哪一种会节省更多开端,取决于目标硬件的功能和在最终帧中有多大部分的天空盒可见。如果大部分的天空盒被遮挡,那么策略(1)更好,否则,策略(2)可以节省更多带宽。

      • 仅在必要时使用浮点帧缓冲区。显然,这种格式比起较小的整数格式来说,会消耗更多的带宽,所以,能不用就不用。对多渲染目标( Multiple Render Targets,MRT)也同样如此。
      • 尽可能使用16为的深度缓冲区。深度处理会消耗大量带宽,因此使用16位代替32位是极有好处的,且16位对于小规模、不需要模板操作的室内场景往往就足够了。对于需要深度的纹理效果,16位深度缓冲区也常常足够渲染,如动态的立方体贴图。
      • 尽可能使用16位的颜色。这个建议尤其适用于对纹理的渲染效果,因为这些工作的大多数,用16位的颜色能工作得很好,例如动态立方体贴图和彩色投射阴影贴图。


    综上,现代GPU能力和可编程性的增强,使得改善机器性能变得更复杂。无论是打算加速应用程序的性能,还是希望无成本地改善图像质量,都需要对渲染管线的内部工作原理有深刻理解。而GPU管线优化的基本思路是,通过改变每个单位的负荷或计算能力来识别瓶颈,然后运用每个传递单元工作原理的理解,系统地解决那些瓶颈。


    五、主流性能分析工具列举


    有很多不错的分析图形加速器和CPU使用的的工具,以及性能优化相关的Profiling工具,在这里,将主流的工具进行列举:


    现今主流游戏引擎提供的Profiler有:


    图6 Unreal Engine的GPU Visualizer


    图7 Unity的Profiler



    六、更多性能优化相关资料


      • 虽然有点过时,Cebenoyan的文章[1]概述了如何找到提高效率的瓶颈和技术。
      • 《NVIDIA's extensive guide》[8]包含了相关的各种主题。
      • 一些很赞的C++优化指南包括Fog的文章[9]和Isensee的文章[10]。


    Reference


    [1] Cebenoyan, Cem, “Graphics Pipeline Performance,” in Randima Fernando, ed.,GPU Gems, Addison-Wesley, pp. 473–486,2004. Cited on p. 681, 699, 701, 716,722

    [2] Hecker, Chris, “More Compiler Results, and What To Do About It,” Game Developer, pp. 14–21, August/September 1996. Cited on p. 705

    [3] Blinn, Jim, “Optimizing C++ Vector Expressions,” IEEE Computer Graphics &Applications, vol. 20, no. 4, pp. 97–103, 2000. Also collected in [110], Chapter 18.Cited on p. 707

    [4] Deering, Michael, “Geometry Compression,” Computer Graphics (SIGGRAPH 95 Proceedings), pp. 13–20, August 1995. Cited on p. 555, 713

    [5] Calver, Dean, “Vertex Decompression Using Vertex Shaders,” in Wolfgang Engel, ed., ShaderX, Wordware, pp. 172–187, May 2002. Cited on p. 713

    [6] Zarge, Jonathan, and Richard Huddy, “Squeezing Performance out of your Game with ATI Developer Performance Tools and Optimization Techniques,”Game Developers Conference, March 2006. ati.amd.com/developer/g Session-Zarge-PerfTools.pdf

    Cited on p. 270, 699, 700, 701,702, 712, 713, 722, 847

    [7] Purnomo, Budirijanto, Jonathan Bilodeau, Jonathan D. Cohen, and Subodh Kumar,“Hardware-Compatible Vertex Compression Using Quantization and Simplification,”Graphics Hardware, pp. 53–61, 2005. Cited on p. 713

    [8] NVIDIA Corporation, “NVIDIA GPU Programming Guide,” NVIDIA developer website, 2005. http://developer.nvidia.com/object/gpu programming guide.htmlCited on p. 38, 282, 699, 700, 701, 702, 712, 722

    [9] Fog, Agner, Optimizing software in C++, 2007. Cited on p. 706, 722

    [10] Isensee, Pete, “C++ Optimization Strategies and Techniques,” 2007. Cited on p.706, 722


    The end.

    再次,感谢大家一直以来的支持与陪伴。

    With best wish.

    展开全文
  • 网站推广29种方法

    千次阅读 2015-03-23 11:49:28
    总之,在这里你可以了结到当前各种有效的网站推广方法。首先你要了解,网站推广是一个长期而且系统的过程,需要制定明确的目标和计划,并做好相应的准备。 以网站最重要的关键词在主要搜索引擎中排名领先,这是搜索...
  • 在华为工作十年,3650天,工作日3000天左右,这些时间是不是花在最重要的事情上了,有效的、有产出的工作时间究竟有多少,实在值得怀疑。时间管理是我在华为工作当中最大的教训之一,可能也是公司整体性的问题,工作...
  • 是的,萝卜+大棒的简单易行的激励方法已然不能满足IT行业团队管理的需求。原因大概可列举为以下几点:1、程序员是个特殊的人群 程序员是一群喜欢自嘲,表面谦虚,但实际内心有追求,有坚持,甚至有一点孤傲的知识...
  • 小胖亲测,分享3个实用建议,帮助你提升工作效率

    千次阅读 多人点赞 2019-07-22 09:57:52
    在工作中,你是否经常因为赶项目而加班? 或者因为领导突然安排了一些zz任务而打乱...但今天我要讲的是自己亲测有效的,起码在我身上是可以马上看到效果的方法:提升有效工作时间。 故事的开始…… 上上周四跑个客户...
  • 常见的二十软件测试方法详解(史上最全)

    千次阅读 多人点赞 2021-01-27 22:15:57
    测试方法:白盒测试(因为要测源码) 测试内容:模块接口测试(测试模块里面的参数传递是否正确)、局部数据结构测试(测试变量的作用域范围)、路径测试(if-else 判断必须覆盖所有分支)、错误处理
  •  1、ASP.NET中有五控件来验证有效性,可以用CustomValidator派生一个新类来增加自己的认证器;  2、Windows验证需要子System.Windows.Forms.Control.Validating些一个事件处理器。 四十、根据需要选用恰当...
  • 社会生活中十二大著名法则

    千次阅读 2012-03-01 11:49:38
     蘑菇管理是许多****对待初出茅庐者的一管理方法,初学者被置于阴暗的角落(不受重视的部门,或打杂跑腿的工作),浇上一头大粪(无端的批评、指责、代人受过),任其自生自灭(得不到必要的指导和提携)。相信很多人都...
  • 这里对笔试面试最常涉及到的12排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一算法都有基本介绍、...
  • Sybase与Oracle的十二场性能比拼

    千次阅读 2013-01-25 16:57:32
    Sybase与Oracle的十二场性能比拼  Sybase公司成立于1986年,立足于在开放系统平台上研制具有Client/Server体系结构的数据库系统软件产品。当时的Sybase公司由于有效地汲取了其它RDBMS设计过程中的先进技术和概念...
  • 软件测试的十二个误区

    千次阅读 2013-01-11 10:24:03
    软件测试的十二个误区大体总结如下:  1)测试人员不需要了解软件开发的知识:  这个是很多初级测试人员或者部分对测试不理解的开发人员的理解,我们谈到软件测试人员未来的发展方向大致有:自动化测试,性能测试...
  • 总之,在这里你可以了结到当前各种有效的网站推广方法。首先你要了解,网站推广是一个长期而且系统的过程,需要制定明确的目标和计划,并做好相应的准备。 以网站最重要的关键词在主要搜索引擎中排名领先,这是搜索...
  • 人脸检测(十二)--DDFD算法

    万次阅读 2017-11-26 11:08:39
    DDFD(Deep Dense Face Detector)是一基于AlexNet进行微调(finetune)改进的一深度学习的网络模型。是雅虎公司2015年的作品,并发表在了cvpr,论文名为Multi-view Face Detection Using Deep Convoluti...
  • 听说最近《长安十二时辰》比较火,于是趁着一个周末赶紧补一补剧。相信很多人都对其中的"大案牍术"比较感兴趣,靖安司说"大案牍术"选中了张小敬。看到这里,我以为女朋友会问我:...
  • 无人驾驶汽车系统入门(十二)——卷积神经网络入门,基于深度学习的车辆实时检测 上篇文章我们讲到能否尽可能利用上图像的二维特征来设计神经网络,以此来进一步提高识别的精度。在这篇博客中,我们学习一类...
  • 系统学习NLP(十二)--文本表示综述

    千次阅读 2019-03-10 11:23:02
    文本表示,简单的说就是不将文本视为字符串,而视为在数学上处理起来更为方便的向量(也就是...本文重点梳理现有模型,大致分为三类,即基于向量空间模型、基于主题模型和基于神经网络的方法。 基于向量空间模型的...
  • 云计算设计模式(十二)——索引表模式 创建索引过的被查询条件经常被引用的数据存储等领域。这种模式可以通过允许应用程序更快速地定位数据来从数据存储中检索提高查询性能。
  • 十二生肖对应的爱车

    千次阅读 2006-03-09 10:56:00
    十二生肖对应的爱车
  • 登陆网上邻居时为何提示无法访问你可能没有权限使用网络资源 (1)安装NWlinkIPX/SPX/NetBIOS Compatible Transport Protocol协议。 ...(3)右击我的电脑\属性\计算机名,查看该选项卡中出现的局域网工作组名称
  • QE在虚拟段中完成实际的查询工作,并与其它工作进程互通中间结果。  查询计划的每个slice至少需要一个工作进程。工作进程独立完成被赋予的部分查询计划。一个查询执行时,每个虚拟段中有多个并行执行的工作进程。 ...
  • Hibernate(十二

    万次阅读 2019-07-12 09:04:30
    Hibernate 113. 为什么要使用 hibernate?...他很大程度的简化DAO层的编码工作 hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性...
  • 方法需要做四个方面的工作:释放所有的非托管资源;释放所有的托管资源;设置一个状态标记来表示是否已经执行了 Dispose() ;调用 GC.SuppressFinalize ( this )取消对象的终结操作;  十 八 、 区分值类型和...
  • 十二要素应用宣言

    千次阅读 2017-08-23 14:46:19
    如今,软件通常会作为一服务来交付,它们被称为网络应用程序,或软件即服务(SaaS)。12-Factor 为构建如下的 SaaS 应用提供了方法论: 使用标准化流程自动配置,从而使新的开发者花费最少的学习成本加入这个项目...
  • 经典十二著名定律

    千次阅读 2009-11-03 14:47:00
    蘑菇管理是许多组织对待初出茅庐者的一管理方法,初学者被置于阴暗的角落(不受重视的部门,或打杂跑腿的工作),浇上一头大粪(无端的批评、指责、代人受过) ,任其自生自灭(得不到必要的指导和提携)。相信很多人都...
  • @Configuration注解的类通过@Bean注解的方法来声明Bean。通过调用注解了@Bean方法的返回的Bean可以用来构建Bean之间的相互依赖关系,可以通过前文来了解其基本概念。注入inter-bean依赖当@Bean方法依赖于其他的Bean...
  • 关于意志力,不得不说的十二件事

    千次阅读 2017-10-26 09:45:33
    有效方法就是形成习惯。 科学家说,习惯之所以会出现,是因为大脑一直在寻找省力的方式,让所有惯常的行为成为习惯,这样可以让大脑可以有更多的时间休息。不过习惯还未养成时,还需要投入意志力去坚持。一旦...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,848
精华内容 9,139
关键字:

十二种有效工作方法