本系列文章由@浅墨_毛星云 出品,转载请注明出处。  
文章链接: http://blog.csdn.net/poem_qianmo/article/details/53240330
作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442

本文的Github版本:QianMo/Reading-Notes/《游戏编程模式》读书笔记



这是一篇超过万字读书笔记,总结了《Game Programming Patterns》(中译版《游戏编程模式》)一书中所有章节与内容的知识梗概。

我们知道,游戏行业其实一直很缺一本系统介绍游戏编程进阶技巧的书籍,而《游戏编程模式》的出现,正好弥补了这一点。

之前已经有提到过,不同于传统的出版方式,这本书是网络出版,然后Web版完全免费,其更是在amazon上具有罕见的5星评价,可见读者对其的好评程度之高。加之书中内容生动有趣,将各种经验之谈娓娓道来,实在是业界良心。

书本主页:http://gameprogrammingpatterns.com/

Web版全文阅读:http://gameprogrammingpatterns.com/contents.html

全书中文翻译:http://gpp.tkchu.me/




在这篇文章之前,我已经写了三篇相关的读书笔记,但感觉一次一种模式的介绍,节奏太慢,就用这篇总结式的文章来把19种设计模式一次介绍完。

 



 

文章的短版本:全书内容思维导图



以下是《游戏编程模式》一书的内容梗概,全书内容19种模式的思维导图:







本文阅读说明

 


本文按照《游戏编程模式》书中顺序,对全书的19种模式分以下三个方面进行了介绍:

  • 要点
  • 使用场合
  • 引申与参考

依次介绍完19种模式之后,最终给出了一些更多的参考与学习资源。

需要注意,设计模式本身在理解上就比较抽象。而因为本文是设计模式内容的总结式介绍,所以理解坡度自然会比较陡。若总结的部分不太理解的地方,建议大家去阅读原文(在每种模式的“引申与参考”一部分都已经给出了链接),将这篇文章对原文的总结与原文结合起来理解,这样掌握起来会比较顺畅。





 

一、常用GOF设计模式




这一部分介绍了游戏开发中较为常用的六种GOF设计模式:

  • 命令模式
  • 享元模式
  • 观察者模式
  • 原型模式
  • 单例模式
  • 状态模式




1.  命令模式 Command Pattern


命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象,同时支持可撤消的操作。


要点

  • 将一组行为抽象为对象,这个对象和其他对象一样可以被存储和传递,从而实现行为请求者与行为实现者之间的松耦合,这就是命令模式。
  • 命令模式是回调机制的面向对象版本。
  • 命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。
  • 命令模式的优点有:对类间解耦、可扩展性强、易于命令的组合维护、易于与其他模式结合,而缺点是会导致类的膨胀。
  • 命令模式有不少的细分种类,实际使用时应根据当前所需来找到合适的设计方式。

 

使用场合

  • 命令模式很适合实现诸如撤消,重做,回放,时间倒流之类的功能。
  • 基于命令模式实现录像与回放等功能,也就是执行并解析一系列经过预录制的序列化后的各玩家操作的有序命令集合。

 

引申与参考

 

  • 最终我们可能会得到很多不同的命令类。为了更容易实现这些类,定义一个具体的基类,包含一些能定义行为的高层方法,往往会有帮助。可以将命令的主体execute()转到子类沙箱中。
  • 对象可以响应命令,或者将命令交给它的从属对象。如果我们这样实现了,就完成了一个职责链模式。
  • 对于等价的实例,可以用享元模式提高内存利用率。
  • 命令模式的Unity版本实现:https://github.com/QianMo/Unity-Design-Pattern/tree/master/Assets/Behavioral%20Patterns/Command%20Pattern
  • 本节内容相关的英文原文:http://gameprogrammingpatterns.com/command.html
  • 本节内容相关的中文翻译:http://gpp.tkchu.me/command.html

 



2. 享元模式 Flyweight Pattern


享元模式,以共享的方式高效地支持大量的细粒度的对象。通过复用内存中已存在的对象,降低系统创建对象实例的性能消耗。

 

要点

  • 享元模式中有两种状态。内蕴状态(Internal State)和外蕴状态(External State)。
    • 内蕴状态,是不会随环境改变而改变的,是存储在享元对象内部的状态信息,因此内蕴状态是可以共享的。对任何一个享元对象而言,内蕴状态的值是完全相同的。
    • 外蕴状态,是会随着环境的改变而改变的。因此是不可共享的状态,对于不同的享元对象而言,它的值可能是不同的。
  • 享元模式通过共享内蕴状态,区分外蕴状态,有效隔离系统中的变化部分和不变部分。

使用场合


在以下情况都成立时,适合使用享元模式:

  • 当系统中某个对象类型的实例较多的时候。
  • 由于使用了大量的对象,造成了很大的存储开销。
  • 对象的大多数状态都可变为外蕴状态。
  •  在系统设计中,对象实例进行分类后,发现真正有区别的分类很少的时候。

 


引申与参考

  • 为了返回一个已经创建的享元,需要和那些已经实例化的对象建立联系,我们可以配合对象池来进行操作。
  • 当使用状态模式时,很多时候可以配合使用享元模式,在不同的状态机上使用相同的对象实例。
  • 享元模式的Unity版本实现:https://github.com/QianMo/Unity-Design-Pattern/tree/master/Assets/Structural%20Patterns/Flyweight%20Pattern
  • 本节内容相关的英文原文:http://gameprogrammingpatterns.com/flyweight.html
  • 本节内容相关的中文翻译:http://gpp.tkchu.me/flyweight.html

 

 

3. 观察者模式 Observer Pattern



观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。


要点


  • 观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
  • 我们知道,将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。
  • 目前广泛使用的MVC模式,究其根本,是基于观察者模式的。
  • 观察者模式应用广泛,Java甚至将其放到了核心库之中(java.util.Observer),而C#直接将其嵌入了语法(event关键字)中。

 

使用场合

  • 当一个抽象模式有两个方面,其中一个方面依赖于另一个方面,需要将这两个方面分别封装到独立的对象中,彼此独立地改变和复用的时候。
  • 当一个系统中一个对象的改变需要同时改变其他对象内容,但是又不知道待改变的对象到底有多少个的时候。
  • 当一个对象的改变必须通知其他对象作出相应的变化,但是不能确定通知的对象是谁的时候。

 

引申与参考

 

  • 观察者模式的Unity版本实现:https://github.com/QianMo/Unity-Design-Pattern/tree/master/Assets/Behavioral%20Patterns/Observer%20Pattern
  • 本节内容相关的英文原文:http://gameprogrammingpatterns.com/observer.html
  • 本节内容相关的中文翻译:http://gpp.tkchu.me/observer.html

 



4.  原型模式 Prototype Pattern

 


用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

 

要点

  • 原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
  • 原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与其他模式混用,他的原型类Prototype也常用抽象类来替代。
  • 使用原型模式拷贝对象时,需注意浅拷贝与深拷贝的区别。
  • 原型模式可以结合JSON等数据交换格式,为数据模型构建原型。

 

使用场合

  • 产生对象过程比较复杂,初始化需要许多资源时。
  • 希望框架原型和产生对象分开时。
  • 同一个对象可能会供其他调用者同时调用访问时。

 

参考与引申

  • 原型模式的Unity版本实现:https://github.com/QianMo/Unity-Design-Pattern/tree/master/Assets/Creational%20Patterns/Prototype%20Pattern
  • 本节内容相关的英文原文:http://gameprogrammingpatterns.com/prototype.html
  • 本节内容相关的中文翻译:http://gpp.tkchu.me/prototype.html

 

 


5.  单例模式 Singleton Pattern



保证一个类只有一个实例,并且提供了访问该实例的全局访问点。

 


要点

  • 单例模式因其方便的特性,在开发过程中的运用很多。
  • 单例模式有两个要点,保证一个类只有一个实例,并提供访问该实例的全局访问点。
  • 尽量少用单例模式。单例模式作为一个全局的变量,有很多全局的变量的弊病。它会使代码更难理解,更加耦合,并且对并行不太友好。

 

使用场合

  • 当在系统中某个特定的类对象实例只需要有唯一一个的时候。
  • 单例模式要尽量少用,无节制的使用会带来各种弊病。
  • 为了保证实例是单一的,可以简单的使用静态类。 还可以使用静态标识位,在运行时检测是不是只有一个实例被创建了。


参考与引申

  • 下文中介绍的子类沙箱模式通过对状态的分享,给实例以类的访问权限而无需让其全局可用。
  • 下文中介绍的服务定位器模式不但让一个对象全局可用,还可以带来设置对象的一些灵活性。
  • 单例模式的Unity版本实现:https://github.com/QianMo/Unity-Design-Pattern/tree/master/Assets/Creational%20Patterns/Singleton%20Pattern
  • 本节内容相关的英文原文:http://gameprogrammingpatterns.com/singleton.html
  • 本节内容相关的中文翻译:http://gpp.tkchu.me/singleton.html

 


6.  状态模式 State Pattern


允许对象在当内部状态改变时改变其行为,就好像此对象改变了自己的类一样。


要点

  • 状态模式用来解决当控制一个对象状态转换的条件表达式过于复杂的情况,它把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。
  • 状态模式的实现分为三个要点:
    • 为状态定义一个接口。
    • 为每个状态定义一个类。
    • 恰当地进行状态委托。
  • 通常来说,状态模式中状态对象的存放有两种实现存放的思路:
    • 静态状态。初始化时把所有可能的状态都new好,状态切换时通过赋值改变当前的状态。
    • 实例化状态。每次切换状态时动态new出新的状态。

 

使用场合


  • 在游戏开发过程中,涉及到复杂的状态切换时,可以运用状态模式以及状态机来高效地完成任务。
  • 有限状态机的实现方式,有两种可以选择:
    • 用枚举配合switch case语句。
    • 用多态与虚函数(即状态模式)。
  • 有限状态机在以下情况成立时可以使用:
    • 有一个行为基于一些内在状态的实体。
    • 状态可以被严格的分割为相对较少的不相干项目。
    • 实体可以响应一系列输入或事件。

 

参考与引申

  • Hierarchical State Machines分层状态机:http://www.eventhelix.com/RealtimeMantra/HierarchicalStateMachine.htm#.WAHM3Y996Uk
  • Pushdown Automata下推自动机:https://en.wikipedia.org/wiki/Pushdown_automaton
  • 状态模式的Unity版本实现:https://github.com/QianMo/Unity-Design-Pattern/tree/master/Assets/Creational%20Patterns/Singleton%20Pattern
  • 本节内容相关的英文原文:http://gameprogrammingpatterns.com/state.html
  • 本节内容相关的中文翻译:http://gpp.tkchu.me/state.html

 

 

 


 

 

二、序列型模式 Sequencing Patterns




本章的三种模式都是游戏开发中的常客:

  • 游戏循环是游戏运行的主心骨。
  • 游戏对象通过更新方法来进行每帧的更新。
  • 我们可以用双缓冲模式存储快照,来隐藏计算机的顺序执行,从而使得游戏世界能够同步更新。



7.  双缓冲模式 Double Buffer

 

双缓冲模式,使用序列操作来模拟瞬间或者同时发生的事情。


要点

  • 一个双缓冲类封装了一个缓冲:一段可改变的状态。这个缓冲被增量的修改,但我们想要外部的代码将其视为单一的元素修改。 为了实现这点,双缓冲类需保存两个缓冲的实例:下一缓存和当前缓存。
  • 当信息从缓冲区中读取,我们总是去读取当前的缓冲区。当信息需要写到缓存,我们总是在下一缓冲区上操作。 当改变完成后,一个交换操作会立刻将当前缓冲区和下一缓冲区交换, 这样新缓冲区就是公共可见的了。旧的缓冲区则成为了下一个重用的缓冲区。
  • 双缓冲模式常用来做帧缓冲区交换。

使用场合


双缓冲模式是那种你需要它时自然会想起来的模式。以下情况都满足时,使用这个模式很合适:

  • 我们需要维护一些被增量修改的状态
  • 在修改过程中,状态可能会被外部请求。
  • 我们想要防止请求状态的外部代码知道内部是如何工作的。
  • 我们想要读取状态,而且不想在修改的时候等待。

 

引申与参考

  • 我们几乎可以在任何一个图形API中找到双缓冲模式的应用。如OpenGl中的 swapBuffers() 函数, Direct3D中的“swap chains”,微软XNA框架的 endDraw() 方法。
  • 本节内容相关的英文原文:http://gameprogrammingpatterns.com/double-buffer.html
  • 本节内容相关的中文翻译:http://gpp.tkchu.me/double-buffer.html

 


8.  游戏循环模式 Game Loop


游戏循环模式,实现游戏运行过程中对用户输入处理和时间处理的解耦。

 

要点

  • 游戏循环模式:游戏循环在游戏过程中持续运转。每循环一次,它非阻塞地处理用户的输入,更新游戏状态,并渲染游戏。它跟踪流逝的时间并控制游戏的速率。
  • 游戏循环将游戏的处理过程和玩家输入解耦,和处理器速度解耦,实现用户输入和处理器速度在游戏行进时间上的分离。
  • 游戏循环也许需要与平台的事件循环相协调。如果在操作系统的高层或有图形UI和内建事件循环的平台上构建游戏, 那就有了两个应用循环在同时运作,需要对他们进行相应的协调。

 

使用场合


任何游戏或游戏引擎都拥有自己的游戏循环,因为游戏循环是游戏运行的主心骨。

 


引申与参考

  • 讲述游戏循环模式的一篇经典文章是来自Glenn Fiedler的“Fix Your Timestep“。http://gafferongames.com/game-physics/fix-your-timestep/
  • Witters的文章 game loops 也值得一看。http://www.koonsolo.com/news/dewitters-gameloop/
  • Unity的框架具有一个复杂的游戏循环,这里有一个对其很详尽的阐述。https://docs.unity3d.com/Manual/ExecutionOrder.html
  • 本节内容相关的英文原文:http://gameprogrammingpatterns.com/game-loop.html
  • 本节内容相关的中文翻译:http://gpp.tkchu.me/game-loop.html

 



9.  更新方法 Update Method



更新方法,通过每次处理一帧的行为来模拟一系列独立对象。


要点

  • 更新方法模式:在游戏中保持游戏对象的集合。每个对象实现一个更新方法,以处理对象在一帧内的行为。每一帧中,游戏循环对集合中的每一个对象进行更新。
  • 当离开每帧时,我们也许需要存储下状态,以备不时之需。


 

使用场合


更新方法和游戏循环模式一般一起使用。更新方法适应以下情况:

  • 游戏中有很多对象或系统需要同时运行。
  • 每个对象的行为都与其他的大部分独立。
  • 游戏中的对象需要随时间模拟。

引申与参考

  • 更新方法模式,以及游戏循环模式和组件模式,是构建游戏引擎核心的铁三角。
  • Unity引擎在多个类中使用了这个模式,包括MonoBehaviour。
  • 微软的XNA框架在 Game 和GameComponent 类中使用了这个模式。
  • 当你关注在每帧中更新实体或组件的缓存性能时,数据局部性模式可以帮上忙。
  • 本节内容相关的英文原文:http://gameprogrammingpatterns.com/update-method.html
  • 本节内容相关的中文翻译:http://gpp.tkchu.me/update-method.html

 




 

三、行为型模式 Behavioral Patterns



本章的模式可以帮助我们快速定义和完善多种多样的行为:

 

  • 类型对象定义行为的类别而无需完成真正的类。
  • 子类沙盒定义各种行为的安全原语。
  • 字节码,将行为从代码中拖出,放入数据。

 

10. 字节码模式 Bytecode



字节码模式,将行为编码为虚拟机器上的指令,来赋予其数据的灵活性。从而让数据易于修改,易于加载,并与其他可执行部分相隔离。

 

要点

  • 字节码模式:指令集定义了可执行的底层操作。一系列的指令被编码为字节序列。 虚拟机使用中间值堆栈 依次执行这些指令。 通过组合指令,可以定义复杂的高层行为。
  • 可以理解为项目中的转表工具,将excel中的数据转为二进制数据,并读取到工程中,如在项目中使用googleprotobuf或json。
  • 字节码类似GOF的解释器模式,这两种方式都能让我们将数据与行为相组合。其实很多时候都是两者一起使用。用来构造字节码的工具会有内部的对象树,而为了编译到字节码,我们需要递归回溯整棵树,就像用解释器模式去解释它一样。唯一的不同在于,并不是立即执行一段行为,而是生成整个字节码再执行

 

使用场合


这是GPP一书中最复杂的模式,不能轻易的加入到游戏中。 当我们需要定义很多行为,而游戏实现语言因为以下原因不能很好地完成任务时,就可以使用字节码模式:

  • 这些行为过于底层,繁琐易错。
  • 这些行为遍历起来很缓慢,导致编译时间长。
  • 这些行为太受依赖。如果想保证行为不会破坏游戏,你需要将其与代码的其他部分隔开。

如果是上述的这些情况,就比较适合使用字节码模式。

但需要注意,字节码比本地代码慢,所以最好不要用于引擎对性能敏感的部分。

 

引申与参考

  • Lua的内部实现就是一个非常紧凑的,基于寄存器的字节码虚拟机。
  • Kismet是个可视化脚本编辑工具,应用于Unreal引擎的编辑器UnrealEd。(https://udn.epicgames.com/Three/KismetHome.html)
  • 本节内容相关的英文原文:http://gameprogrammingpatterns.com/bytecode.html
  • 本节内容相关的中文翻译:http://gpp.tkchu.me/bytecode.html

 



11. 子类沙箱模式 Subclass Sandbox



用一系列由基类提供的操作定义子类中的行为。


要点


子类沙箱模式:基类定义抽象的沙箱方法和几个提供操作的实现方法,将他们设为protected,表明它们只为子类所使用。每个推导出的沙箱子类用提供的操作实现了沙箱方法。

 

使用场合


子类沙箱模式是潜伏在编程日常中简单常用的模式,哪怕是在游戏之外的地方。 如果有一个非虚的protected方法,你可能早已在用类似的技术了。

沙箱方法在以下情况适用:

  • 你有一个能推导很多子类的基类。
  • 基类可以提供子类需要的所有操作。
  • 在子类中有行为重复,你想要更容易的在它们间分享代码。
  • 你想要最小化子类和程序的其他部分的耦合。

 

引申与参考

  • 当你使用上文中介绍到的更新模式时,你的更新函数通常也是沙箱方法。
  • 这个模式与GOF模板方法正好相反。两种模式中,都使用了一系列受限操作实现方法。使用子类沙箱时,方法在推导类中,受限操作在基类中。使用模板方法时,基类有方法,而受限操作在推导类中。
  • 你也可以认为这个模式是GOF外观模式的变形。 外观模式将一系列不同系统藏在简化的API后。使用子类沙箱,基类起到了在子类前隐藏整个游戏引擎的作用。
  • 子类沙箱模式的Unity版本实现:https://github.com/QianMo/Unity-Design-Pattern/tree/master/Assets/Game%20Programming%20Patterns/SubclassSandbox%20Pattern
  • 本节内容相关的英文原文:http://gameprogrammingpatterns.com/subclass-sandbox.html
  • 本节内容相关的中文翻译:http://gpp.tkchu.me/subclass-sandbox.html

 

12. 类型对象模式 Type Object

 

创造一个类A来允许灵活的创造新的类,而类A的每个实例都代表了不同类型的对象。

 

要点

  • 类型对象模式:定义类型对象类与有类型的对象类。每个类型对象实例代表一种不同的逻辑类型。每种有类型的对象保存描述它类型的对类型对象的引用。
  • 类型对象的基本思想就是给基类一个品种类(breed类),而不是用一些子类继承自这个基类。所以我们在做种类区分的时候就可以只有两个类,怪物类monster和品种类breed,而不是monster,dragon,troll等一堆类。所以在此种情况下,游戏中的每个怪物都是怪物类的一个实例,而实例中的breed类包含了所有同种类型怪物共享的信息。

 

 

使用场合


这个模式在任何你需要定义不同“种”事物,使用不当会让你的系统过于僵硬。而下面两者之一成立时,就非常适合使用:

  • 不知道后续还需什么新类型。(举个例子,如果你的游戏需要支持增量更新,让用户下载后续新包含进来的怪物品种)
  • 想要不改变代码或不重新编译就能修改或添加新类型。

 

引申与参考

  • 这个模式引出的进阶问题是如何在不同对象之间共享数据。以不同的方式解决同一个问题的是GOF设计模式中的原型模式(prototype pattern)。
  • 类型对象是GOF设计模式中享元模式的亲兄弟。两者都让你在实例间分享代码。使用享元,意图是节约内存,而分享的数据也许不代表任何概念上对象的“类型”。而使用类型对象模式,焦点在组织性和灵活性。
  • 这个模式和GOF设计模式中状态模式有很多相似之处,两者都是委托了对象的部分定义给另外一个对象。
  • 本节内容相关的英文原文:http://gameprogrammingpatterns.com/type-object.html
  • 本节内容相关的中文翻译:http://gpp.tkchu.me/type-object.html





 

四、解耦型模式  Decoupling Patterns



这一部分的三种模式,专注于解耦:

  • 组件模式将一个实体拆成多个,解耦不同的领域。
  • 事件队列解耦了两个互相通信的事物,稳定而且实时。
  • 服务定位器让代码使用服务而无需绑定到提供服务的代码上。


 

13. 组件模式 Component


允许单一的实体跨越多个领域,无需这些领域彼此耦合。

 

要点

  • 组件模式:在单一实体跨越了多个领域时,为了保持领域之间相互解耦,可以将每部分代码放入各自的组件类中,将实体简化为组件的容器。
  • Unity引擎在设计中频繁使用了这种设计方法,从而让其易于使用。

 

使用场合


组件通常在定义游戏实体的核心部分中使用,当然,它们在其他地方也适用。这个模式在如下情况下可以很好的适用:

  • 有一个涉及了多个领域的类,而你想保持这些领域互相隔离。
  • 一个类正在变大而且越来越难以使用。
  • 想要能定义一系列分享不同能力的类,但是使用接口不足以得到足够的重用部分。


引申与参考

  • Unity核心架构中GameObject类完全根据此模式来进行设计。
  • 这种模式与GOF设计模式中的策略模式类似。两种模式都是将对象的行为取出,委派到一个单独的从属对象中。两者的不同点在于:
  • 策略模式中分离出的策略对象通常是无状态的——它封装的是算法,而不是数据。策略模式定义了对象的行为,而不是该对象是什么。
  • 而组件模式就更加复杂。组件经常保存了对象的状态,这有助于确定其真正的身份。但是,其界限往往很模糊。有些情况下组件也许根本没有任何状态。在这种情况下,你可以在不同的容器对象中使用相同的组件实例。这样看来,它的行为确实更像一种策略。
  • 本节内容相关的英文原文:http://gameprogrammingpatterns.com/component.html
  • 本节内容相关的中文翻译:http://gpp.tkchu.me/component.html

 

 

 

14. 事件队列模式 Event Queue


事件队列模式,对消息或事件的发送与处理进行时间上的解耦。

 

要点

  • 事件队列:在先入先出的队列中存储一系列通知或请求。发送通知时,将请求放入队列并返回。处理请求的系统在稍晚些的时候从队列中获取请求并进行处理。 这样就解耦了发送者和接收者,既静态又及时。
  • 事件队列很复杂,会对游戏架构引起广泛影响。中心事件队列是一个全局变量。这个模式的通常方法是一个大的交换站,游戏中的每个部分都能将消息送过这里。
  • 事件队列是基础架构中很强大的存在,但有些时候强大并不代表好。事件队列模式将状态包裹在协议中,但是它还是全局的,仍然存在全局变量引发的一系列危险。

 

使用场合

  • 如果你只是想解耦接收者和发送者,像观察者模式和命令模式都可以用较小的复杂度来进行处理。在需要解耦某些实时的内容时才建议使用事件队列。
  • 不妨用推和拉来的情形来考虑。有一块代码A需要另一块代码B去做些事情。对A自然的处理方式是将请求推给B。同时,对B自然的处理方式是在B方便时将请求拉入。当一端有推模型另一端有拉模型时,你就需要在它们间放一个缓冲的区域。 这就是队列比简单的解耦模式多出来的那一部分。队列给了代码对拉取的控制权——接收者可以延迟处理,合并或者忽视请求。发送者能做的就是向队列发送请求然后就完事了,并不能决定什么时候发送的请求会受到处理。
  • 而当发送者需要一些回复反馈时,队列模式就不是一个好的选择。

引申与参考


  • 很大程度上,事件队列模式就是广为人知的GOF设计模式中观察者模式的异步实现。
  • 就像其他很多模式一样,事件队列有很多别名。其中一个是“消息队列”。 消息队列通常指代一个更高层次的实现。可以这样理解,事件队列在应用中进行交流,而消息队列通常在应用间进行交流。另一个别名是“发布/提交”,有时被缩写为“pubsub”,这个别名通常指代更大的分布式系统中的应用。
  • 在有限状态机与状态模式中,往往需要一个输入流。如果想要异步响应,可以考虑用队列模式来存储它们。
  • Go语言内建的“Channel”机制,其本质上就是事件队列。
  • 本节内容相关的英文原文:http://gameprogrammingpatterns.com/event-queue.html
  • 本节内容相关的中文翻译:http://gpp.tkchu.me/event-queue.html

 



15. 服务定位模式 Service Locator



提供服务的全局接入点,而不必让用户和实现它的具体类耦合。

 

要点

  • 服务定位模式:服务类定义了一堆操作的抽象接口。具体的服务提供者实现这个接口。 分离的服务定位器提供了通过查询合适的提供者, 获取服务的方法,同时隐藏了提供者的具体细节和需要定位它的进程。
  • 一般通过使用单例或者静态类来实现服务定位模式,提供服务的全局接入点。
  • 服务定位模式可以看做是更加灵活,更加可配置的单例模式。如果用得好,它能以很小的运行时开销,换取很大的灵活性。相反,如果用得不好,它会带来单例模式的所有缺点以及更多的运行时开销。
  • 使用服务定位器的核心难点是它将依赖,也就是两块代码之间的一点耦合,推迟到运行时再连接。这有了更大的灵活度,但是代价是更难在阅读代码时理解其依赖的是什么。

 

 

使用场合


  • 服务定位模式在很多方面是单例模式的亲兄弟,在应用前应该考虑看看哪个更适合你的需求。
  • 让大量内容在程序的各处都能被访问时,就是在制造混乱。对何时使用服务定位模式的最简单的建议就是:尽量少用。
  • 与其使用全局机制让某些代码直接接触到它,不妨先考虑将对象传过来。因为这样可以明显地保持解耦,而且可以满足我们大部分的需求。当然,有时候不方便手动传入对象,也可以使用单例的方式。

 


引申与参考


  • Unity引擎在它的GetComponent()方法中使用了这个模式,协助组件模式的使用,方便随时获取到指定的组件。
  • 微软的XNA框架将这个模式内嵌到它的核心类Game中。每个实例有一个 GameServices 对象,能够用来注册和定位任何类型的服务。
  • 本节内容相关的英文原文:http://gameprogrammingpatterns.com/service-locator.html
  • 本节内容相关的中文翻译:http://gpp.tkchu.me/service-locator.html

 



五、优化型模式 Optimization Patterns



这一部分,描述了几个优化和加速游戏的中间层模式:

  • 数据局部性介绍了计算机的存储层次以及如何使用其以获得优势。
  • 脏标识帮我们避开不必要的计算。
  • 对象池帮我们避开不必要的分配。
  • 空间分区加速了虚拟世界和其中内容的空间布局。

 



16. 数据局部性模式 Data Locality

 

合理组织数据,充分使用CPU的缓存来加速内存读取。

 

要点


  • 现代的CPU有缓存来加速内存读取,其可以更快地读取最近访问过的内存毗邻的内存。基于这一点,我们通过保证处理的数据排列在连续内存上,以提高内存局部性,从而提高性能。
  • 为了保证数据局部性,就要避免的缓存不命中。也许你需要牺牲一些宝贵的抽象。你越围绕数据局部性设计程序,就越放弃继承、接口和它们带来的好处。没有银弹,只有权衡。

 

使用场合

 

  • 使用数据局部性的第一准则是在遇到性能问题时使用。不要将其应用在代码库不经常使用的角落上。 优化代码后其结果往往更加复杂,更加缺乏灵活性。
  • 就本模式而言,还得确认你的性能问题确实由缓存不命中而引发的。如果代码是因为其他原因而缓慢,这个模式自然就不会有帮助。
  • 简单的性能评估方法是手动添加指令,用计时器检查代码中两点间消耗的时间。而为了找到糟糕的缓存使用情况,知道缓存不命中有多少发生,又是在哪里发生的,则需要使用更加复杂的工具—— profilers。
  • 组件模式是为缓存优化的最常见例子。而任何需要接触很多数据的关键代码,考虑数据局部性都是很重要的。


引申与参考


  • Tony Albrecht的《Pitfalls of Object-OrientedProgramming》是传播广泛的内存友好设计游戏指南。PDF下载:http://harmful.cat-v.org/software/OO_programming/_pdf/Pitfalls_of_Object_Oriented_Programming_GCAP_09.pdf 
  • Noel Llopis一篇博客http://gamesfromwithin.com/data-oriented-design,也分析了内存友好的游戏设计。
  • 本节内容相关的英文原文:http://gameprogrammingpatterns.com/data-locality.html
  • 本节内容相关的中文翻译:http://gpp.tkchu.me/data-locality.html

 

 

 

17. 脏标识模式 Dirty Flag

 


将工作延期至需要其结果时才去执行,以避免不必要的工作。

 

要点

  • 脏标记,就是用来表示被标记的内容是否有被修改过的一个标志位。
  • 脏标识模式:考虑情况,当前有一组原始数据随着时间变化而改变。由这些原始数据计算出目标数据需要耗费一定的计算量。这个时候,可以用一个脏标识,来追踪目前的原始数据是否与之前的原始数据保持一致,而此脏标识会在被标记的原始数据改变时改变。那么,若这个标记没被改变,就可以使用之前缓存的目标数据,不用再重复计算。反之,若此标记已经改变,则需用新的原始数据计算目标数据。

 

使用场合

 

  • 就像其他优化模式一样,此模式会增加代码复杂度。只在有足够大的性能问题时,再考虑使用这一模式。
  • 脏标记在这两种情况下适用:
    • 当前任务有昂贵的计算开销
    • 当前任务有昂贵的同步开销。

若满足这两者之一,也就是两者从原始数据转换到目标数据会消耗很多时间,都可以考虑使用脏标记模式来节省开销。

  • 若原始数据的变化速度远高于目标数据的使用速度,此时数据会因为随后的修改而失效,此时就不适合使用脏标记模式。

 

引申与参考


  • 脏标记模式在游戏外的领域也是常见的,比如像Angular这种browser-side web框架,其利用赃标记来跟踪浏览器中变动的数据以及需要提交到服务端的数据。
  • 本节内容相关的英文原文:http://gameprogrammingpatterns.com/dirty-flag.html
  • 本节内容相关的中文翻译:http://gpp.tkchu.me/dirty-flag.html

 



18. 对象池模式 Object Pool

 

放弃单独地分配和释放对象,从固定的池中重用对象,以提高性能和内存使用率。


要点

  • 对象池模式:定义一个包含了一组可重用对象的对象池。其中每个可重用对象都支持查询“使用中”状态,说明它是不是“正在使用”。 对象池被初始化时,就创建了整个对象集合(通常使用一次连续的分配),然后初始化所有对象到“不在使用中”状态。
  • 当我们需要新对象时,就从对象池中获取。从对象池取到一个可用对象,初始化为“使用中”然后返回给我们。当不再需要某对象时,将其设置回“不在使用中”状态。 通过这种方式,便可以轻易地创建和销毁对象,而不必每次都分配内存或其他资源。

 

使用场合

  • 这个模式广泛使用在可见事物上,比如游戏物体和特效。但是它也可在不那么视觉化的数据结构上使用,比如正在播放的声音。
  • 满足以下情况可以使用对象池:
    • 需要频繁创建和销毁对象。
    • 对象大小相仿。
    • 在堆上分配对象缓慢或者会导致内存碎片。
    • 每个对象都封装了像数据库或者网络连接这样很昂贵又可以重用的资源。

 

引申与参考

  • 对象池模式与GOF设计模式中享元模式类似。 两者都控制了一系列可重用的对象。不同在于重用的含义。
    • 享元对象分享实例间同时拥有的相同部分。享元模式在不同上下文中使用相同对象避免了重复内存使用。
    • 对象池中的对象也被重用了,但是是在不同的时间点上被重用的。重用在对象池中意味着对象在原先的对象用完之后再分配内存。对象池的对象不会在它的生命周期中与其他对象共享数据。
  • 将内存中同样类型的对象进行整合,能确保在遍历对象时CPU缓存是满载的。这便是数据局部性模式中介绍的内容。
  • 本节内容相关的英文原文:http://gameprogrammingpatterns.com/object-pool.html
  • 本节内容相关的中文翻译:http://gpp.tkchu.me/object-pool.html

 


19. 空间分区模式 Spatial Partition

 

将对象存储在基于位置组织的数据结构中,来有效的定位对象。

 

要点

  • 对于一系列对象,每个对象都有空间上的位置。将它们存储在根据位置组织对象的空间数据结构中,让我们有效查询在某处或者附近的对象。 当对象的位置改变时,更新空间数据结构,这样它可以继续找到对象。
  • 最简单的空间分区:固定网格。想象某即时战略类游戏,一改在单独的数组中存储我们的游戏对象的常规思维,我们将它们存到网格的格子中。每个格子存储一组单位,它们的位置在格子的边界内部。当我们处理战斗时,一般只需考虑在同一格子或相邻格子中的单位,而不是将每个游戏中的单位与其他所有单位比较,这样就大大节约了计算量。

使用场合

  • 空间分区模式在需要大量存储活跃、移动的游戏物体,和静态的美术模型的游戏中比较常用。因为复杂的游戏中不同的内容有不同的空间划分。
  • 这个模式的基本适用场景是你有一系列有位置的对象,当做了大量通过位置寻找对象的查询而导致性能下降的时候。
  • 空间分区的存在是为了将O(n)或者O(n²) 的操作降到更加可控的数量级。 你拥有的对象越多,此模式就越好用。相反的,如果n足够小,也许就不需要使用此模式。

引申与参考


  • 了解了空间分区模式,下一步应该是学习一下常见的结构。常见的有:

      • Grid
      • Quadtree
      • BSP
      • k-d tree
      • Bounding volume hierarchy

  • 每种空间划分数据结构基本上都是将一维数据结构扩展成更高维度的数据结构。而了解它的直系子孙,有助于分辨其对当前问题的解答是不是有帮助:

      • 网格其实是持续的桶排序。
      • BSP,k-d tree,和层次包围盒是线性搜索树。
      • 四叉树和八叉树是多叉树。

  • 本节内容相关的英文原文:http://gameprogrammingpatterns.com/spatial-partition.html
  • 本节内容相关的中文翻译:http://gpp.tkchu.me/spatial-partition.html

 



 

六、更多参考与学习资源

 


[1] 本书的英文Web原版目录:

http://gameprogrammingpatterns.com/contents.html 

[2] 本书的中文翻译web版目录:http://gpp.tkchu.me/

[3] https://www.youtube.com/playlist?list=PLF206E906175C7E07

[4] https://github.com/Naphier/unity-design-patterns

[5] http://www.dofactory.com/net/design-patterns

[6] https://sourcemaking.com/design_patterns

[7] 《设计模式:可复用面向对象软件的基础》

[8] https://github.com/QianMo/Unity-Design-Pattern


查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. PreferenceCategory背景颜色设置

    大家可能遇到,PreferenceCategory默认是黑色背景,如何我们更换了PreferenceScreen的背景,那么这种分隔栏看上去很丑,那么怎么更改背景呢?我们可以通过自定义VIEW来实现。代码如下:public class MyPreferenceCategory extends PreferenceCategory {public MyPreferenceCat…...

    2024/4/20 18:33:47
  2. 常见排序算法的思想、应用场景以及性能稳定性比较

    八大排序,三大查找是《数据结构》当中非常基础的知识点,在这里为了复习顺带总结了一下常见的八种排序算法。 常见的八大排序算法,他们之间关系如下:排序算法.png他们的性能比较:排序算法性能和使用场景总结基于比较的排序算法有:冒泡排序,插入排序,希尔排序,选择排序,…...

    2024/4/20 4:31:33
  3. Java查找算法之折半查找

    折半查找又称为“二分查找”,算法复杂度为nlog2n。 1.折半查找思路 设有序顺序表{a[0], a[1], ......, a[n-1]},先求出查找区间中间元素下标mid,然后将该位置值a[mid]与要查找值key比较,比较结果有3种可能性:若key=a[mid],则查找成功,返回下标;若key<a[mid],则要…...

    2024/4/20 18:33:45
  4. vlan局域网对战平台

    一个不错的游戏对战平台. http://www.ipve.com/bbs/index.php玩过极品飞车八的朋友可以去试试,支持极品八网络对战.首先,注册一个vlan上的帐号.再去到某一个版面里面,很多地方都可以找到软件平台的下载地址,如下:可以通过点击上面的下载连接下载.文件不大,是一个网络安装程序(会…...

    2024/4/20 18:33:45
  5. 推荐一款全面的系统性能监控工具 -- glances

    一、大致统计的功能1、CPU使用率 2、内存使用情况 3、内核统计信息和运行队列信息 4、磁盘I/O速度、传输和读/写比率 5、文件系统中的可用空间 6、磁盘适配器 7、网络I/O速度、传输和读/写比率 8、页面空间和页面速度 9、消耗资源最多的进程 10、计算机信息和系统资源…...

    2024/4/20 18:33:43
  6. Java实现 蓝桥杯VIP 算法训练 回文数

    import java.util.Scanner;public class 回文数 {static int time = 0;public static int change(String str) {//十六进制转换为十进制return Integer.valueOf(str,16);}public static String changeTo(int a) {//十进制转换为十六进制return Integer.toHexString(a);}public …...

    2024/4/20 18:33:42
  7. Preference 也是可以响应Click事件的

    大家都知道 [color=red]PreferenceScreen[/color] 我们通常用来配置一些 配置信息 然后配置好之后 应用程序有一些变化, 前几天 遇到 一个 需求 在要设置 里边 展示一些信息 然后 一点击就打开浏览器,展示信息 当然是用 PreferenceScreen。 但是 一点击 就打开浏览器 就…...

    2024/4/20 18:33:41
  8. Unity使用之下载安装

    Unity 3D是一款可以轻松创建三维场景的综合游戏开发平台,是一个全面整合的专业游戏引擎。我主要是用来和HTC Vive进行对接做一些3D画面以及2D界面。下载&安装:直接去unity官网进行下载最新版工具即可:https://store.unity.com/cn(坑1:当时直接下载最新版的2018.2.5f1,…...

    2024/4/21 8:16:29
  9. 网管利器:七大免费网络工具

    今天无意间又发现了一系列的好东西。这里,我为您推荐七个免费的网络工具,使网络管理员的日常工作更加轻松。这七个工具大多小巧玲珑,无需安装,用一个U盘就可以轻松携带!一、Pingplotter让Ping和Traceroute焕发青春运行平台:WindowsPingplotter这个软件将基本的Ping和Trace…...

    2024/4/21 8:16:36
  10. Java实现 蓝桥杯VIP 算法提高 阮小二买彩票

    算法提高 阮小二买彩票 时间限制:1.0s 内存限制:512.0MB 问题描述在同学们的帮助下,阮小二是变的越来越懒了,连算账都不愿意自己亲自动手了,每天的工作就是坐在电脑前看自己的银行账户的钱是否有变多。可是一段时间观察下来,阮小二发现自己账户的钱增长好慢啊,碰到节假…...

    2024/4/21 8:16:27
  11. Java实现八大排序算法(转载)

    SortAlgorithms原文链接: 八大排序算法总结与java实现 - iTimeTraveler概述因为健忘,加上对各种排序算法理解不深刻,过段时间面对排序就蒙了。所以决定对我们常见的这几种排序算法进行统一总结,强行学习。首先罗列一下常见的十大排序算法:直接插入排序 希尔排序 简单选择排…...

    2024/4/21 8:16:26
  12. android api 中文 (75)—— AdapterView.OnItemClickListener

    正文一、结构public static interface AdapterView.OnItemClickListener直接子类CharacterPickerDialog, PreferenceScreen二、概述这个接口定义了当AdapterView中一元素被点击时,一个回调函数被调用。三、公共方法public abstract void onItemClick (AdapterView<?> p…...

    2024/4/21 8:16:25
  13. 在模拟器上玩儿魅族版的游戏(手机平台版本的游戏)

    很多时候我们在手机上玩儿的时候,因为现在的手机都有游戏框架,所以在应用商店里下载的游戏就只能在该游戏框架下能够登录,但是在模拟器上阕没法玩儿,很恼火是吧。这里有一个很简单的解决方法 1、在手机上下载一个该游戏的安装包,不要删除 2、开动你的小脑瓜,把这个…...

    2024/4/21 8:16:25
  14. Java实现 蓝桥杯VIP 算法提高 P0402

    算法提高 P0402 时间限制:1.0s 内存限制:256.0MB猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第十天早上想在吃时就只剩下一个桃子了。求第一天共摘了…...

    2024/4/21 8:16:23
  15. 网络封包分析工具Charles(接口抓取)

    目录 本文的内容主要包括: Charles 的简介如何安装 Charles将 Charles 设置成系统代理Charles 主界面介绍过滤网络请求截取 iPhone 上的网络封包截取 Https 通讯信息模拟慢速网络修改网络请求内容给服务器做压力测试修改服务器返回内容总结简介Charles 是在 Mac 下常用的网络封…...

    2024/4/21 8:16:22
  16. 源码开发-小结

    1、android“设置”里的版本号 2、android设置中的Preferencescreen用法...

    2024/4/26 5:12:37
  17. c++堆排序实现(heapsort) (算法导论)

    利用最大堆实现。 最大堆:最大堆性质是除了根结点意外的所有结点 i 都要满足A[parent[i]] >= A[i] 需要利用到的一个性质:当用数组表示存储n个元素的堆时,叶结点的下标分别是n/2, n/2+1, n/2 + 2, ......,n - 1. (下标从0开始) 需要用到的函数有: void max_heapify(i…...

    2024/4/21 8:16:20
  18. Java实现 蓝桥杯VIP 算法训练 判定数字

    算法训练 判定数字 时间限制:1.0s 内存限制:512.0MB编写函数,判断某个给定字符是否为数字。 样例输入 9 样例输出 yes import java.util.Scanner;public class 判定数字 {public static void main(String[] args) throws Exception {Scanner scanner=new Scanner(System.i…...

    2024/4/21 8:16:19
  19. Origin下载速度慢怎么办

    效果如图,修改前是200KB左右,在修改后可以达到3-4MB的下载速度实现方法1.打开origin客户端的安装目录,例如我的默认安装目录是C:\Program Files (x86)\Origin2.编辑 EACore.ini 文件3.填写以下文字段并保存[connection] EnvironmentName=production[Feature] CdnOverride=ak…...

    2024/4/21 8:16:18
  20. 在 Linux 和 Windows 之间玩转 Steam 游戏

    导读 这篇详细的指南将向你展示如何在 Linux 和 Windows 之间共享 Steam 的游戏文件以节省下载的总用时和下载的数据量。我们将展示给你它是怎样为我们节约了 83% 的数据下载量。假如你决心成为一名 Linux 平台上的玩家,并且在 Steam 上拥有同时支持 Linux 和 Windows 平台的游…...

    2024/4/23 1:48:25

最新文章

  1. 中电金信:向“新”而行——探索融合架构的项目管理在保险行业的应用

    近年来&#xff0c;险企在政策推动、市场牵引、自身发展、新技术应用日趋成熟等内外部因素的驱动下&#xff0c;积极投身到数字化转型的浪潮中。在拜访各类保险客户和合作项目的过程中&#xff0c;我们发现不少险企在数字化转型中或多或少都面临着战略如何落地、技术如何承接和…...

    2024/4/27 12:13:53
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. STM32实现软件SPI对W25Q64内存芯片实现读写操作

    先看看本次实验的成果吧&#xff1a; 这么简单的一个程序&#xff0c;我学习了一个星期左右&#xff0c;终于把所有的关节都打通了。所有代码都能什么都不看背着敲出来了。为了使自己的记忆更为清晰&#xff0c;特意总结了一个思维导图&#xff0c;感觉自己即便是日后忘记了看一…...

    2024/4/25 7:00:58
  4. CTK插件框架学习-事件监听(04)

    CTK插件框架学习-插件注册调用(03)https://mp.csdn.net/mp_blog/creation/editor/136989802 一、主要流程 发送者注册消息事件接收者订阅消息事件接收者相应消息事件 事件监听比插件接口调用耦合性更弱&#xff0c;事件由框架维护&#xff0c;不需要指定发送方和接收方 二、…...

    2024/4/25 1:44:38
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/26 18:09:39
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/26 20:12:18
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/27 4:00:35
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/25 18:39:22
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/25 18:39:22
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/26 21:56:58
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/27 9:01:45
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/26 16:00:35
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/25 18:39:16
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/26 22:01:59
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/25 2:10:52
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57