自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

聊技术,谈人生

横刀立马解BUG,半部红楼悟人生

  • 博客(18)
  • 收藏
  • 关注

原创 程序猿久坐不一定会猝死,但一定会。。。

想必你也听说过久坐对身体伤害是很大的,可能得颈椎病,腰椎病等等,当然最大的危害是对心脏不好,容易猝死,特别是在高压力,长期加班的情况下。今天我想聊一聊久坐伤害到的一个被大家忽略的部位菊花,一旦你感受到它不好了,得了痔疮或肛周脓肿,肛瘘之类的肛门疾病,你会后悔莫及,痛不欲生的。关键是这运动可以随时随地的练习,上班摸鱼时,刷手机时,等公交时,吃饭时都可以,总之就是这运动简单效果好,不受时间和空间的限制。夏天到了,整个烧烤,喝点小酒,吃点辣椒,偶尔上个火,都会让你难受。4.吐气,放松你的肛门,心里从1数到5。

2023-07-02 17:33:32 105

原创 有了CPU为什么还需要GPU

如果把CPU和GPU理解成计算机的大脑的话,那么CPU就像是爱因斯坦的大脑一样,构造肯定比普通人复杂,这也就决定了它属于相当昂贵稀缺的资源,适合用来处理复杂昂贵的计算, 而GPU就是很多个普通人大脑的集合体,单个构造相对简单,但是三个臭皮匠顶一个诸葛亮,人多力量大,适合用来计算简单大量的运算。假设你的人物覆盖1000个像素点,你觉的是让CPU少量核心的每个核心串行计算多次快,还是让拥有1000个核心的GPU每个核心并行计算一个像素块的像素值快。由于构造复杂,受限于整体的计算机硬件架构,CPU的核数有限。

2023-03-22 13:27:11 570

原创 LUA如何实现组件开发模式

使用过quick-cocos2dx开发过游戏的朋友都使用过addComponent这个方法,相当于给当前类添加一个组件,可以让当前类方便的复用组件提供的功能。比如下面的代码示例就是通过给Dispatcher类添加事件监听分发的组件,让该类拥有了事件监听分发的功能,这样我们可以自由的让一个类拥有事件监听分发的功能,而不必让所有的事件都堆在一个事件分发器中导致事件增多时影响事件分发的效率。-- 在构造函数中添加事件分发的组件,这样Dispatcher类就可以实现注册监听功能了functi...

2021-12-20 22:09:40 461

原创 服务定位器

这种设计模式很简单很好理解。我们使用它为某服务提供一个全局访问入口来避免使用者与该服务具体实现类之间产生耦合。它将一个服务是“是什么”(具体实现类型)和“在什么地方”(我们如何得到它的实例)与需要使用这个服务的代码解耦了。由于我们需要使用这个服务的地方都使用服务定位器获得,这样我们服务内部的改动或者外观接口的变化都被服务定位器封装了,也就不需要在改动服务时,更新所有服务使用的代码模块了。而且我们还可以自由的替换一个服务给调用者来满足我们的一些需求,比如不同的日志功能功夫...

2021-12-14 22:51:53 310

原创 对游戏空间进行分区降低计算复杂度

在游戏开发中通常会将场景进行切分,最简单的用一个二维网状数据结构来表示这个切分,将游戏对象根据位置所在的切分区域存储到不同的网格中,这样我们就可以高效的定位这个对象,根据分区处理对象可以只关注当前对象所在分区和相邻的分区。 比如说我们要对场景中的作战单位做碰撞处理,如果不进行空间分区的得话,我们就只能针对每一个作战单位和其他的所有作战单位做比较来进行处理,而且很多作战单位的相对距离很远,根本不可能产生碰撞,但在这种简单粗暴的处理方式下我们还是要对这样的作战单位进行比较计算,...

2021-12-13 22:04:56 2122

原创 小技巧之利用脏标记优化计算复杂度

脏标记其实就是在程序逻辑控制中设置一个dirty布尔变量,通过设置它的布尔值,来决定是否进行一些计算工作,也就是将计算工作推迟到必要时进行以避免不必要的计算工作。这样就可以尽可能的节省计算资源,在大规模,高频率的计算中这个小方法非常有用。 比如说我们游戏引擎的渲染工作过程中,实体的位置,缩放,旋转角度等都需要依赖父节点的转置矩阵来进行计算。在不使用脏标记的情况下,我们会在每一帧针对场景树上的节点进行相关矩阵的计算,会有关于父节点矩阵重复计算,这是在浪费CPU的计算周期。如果...

2021-12-13 22:04:05 2128

原创 双缓冲在游戏设计中的应用

所谓双缓冲就是定义两个缓冲区,一个是当前缓冲区用来读取信息,另一个是后台缓冲区,用来在后台写入信息。当前缓冲区的数据使用完毕后,交换两个缓冲区(可以仅仅是两个引用的交换),当前缓冲区变成后台缓冲区,后台缓冲区变成当前缓冲区。 这是一个你在需要时自然会想起的设计方式。当下面这些条件成立时,适用双缓冲:1. 我们需要维护一些被逐步改变着的状态量。2. 同个状态可能会在其被修改的同时被访问到。3. 我们希望避免访问状态的...

2021-12-10 21:54:41 2620

原创 组件模式让不同功能模块耦合性更低

当你掌握一门编程语言时,你会发现编写代码实现你想要实现的功能是一件相当容易的事情。难的是编写能够容易应对需求变更的代码。刚入行时曾经维护过一个游戏项目,项目挺赚钱的,流水月月过亿。可以说外表很光鲜,第一次看到那代码时我傻眼了,那代码写的那叫一团糟。游戏主逻辑全写在一个类中,导致那个文件累计了10000多行的代码,一个帧循环里面竟然写了1000多行的业务逻辑。重要的功能逻辑几乎全部耦合在了一起,每次增加新的业务都是痛苦的过程,就算对于熟悉它的程序员也难保不出BUG,对于新手来说就如同炼狱了,微...

2021-12-09 21:42:49 1068

原创 事件队列在游戏开发中的应用

事件队列是一个按照先进先出顺序存储一系列通知或请求的队列。发出通知时系统会将该请求置入队列并随即返回,需要进行处理对象随后从事件队列中获取并处理这些请求。请求可由处理者直接处理或转交给对其感兴趣的模块。这种方式对消息或事件的发送者与受理者进行了时间上的解耦,使消息的处理变得动态且非实时。 如果你曾从事过用户界面编程比如Windows图形界面相关的事件驱动式编程,那你肯定对“事件”不陌生了。每当用户与你的程序交互时:比如点击按钮,下拉菜单,或者按下一个键盘的键,操作系统都会为...

2021-12-08 17:15:04 1058

原创 为了系统健壮成长,请慎用单例模式

所谓的单例模式指的就是确保一个类只有一个实例,并为其提供一个全局访问入口。这在我们日常开发中很实用。 在有些情况下,一个类如果有多个实例就不能正常运作。最常见的就是,这个类与一个维持着自身全局状态的外部系统进行交互的情况。比如一个封装了底层文件API的类。因为文件操作需要一定时间去完成,所以类将异步地处理。这意味着许多操作可以同时进行,所以它们必须相互协调。如果我们调用一个方法创建文件,又调用另外一个方法删除这个文件,那么我们的封装类就必须知悉,并确保它们不会相互干扰。为了...

2021-12-07 21:03:16 233

原创 观察者模式,大概是使用频率最高的设计模式了

观察者模式的GOF定义是在对象间定义一种一对多的依赖关系,以便当某对象的状态改变时,与它存在依赖关系的所有对象都能收到通知并自动进行更新。这个模式并不难理解,一看定义就能理解个大概,别看他简单,解耦模块时它可是利器。如果是有一定的开发经验,那么你对他一定很熟悉。Java,C#的开发框架都实现了观察者的功能模块。使用cocos2dx时我们常常需要监听一下系统事件(比如物理事件,触摸事件),cocos2dx也实现了订阅发布的接口让我们可以自己定义事件进行监听发布,这些都是观察者模式的进化变种。...

2021-12-06 22:27:17 354

原创 对象池能给我们的程序设计带来什么好处

在游戏开发中,我们常常遇到在一帧中需要创建大量的对象。比如飞行设计游戏中的子弹,和刷新出来的敌机,这些对象我们需要在一帧中大量创建,而对象不使用时需要大量的销毁操作。而在一帧中大量的创建和销毁操作不仅会占用大量的系统资源和计算时间,也会产生大量的内存碎片,严重的话这会拖慢游戏进程的时间线导致卡顿,也会让大量小的内存碎片无法分配给大的内存块使用。就像下图所示总量充足的内存,其连续内存却十分匮乏。 我们会发现上面举的例子中的对象我们是可以复用的。无非是在使用时从新初始化它...

2021-12-05 13:44:09 386

原创 通过原型模式理解JavaScript原型链的本质

在以类为中心的面向对象语言中(C++,Java,C#),我们都知道要想创建一个对象,首先我们要有声明一个类,这个类包含一些状态属性和它能够调用的方法行为。然后我们new一个对象时,操作系统会以这个类为模板在内存中创建这个对象。我们可以把类和对象的关系可以想象成铸模和铸件的关系。后来有人发现这种方式太过繁琐,类并不是必需的,对象未必需要从类中创建而来,一个对象可以通过克隆另外一个对象所得到,这就是今天我们要讲的原型编程思想。 所谓原型模式就是使用特定原型实例来创建特定种类的对...

2021-12-04 23:19:14 247

原创 设计程序时我们为什么要保证数据的局部性

话不多说,先上图:这是《深入理解计算机系统》一书中关于存储器层次结构的配图。现代计算机硬件系统都是多级存储结构,越在塔尖的存储器,CPU读取速度越快,但是相应的造价高昂,而且受限于CPU模块的大小,它们的存储容量也越小。越是塔底的容量越大,造价相对便宜,访问速度相对比较慢。为了综合考虑性价比,于是就有了现代的多级存储结构。 如果让CPU直接从内存或磁盘读取数据,可想而知,CPU要数百次甚至上千次的循环周期才能等到数据从数据总线传送过来。也就是说两者的频率根本就不在一...

2021-12-03 18:55:35 2212

原创 如何才能真正的学会设计模式

设计模式算是一个优秀程序员的必修课。我承认一个程序员不懂设计模式,也可以完成大多数的日常任务。但是你写的代码也仅仅是完成任务了而已,当面临需求的更改,后期维护时你会发现糟糕的设计会让你痛苦不堪。良好的模块设计,可以让系统看上去更优雅,后期的维护和扩展也会更方便。我承认有些朋友没有学过任何模式,也能写出优雅的代码,但那一定是建立在他阅读了大量优秀的代码和大量的思考实践之上的。 设计模式是前辈们无数次的踩坑后总结出来的通用性的软件设计方法,我们学习它也需要我们有过一定的实践经验...

2021-12-02 22:01:06 1432

原创 如何利用亨元模式优化内存占用

引言 亨元模式又叫蝇量模式,英文名字是Flyweight,一看这名字就是要给对象进行瘦身的,通过共享内存的方式,减少对象的内存占用量。它用来解决“大量且重复的对象”的管理问题。随着计算机设备的不断升级,我们的内存越来越大,CPU频率越来越高,我们渐渐遗忘了在内存受限制的环境下对每一个字节(Byte)都很计较的程序编写方式。但是随着移动互联网的兴起,在手持设备上运行的程序所面临的内存大小受限制的问题又成了我们必须考虑的问题。虽然我们的手机性能也在不断的攀升,但是为了我们在手机端展现的程序...

2021-12-01 18:10:13 171

原创 命令模式简直就是个大宝藏

引言 命令模式是游戏开发中很常用的一种模式。如果只看GoF关于该模式的定义会觉得晦涩懂,不知所云。我对命令模式的简单理解就是对象化的方法调用,我们把一个请求方法进行封装,同时在对应的类中保存这个请求方法在被调用时需要的状态,然后我们可以根据自己的需要在任何时刻对这个被封装的请求就行实例化。更简单点,你可以把它理解成回调的面向对象形式。命令模式的核心就2点:1.请求的封装 2.请求的操作定义 将“请求”封装成对象,让你可以将客户端的不同请求参数化,并配合队列、记录、...

2021-11-30 19:27:50 338

原创 用了状态模式,程序中复杂的状态转换瞬间清晰了

引言我们在游戏开发中常常遇到不同游戏状态之间的切换,如果我们刚刚入门游戏编程的话,很自然的会用一堆条件判断语句暴力解决。如果我们的游戏状态不多,也不复杂,这样当然可以完成任务。但是如果我们的游戏状态复杂,并且后续会不断扩展新的状态,这时你会发现自己掉入了一堆像毛线团一样的代码泥淖中。每增加一种新的状态,或者对原来的状态进行修改,你都有可能对所有的状态处理代码进行修改,一不留神就会造成很多bug,让代码的后续维护工作苦不堪言。 当然我们可以对游戏的不同状态进行划分,然后用...

2021-11-29 21:23:25 733

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除