| 
1 | 1 | # 《游戏编程模式》全书内容梗概总结  | 
2 |  | ----------------------  | 
3 | 2 | 
 
  | 
4 | 3 | 这是一篇超过万字读书笔记,总结了《游戏编程模式》一书中所有章节与内容的知识梗概。  | 
5 | 4 | 
 
  | 
6 | 5 | 
 
  | 
7 | 6 |   | 
8 | 7 | 
 
  | 
9 |  | - | 
 | 8 | +<br>  | 
 | 9 | +<br>  | 
10 | 10 | 
 
  | 
11 | 11 | 全书内容思维导图  | 
12 | 12 | ----------------  | 
13 | 13 | 
 
  | 
14 | 14 |   | 
 | 15 | +<br>  | 
 | 16 | +<br>  | 
15 | 17 | 
 
  | 
16 | 18 | 目录与说明  | 
17 | 19 | ----------  | 
 | 
76 | 78 | 
 
  | 
77 | 79 | 依次介绍完19种模式之后,最终给出了一些更多的参考与学习资源。  | 
78 | 80 | 
 
  | 
 | 81 | +<br>  | 
79 | 82 | 
 
  | 
80 | 83 | # 一、常用GOF设计模式  | 
81 |  | ----------------  | 
 | 84 | + | 
82 | 85 | 
 
  | 
83 | 86 | ## 1. 命令模式 Command Pattern  | 
84 | 87 | 
 
  | 
 | 
116 | 119 | 
 
  | 
117 | 120 | - 本节内容相关的中文翻译:<http://gpp.tkchu.me/command.html>  | 
118 | 121 | 
 
  | 
 | 122 | +<br>  | 
119 | 123 | ## 2. 享元模式 Flyweight Pattern  | 
120 | 124 | 
 
  | 
121 | 125 | 享元模式,以共享的方式高效地支持大量的细粒度的对象。通过复用内存中已存在的对象,降低系统创建对象实例的性能消耗。  | 
 | 
155 | 159 | 
 
  | 
156 | 160 | - 本节内容相关的中文翻译:<http://gpp.tkchu.me/flyweight.html>  | 
157 | 161 | 
 
  | 
 | 162 | +<br>  | 
158 | 163 | ## 3. 观察者模式 Observer Pattern  | 
159 | 164 | 
 
  | 
160 | 165 | 观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。  | 
 | 
185 | 190 | 
 
  | 
186 | 191 | - 本节内容相关的中文翻译:<http://gpp.tkchu.me/observer.html>  | 
187 | 192 | 
 
  | 
 | 193 | +<br>  | 
188 | 194 | ## 4.原型模式 Prototype Pattern  | 
189 | 195 | 
 
  | 
190 | 196 | 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。  | 
 | 
215 | 221 | 
 
  | 
216 | 222 | - 本节内容相关的中文翻译: <http://gpp.tkchu.me/prototype.html>  | 
217 | 223 | 
 
  | 
 | 224 | +<br>  | 
218 | 225 | ## 5.单例模式 Singleton Pattern  | 
219 | 226 | 
 
  | 
220 | 227 | 保证一个类只有一个实例,并且提供了访问该实例的全局访问点。  | 
 | 
248 | 255 | 
 
  | 
249 | 256 | - 本节内容相关的中文翻译:<http://gpp.tkchu.me/singleton.html>  | 
250 | 257 | 
 
  | 
 | 258 | +<br>  | 
251 | 259 | ## 6.状态模式 State Pattern  | 
252 | 260 | 
 
  | 
253 | 261 | 允许对象在当内部状态改变时改变其行为,就好像此对象改变了自己的类一样。  | 
 | 
300 | 308 | 
 
  | 
301 | 309 | - 本节内容相关的中文翻译:<http://gpp.tkchu.me/state.html>  | 
302 | 310 | 
 
  | 
303 |  | -二、序列型模式 Sequencing Patterns  | 
304 |  | --------------------------------  | 
 | 311 | +<br>  | 
 | 312 | +# 二、序列型模式 Sequencing Patterns  | 
 | 313 | + | 
 | 314 | +本章的三种模式都是游戏开发中的常客:  | 
305 | 315 | 
 
  | 
306 | 316 | - 游戏循环是游戏运行的主心骨。  | 
307 | 317 | 
 
  | 
308 | 318 | - 游戏对象通过更新方法来进行每帧的更新。  | 
309 | 319 | 
 
  | 
310 | 320 | - 我们可以用双缓冲模式存储快照,来隐藏计算机的顺序执行,从而使得游戏世界能够同步更新。  | 
311 | 321 | 
 
  | 
312 |  | -## 双缓冲模式 Double Buffer  | 
 | 322 | +## 7.双缓冲模式 Double Buffer  | 
313 | 323 | 
 
  | 
314 | 324 | 双缓冲模式,使用序列操作来模拟瞬间或者同时发生的事情。  | 
315 | 325 | 
 
  | 
 | 
341 | 351 | 
 
  | 
342 | 352 | - 本节内容相关的中文翻译: <http://gpp.tkchu.me/double-buffer.html>  | 
343 | 353 | 
 
  | 
344 |  | -## 游戏循环模式 Game Loop  | 
 | 354 | +<br>  | 
 | 355 | +## 8.游戏循环模式 Game Loop  | 
345 | 356 | 
 
  | 
346 | 357 | 游戏循环模式,实现游戏运行过程中对用户输入处理和时间处理的解耦。  | 
347 | 358 | 
 
  | 
 | 
369 | 380 | 
 
  | 
370 | 381 | - 本节内容相关的中文翻译:<http://gpp.tkchu.me/game-loop.html>  | 
371 | 382 | 
 
  | 
372 |  | -## 更新方法 Update Method  | 
 | 383 | +<br>  | 
 | 384 | +## 9.更新方法 Update Method  | 
373 | 385 | 
 
  | 
374 | 386 | 更新方法,通过每次处理一帧的行为来模拟一系列独立对象。  | 
375 | 387 | 
 
  | 
 | 
403 | 415 | 
 
  | 
404 | 416 | - 本节内容相关的中文翻译:<http://gpp.tkchu.me/update-method.html>  | 
405 | 417 | 
 
  | 
 | 418 | +<br>  | 
406 | 419 | # 三、行为型模式 Behavioral Patterns  | 
407 |  | --------------------------------  | 
408 | 420 | 
 
  | 
409 | 421 | 本章的模式可以帮助我们快速定义和完善多种多样的行为:  | 
410 | 422 | 
 
  | 
 | 
414 | 426 | 
 
  | 
415 | 427 | - 字节码模式将行为从代码中拖出,放入数据。  | 
416 | 428 | 
 
  | 
 | 429 | +<br>  | 
417 | 430 | ## 10. 字节码模式 Bytecode  | 
418 | 431 | 
 
  | 
419 | 432 | 字节码模式,将行为编码为虚拟机器上的指令,来赋予其数据的灵活性。从而让数据易于修改,易于加载,并与其他可执行部分相隔离。  | 
 | 
451 | 464 | 
 
  | 
452 | 465 | - 本节内容相关的中文翻译:<http://gpp.tkchu.me/bytecode.html>  | 
453 | 466 | 
 
  | 
 | 467 | +<br>  | 
454 | 468 | ## 11. 子类沙箱模式 Subclass Sandbox  | 
455 | 469 | 
 
  | 
456 | 470 | 用一系列由基类提供的操作定义子类中的行为。  | 
 | 
480 | 494 | 
 
  | 
481 | 495 | - 这个模式与GOF模板方法正好相反。两种模式中,都使用了一系列受限操作实现方法。使用子类沙箱时,方法在推导类中,受限操作在基类中。使用模板方法时,基类有方法,而受限操作在推导类中。  | 
482 | 496 | 
 
  | 
483 |  | -- 你也可以认为这个模式是GOF外观模式的变形。  | 
484 |  | - 外观模式将一系列不同系统藏在简化的API后。使用子类沙箱,基类起到了在子类前隐藏整个游戏引擎的作用。  | 
 | 497 | +- 你也可以认为这个模式是GOF外观模式的变形。外观模式将一系列不同系统藏在简化的API后。使用子类沙箱,基类起到了在子类前隐藏整个游戏引擎的作用。  | 
485 | 498 | 
 
  | 
486 | 499 | - 子类沙箱模式的Unity版本实现:<https://github.com/QianMo/Unity-Design-Pattern/tree/master/Assets/Game%20Programming%20Patterns/SubclassSandbox%20Pattern>  | 
487 | 500 | 
 
  | 
488 | 501 | - 本节内容相关的英文原文:<http://gameprogrammingpatterns.com/subclass-sandbox.html>  | 
489 | 502 | 
 
  | 
490 | 503 | - 本节内容相关的中文翻译:<http://gpp.tkchu.me/subclass-sandbox.html>  | 
491 | 504 | 
 
  | 
 | 505 | +<br>  | 
492 | 506 | ## 12. 类型对象模式 Type Object  | 
493 | 507 | 
 
  | 
494 | 508 | 创造一个类A来允许灵活的创造新的类,而类A的每个实例都代表了不同类型的对象。  | 
 | 
519 | 533 | 
 
  | 
520 | 534 | - 本节内容相关的中文翻译:<http://gpp.tkchu.me/type-object.html>  | 
521 | 535 | 
 
  | 
522 |  | -# 四、解耦模式Decoupling Patterns  | 
 | 536 | +<br>  | 
 | 537 | +# 四、解耦模式 Decoupling Patterns  | 
523 | 538 | -------------------------------  | 
524 | 539 | 
 
  | 
525 | 540 | - 组件模式将一个实体拆成多个,解耦不同的领域。  | 
 | 
528 | 543 | 
 
  | 
529 | 544 | - 服务定位器让代码使用服务而无需绑定到提供服务的代码上。  | 
530 | 545 | 
 
  | 
531 |  | -## 13. 组件模式Component  | 
 | 546 | +<br>  | 
 | 547 | +## 13. 组件模式 Component  | 
532 | 548 | 
 
  | 
533 | 549 | 允许单一的实体跨越多个领域,无需这些领域彼此耦合。  | 
534 | 550 | 
 
  | 
 | 
562 | 578 | 
 
  | 
563 | 579 | - 本节内容相关的中文翻译:<http://gpp.tkchu.me/component.html>  | 
564 | 580 | 
 
  | 
565 |  | -## 14. 事件队列模式Event Queue  | 
 | 581 | +<br>  | 
 | 582 | +## 14. 事件队列模式 Event Queue  | 
566 | 583 | 
 
  | 
567 | 584 | 事件队列模式,对消息或事件的发送与处理进行时间上的解耦。  | 
568 | 585 | 
 
  | 
 | 
596 | 613 | 
 
  | 
597 | 614 | - 本节内容相关的中文翻译:<http://gpp.tkchu.me/event-queue.html>  | 
598 | 615 | 
 
  | 
599 |  | -## 15. 服务定位模式Service Locator  | 
 | 616 | +<br>  | 
 | 617 | +## 15. 服务定位模式 Service Locator  | 
600 | 618 | 
 
  | 
601 | 619 | 提供服务的全局接入点,而不必让用户和实现它的具体类耦合。  | 
602 | 620 | 
 
  | 
 | 
628 | 646 | 
 
  | 
629 | 647 | - 本节内容相关的中文翻译:<http://gpp.tkchu.me/service-locator.html>  | 
630 | 648 | 
 
  | 
631 |  | -# 五、优化模式Optimization Patterns  | 
632 |  | ----------------------------------  | 
 | 649 | +<br>  | 
 | 650 | +# 五、优化模式 Optimization Patterns  | 
633 | 651 | 
 
  | 
634 | 652 | 这一部分,描述了几个优化和加速游戏的中间层模式:  | 
635 | 653 | 
 
  | 
 | 
641 | 659 | 
 
  | 
642 | 660 | - 空间分区加速了虚拟世界和其中内容的空间布局。  | 
643 | 661 | 
 
  | 
644 |  | -## 16. 数据局部性模式Data Locality  | 
 | 662 | +## 16. 数据局部性模式 Data Locality  | 
645 | 663 | 
 
  | 
646 | 664 | 合理组织数据,充分使用CPU的缓存来加速内存读取。  | 
647 | 665 | 
 
  | 
 | 
654 | 672 | 
 
  | 
655 | 673 | ### 使用场合  | 
656 | 674 | 
 
  | 
657 |  | -- 使用数据局部性的第一准则是在遇到性能问题时使用。  | 
658 |  | - 不要将其应用在代码库不经常使用的角落上。  | 
659 |  | - 优化代码后其结果往往更加复杂,更加缺乏灵活性。  | 
 | 675 | +- 使用数据局部性的第一准则是在遇到性能问题时使用。不要将其应用在代码库不经常使用的角落上。优化代码后其结果往往更加复杂,更加缺乏灵活性。  | 
660 | 676 | 
 
  | 
661 |  | -- 就本模式而言,还得确认你的性能问题确实由缓存不命中而引发的。  | 
662 |  | - 如果代码是因为其他原因而缓慢,这个模式自然就不会有帮助。  | 
 | 677 | +- 就本模式而言,还得确认你的性能问题确实由缓存不命中而引发的。如果代码是因为其他原因而缓慢,这个模式自然就不会有帮助。  | 
663 | 678 | 
 
  | 
664 |  | -- 简单的性能评估方法是手动添加指令,用计时器检查代码中两点间消耗的时间。而为了找到糟糕的缓存使用情况,知道缓存不命中有多少发生,又是在哪里发生的,则需要使用更加复杂的工具  | 
665 |  | - —— profilers。  | 
 | 679 | +- 简单的性能评估方法是手动添加指令,用计时器检查代码中两点间消耗的时间。而为了找到糟糕的缓存使用情况,知道缓存不命中有多少发生,又是在哪里发生的,则需要使用更加复杂的工具 ——profilers。  | 
666 | 680 | 
 
  | 
667 | 681 | - 组件模式是为缓存优化的最常见例子。而任何需要接触很多数据的关键代码,考虑数据局部性都是很重要的。  | 
668 | 682 | 
 
  | 
 | 
676 | 690 | 
 
  | 
677 | 691 | - 本节内容相关的中文翻译: <http://gpp.tkchu.me/data-locality.html>  | 
678 | 692 | 
 
  | 
679 |  | -## 17. 脏标识模式Dirty Flag  | 
 | 693 | +<br>  | 
 | 694 | +## 17. 脏标识模式 Dirty Flag  | 
680 | 695 | 
 
  | 
681 | 696 | 将工作延期至需要其结果时才去执行,以避免不必要的工作。  | 
682 | 697 | 
 
  | 
 | 
709 | 724 | 
 
  | 
710 | 725 | - 本节内容相关的中文翻译: <http://gpp.tkchu.me/dirty-flag.html>  | 
711 | 726 | 
 
  | 
712 |  | -## 18. 对象池模式Object Pool  | 
 | 727 | +<br>  | 
 | 728 | +## 18. 对象池模式 Object Pool  | 
713 | 729 | 
 
  | 
714 | 730 | 放弃单独地分配和释放对象,从固定的池中重用对象,以提高性能和内存使用率  | 
715 | 731 | 
 
  | 
 | 
0 commit comments