2018年1月1日
摘要: 以汽车为例,有两个子类:柴油机和汽油机;有两个组成部分:轮子和发动机。 父类与子类,整体与部分,可以以一棵树来表示,其中树根为父类(整体),树叶为子类(部分)。 父子关系,整体部分关系,看起来完全不同的概念,竟然有完全相同的拓扑结构。 最早的程序设计中,应该是没有父子关系的,而整体部分关系必须有。参 阅读全文
posted @ 2018-01-01 18:48 zhangshuliai 阅读(140) 评论(0) 推荐(0) 编辑
  2017年10月7日
摘要: 一个简单的例子,关于一个门的简单设计: 现在国庆节来了,门上面都会挂上各种彩灯,所以就需要一个可以发光的门的概念,要重用上面的门,可以这样设计: 我们根本没写什么代码,只是按照c++的规范进行了接口继承,竟然可以达到这么高的灵活性。 再加上一些测试代码: 而实际情况却是,虽然我们没有做什么事,但是c 阅读全文
posted @ 2017-10-07 01:22 zhangshuliai 阅读(159) 评论(0) 推荐(0) 编辑
  2017年9月30日
摘要: 享元模式应该算是23个设计模式里面最难理解的了,个人觉得主要原因是四人帮的这个例子做的不好。 享元把一个对象分成内部状态和外部状态。 内部状态:不随外界环境改变而改变的共享部分。 外部状态:随着环境的改变而改变,不能够共享的状态。 如果内部数据相当大并且这样的对象比较多,享元减少的内存会相当可观的。 阅读全文
posted @ 2017-09-30 21:59 zhangshuliai 阅读(227) 评论(0) 推荐(0) 编辑
摘要: 很多时候我们需要在线程A里面生成一个对象,然后在线程B里面使用这个对象。比如线程A生成一个图像对象,线程B使用这个对象生成一个纹理。简单的做法是线程A先new一个图像对象,然后丢给线程B,线程B使用完这个对象后就delete掉它。 但是如果这个对象还有其它用处呢,比如我要使用这个图像数据合成另外一些 阅读全文
posted @ 2017-09-30 21:41 zhangshuliai 阅读(430) 评论(0) 推荐(0) 编辑
摘要: 当某一个线程需要对一段代码或者数据进行访问的时候,为了保证不会有对个线程同时访问这段代码或者数据的情况,都会使用锁来做互斥。 线程A完全访问完代码(下面只说代码,数据是一样的)的时候,线程B才可以访问。如果线程B访问的时候,线程A正在访问,这个时候线程B会阻塞。太多的阻塞和锁会让效率下降。 仔细想一 阅读全文
posted @ 2017-09-30 20:53 zhangshuliai 阅读(124) 评论(0) 推荐(0) 编辑
摘要: 游戏引擎中有这么一个功能,使用获取的图像数据生成一个OpenGL纹理,图像是一个Image对象,纹理是一个Texture对象,最早的伪代码如下: 后来为了改进效率,把所有关于OpenGL接口的调用都放在了一个gl线程中,这时候Texture的initWithImage函数就有很多代码放到gl线程中了 阅读全文
posted @ 2017-09-30 20:08 zhangshuliai 阅读(323) 评论(0) 推荐(0) 编辑
摘要: 同事给了一段代码,用来实现开始录制声音和停止录制,伪代码如下: StartRecord函数开启录制线程,通过m_isRecording 来设置录制状态。 初一看这里没什么问题,并且大多数情况下也确实可以正常工作。但是对于特殊的情况,比如StartRecord之后很快调用EndRecord,这时候St 阅读全文
posted @ 2017-09-30 19:47 zhangshuliai 阅读(363) 评论(0) 推荐(0) 编辑
  2017年7月24日
摘要: Liskov替换原则是一个关于设计父类和子类关系的原则。 它的定义很有数学感: 若对每个类型S的对象o1,都存在一个类型T的对象o2,使得在所有针对T编写的程序P中,用o1替换o2后,程序P的行为功能不变,则S是T的子类型。 这个很类似于高等数学的根基极限的定义: 一个数列a,对于任何给定的一个正数 阅读全文
posted @ 2017-07-24 23:40 zhangshuliai 阅读(451) 评论(0) 推荐(0) 编辑
摘要: 如果把OpenGL看做一个加工机器,它的功能就是把一系列顶点纹理数据可以在屏幕上面显示的像素。这就如同面条机器把一定比例的面和水加工成一根根面条一样。面条机器可以设置面条的宽度和厚度,这可以影响整个加工的面条,就相当于OpenGL可以设置纹理过滤模式,混合模式等全局状态,可以影响到这一帧的像素输出。 阅读全文
posted @ 2017-07-24 00:26 zhangshuliai 阅读(167) 评论(0) 推荐(0) 编辑
  2017年7月23日
摘要: 可行性: 游戏循环主要包括这几个部分:1,硬件事件,主要就是指触屏事件,按键事件和鼠标事件;2,游戏事件,主要指定时器事件和预定义事件,比如schedule;3,游戏逻辑,对于胖脚本端来说,这个就指的脚本逻辑;4,渲染数据的生成,在引擎里面就是指node的visit,这里计算生成所有即将发往Open 阅读全文
posted @ 2017-07-23 10:10 zhangshuliai 阅读(477) 评论(0) 推荐(0) 编辑