<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Currybeefer的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Currybeefer</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Currybeefer]]></copyright><item><title><![CDATA[《游戏编程模式》学习笔记（十四）事件队列 Event Queue]]></title><link>https://blog.youkuaiyun.com/Currybeefer/article/details/133779207</link><guid>https://blog.youkuaiyun.com/Currybeefer/article/details/133779207</guid><author>Currybeefer</author><pubDate>Wed, 11 Oct 2023 21:21:31 +0800</pubDate><description><![CDATA[事件队列在队列中按先入先出的顺序存储一系列通知或请求。发送通知时，将请求放入队列并返回。处理请求的系统之后稍晚从队列中获取请求并处理。这解耦了发送者和接收者，既静态又及时。]]></description><category></category></item><item><title><![CDATA[《游戏编程模式》学习笔记（十三）组件模式 Component]]></title><link>https://blog.youkuaiyun.com/Currybeefer/article/details/133711937</link><guid>https://blog.youkuaiyun.com/Currybeefer/article/details/133711937</guid><author>Currybeefer</author><pubDate>Mon, 09 Oct 2023 19:09:11 +0800</pubDate><description><![CDATA[单一实体跨越了多个领域。为了保持领域之间相互分离，将每部分代码放入各自的组件类中。实体被简化为组件的容器。组件模式没什么好说的，就是放弃传统的继承思路，用组合代替继承来达到对各个领域的解耦。不是让两个类继承同一类来分享代码，而是让它们拥有同一个类的实例。举例public:Bjorn(){}private:int x_, y_;在Bjorn的update方法中，我们作如下更新// 根据用户输入修改英雄的速度break;break;// 根据速度修改位置。]]></description><category></category></item><item><title><![CDATA[《游戏编程模式》学习笔记（十二）类型对象 Type Object]]></title><link>https://blog.youkuaiyun.com/Currybeefer/article/details/133690542</link><guid>https://blog.youkuaiyun.com/Currybeefer/article/details/133690542</guid><author>Currybeefer</author><pubDate>Sun, 08 Oct 2023 21:32:56 +0800</pubDate><description><![CDATA[那么问题来了，每次你要创造一个新的种类的敌人，即使这些敌人仅仅是名字不一样，其属性和行为都差不多，你都得写代码。实例相关的数据被存储在有类型对象的实例中，被同种类分享的数据或者行为存储在类型对象中。这让我们在一组相同的对象间分享行为和数据，就像子类让我们做的那样，但没有固定的硬编码子类集合。Breed类本质上定义了一个怪物的类型，这就是为啥这个模式叫做类型对象。最容易想到的就是，哦，我先写一个Monster抽象基类，里边定义了基本的属性和抽象方法，然后让子类继承这个基类，来制造特定的敌人。]]></description><category></category></item><item><title><![CDATA[《游戏编程模式》学习笔记（十一）字节码 Bytecode]]></title><link>https://blog.youkuaiyun.com/Currybeefer/article/details/132790774</link><guid>https://blog.youkuaiyun.com/Currybeefer/article/details/132790774</guid><author>Currybeefer</author><pubDate>Sun, 10 Sep 2023 14:18:04 +0800</pubDate><description><![CDATA[这一节的内容是介绍一些游戏虚拟机的概念以及实现，非常复杂，以我现在的功力还无法做到概括总结，故先放着。感兴趣的同学请移步原文进行阅读。]]></description><category></category></item><item><title><![CDATA[《游戏编程模式》学习笔记（十二）子类沙箱 Subclass Sandbox]]></title><link>https://blog.youkuaiyun.com/Currybeefer/article/details/132790742</link><guid>https://blog.youkuaiyun.com/Currybeefer/article/details/132790742</guid><author>Currybeefer</author><pubDate>Sun, 10 Sep 2023 14:14:28 +0800</pubDate><description><![CDATA[基类定义抽象的沙箱方法和几个提供的操作。将操作标为protected，表明它们只为子类所使用。每个推导出的沙箱子类用提供的操作实现了沙箱函数。]]></description><category></category></item><item><title><![CDATA[《游戏编程模式》学习笔记（十）更新方法 Sequencing Patterns]]></title><link>https://blog.youkuaiyun.com/Currybeefer/article/details/132789268</link><guid>https://blog.youkuaiyun.com/Currybeefer/article/details/132789268</guid><author>Currybeefer</author><pubDate>Sun, 10 Sep 2023 11:35:35 +0800</pubDate><description><![CDATA[游戏世界管理对象集合。每个对象实现一个更新方法模拟对象在一帧内的行为。每一帧，游戏循环更新集合中的每一个对象。这个模式的定义十分直观，简单地说，就是我们的游戏世界有一个大循环Update()，而我们在游戏对象中封装一个update()小方法来存储个体的更新逻辑，同时因为封装在了小方法里，我们可以自由地添加一些类变量来帮助我们存储状态。]]></description><category></category></item><item><title><![CDATA[《游戏编程模式》学习笔记（九）游戏循环 Sequencing Patterns]]></title><link>https://blog.youkuaiyun.com/Currybeefer/article/details/132557519</link><guid>https://blog.youkuaiyun.com/Currybeefer/article/details/132557519</guid><author>Currybeefer</author><pubDate>Tue, 29 Aug 2023 11:16:37 +0800</pubDate><description><![CDATA[所以有时候会出现渲染在两次更新之间的情况，而这个时候，渲染的往往是前一次更新的时候的情况，这会造成困扰，例如玩家看见子弹在左边，下一次渲染的时候应该在中间但还是显示在左边。在代码中可以看到，这个循环会计算上一次循环到现在间隔的时间，如果间隔时间过长，就会进入里边的小循环，多次调用update方法以追上现实时间。每一次循环，它都会无阻塞地处理玩家的输入，更新游戏的状态，渲染游戏。用真实的时间做循环，每次循环会计算上一次循环到这一次循环所用的时间间隔，然后在update的时候传入这个时间间隔。]]></description><category></category></item><item><title><![CDATA[《游戏编程模式》学习笔记（八）双缓冲模式 Sequencing Patterns]]></title><link>https://blog.youkuaiyun.com/Currybeefer/article/details/132480466</link><guid>https://blog.youkuaiyun.com/Currybeefer/article/details/132480466</guid><author>Currybeefer</author><pubDate>Thu, 24 Aug 2023 18:38:22 +0800</pubDate><description><![CDATA[双缓冲模式定义缓冲类封装了缓冲：一段可改变的状态。这个缓冲被增量地修改，但我们想要外部的代码将修改视为单一的原子操作。为了实现这点，类保存了两个缓冲的实例：下一缓冲和当前缓冲。当信息从缓冲区中读取，它总是读取当前的缓冲区。当信息需要写到缓存，它总是在下一缓冲区上操作。当改变完成后，一个交换操作会立刻将当前缓冲区和下一缓冲区交换， 这样新缓冲区就是公共可见的了。旧的缓冲区成为下一个重用的缓冲区。]]></description><category></category></item><item><title><![CDATA[《游戏编程模式》学习笔记（七）状态模式 State Pattern]]></title><link>https://blog.youkuaiyun.com/Currybeefer/article/details/132384331</link><guid>https://blog.youkuaiyun.com/Currybeefer/article/details/132384331</guid><author>Currybeefer</author><pubDate>Sat, 19 Aug 2023 21:15:22 +0800</pubDate><description><![CDATA[允许对象在当内部状态改变时改变其行为，就好像此对象改变了自己的类一样。]]></description><category></category></item><item><title><![CDATA[《游戏编程模式》学习笔记（六）单例模式 Singleton Pattern]]></title><link>https://blog.youkuaiyun.com/Currybeefer/article/details/132327475</link><guid>https://blog.youkuaiyun.com/Currybeefer/article/details/132327475</guid><author>Currybeefer</author><pubDate>Wed, 16 Aug 2023 20:48:25 +0800</pubDate><description><![CDATA[保证一个类只有一个实例，并且提供了访问该实例的全局访问点。定义这种东西一般都是不说人话的，要想要理解这句话的意思，我们得把它揉开了才能搞明白。我们先看前半句 “保证一个类只有一个实例”，单例一般使用类来实现，也就是说，这个单例类，其有且只能有一个实例化的对象instance，一旦出现多个，就不是单例模式。后半句“并且提供了访问该实例的全局访问点”，这句话的意思是，这个实例化的对象是全局可见的，任何系统，任何类都可以访问这个实例化的单例对象。]]></description><category></category></item><item><title><![CDATA[《游戏编程模式》学习笔记（五）原型模式 Prototype Pattern]]></title><link>https://blog.youkuaiyun.com/Currybeefer/article/details/132304843</link><guid>https://blog.youkuaiyun.com/Currybeefer/article/details/132304843</guid><author>Currybeefer</author><pubDate>Tue, 15 Aug 2023 18:34:50 +0800</pubDate><description><![CDATA[用原型实例指定创建对象的种类，并且通过拷贝这些原型创建新的对象。]]></description><category></category></item><item><title><![CDATA[《游戏编程模式》学习笔记（四） 观察者模式 Observer Pattern]]></title><link>https://blog.youkuaiyun.com/Currybeefer/article/details/132304785</link><guid>https://blog.youkuaiyun.com/Currybeefer/article/details/132304785</guid><author>Currybeefer</author><pubDate>Tue, 15 Aug 2023 18:30:28 +0800</pubDate><description><![CDATA[观察者模式定义了对象间的一种一对多的依赖关系，当一个对象的状态发生改变时，所有依赖于它的对象都得到通知并被自动更新。这是定义，看不懂就看不懂吧，我接下来举个例子慢慢说。]]></description><category></category></item><item><title><![CDATA[《游戏编程模式》学习笔记（三）享元模式 Flyweight Pattern]]></title><link>https://blog.youkuaiyun.com/Currybeefer/article/details/132104054</link><guid>https://blog.youkuaiyun.com/Currybeefer/article/details/132104054</guid><author>Currybeefer</author><pubDate>Fri, 04 Aug 2023 14:36:33 +0800</pubDate><description><![CDATA[为了减少需要推送到GPU的数据量，我们想把共享的数据——TreeModel——只发送一次。然后，我们分别发送每个树独特的数据——位置，颜色，大小。第一部分是一块需要渲染多次的共同数据——在例子中是树的网格和纹理。我们只需要一个TreeModel实例化的对象就好了，剩下的树只需要保存一个TreeModel的指针，就可以很快的找到这个对象。这就是享元模式，实际上我认为享元模式没有什么好说的东西，所以这里的大部分内容我都是直接照搬原著的。在系统设计中，对象实例进行分类后，发现真正有区别的分类很少的时候。]]></description><category></category></item><item><title><![CDATA[《游戏设计模式》学习笔记（二）命令模式 Command Pattern]]></title><link>https://blog.youkuaiyun.com/Currybeefer/article/details/132103971</link><guid>https://blog.youkuaiyun.com/Currybeefer/article/details/132103971</guid><author>Currybeefer</author><pubDate>Fri, 04 Aug 2023 14:34:39 +0800</pubDate><description><![CDATA[采用命令模式后，我们将jump，fire这些方法做成一个抽象类command的子类，这样每个命令就有了面向对象的形式的封装（将命令变为数据对象，让这个对象和其他对象一样可以被存储和传递）2.对于不同的游戏角色，我们因为会往里边传入不同actor的引用，最后调用的是actor中内置的方法（如jump方法），这就实现了不同的角色拥有不同的按键行为。1.对于不同的按键，由于其类型都是command*，我们只需要让这个指针指向不同的子类命令对象，就可以实现按键配置功能了。这个时候我们就需要考虑使用命令模式了。]]></description><category></category></item><item><title><![CDATA[《游戏编程模式》学习笔记（一） 架构,性能和游戏]]></title><link>https://blog.youkuaiyun.com/Currybeefer/article/details/132103826</link><guid>https://blog.youkuaiyun.com/Currybeefer/article/details/132103826</guid><author>Currybeefer</author><pubDate>Fri, 04 Aug 2023 14:31:37 +0800</pubDate><description><![CDATA[开新坑，准备把《游戏编程模式》这本书啃完。这是一本讲设计模式的书，针对游戏开发而作，写得很好。以下是读书笔记，文末有原文链接。]]></description><category></category></item><item><title><![CDATA[Leetcode 148 给链表排序]]></title><link>https://blog.youkuaiyun.com/Currybeefer/article/details/129474976</link><guid>https://blog.youkuaiyun.com/Currybeefer/article/details/129474976</guid><author>Currybeefer</author><pubDate>Sun, 12 Mar 2023 13:58:10 +0800</pubDate><description><![CDATA[链表排序这名字就很好记，面试的时候随手就能想到出这一题，然后看你吭哧吭哧写半天，对于他们来说，即不用废自己脑子，又可以折磨你，的确是一种精神上的享受。]]></description><category></category></item><item><title><![CDATA[LeetCode 152 乘积最大子数组，一个奇特的动态规划问题]]></title><link>https://blog.youkuaiyun.com/Currybeefer/article/details/129471960</link><guid>https://blog.youkuaiyun.com/Currybeefer/article/details/129471960</guid><author>Currybeefer</author><pubDate>Sun, 12 Mar 2023 13:35:21 +0800</pubDate><description><![CDATA[对于每个dp[i]来说，每次可以做选择，要么选择与dp[i-1]结合，乘积为dp[i-1]*nums[i], 要么就不选择于之前结合，自己另起炉灶，直接等于nums[i]。实际上，这个问题中，我给出的dp定义并不满足动态规划的最优子结构性质，具体来说，[-2,3,-4]中，实际上答案应该是整个数组的相乘才是最大的乘机。我们这里令 Fmax[i]表示到下标为i的元素为止的乘积的极大值，Fmin[i]表示到下标为i的元素为止的乘积的极小值。在这个用例中， 我的算法给出的是3，而真正的答案是24。]]></description><category></category></item><item><title><![CDATA[C++ string的简易底层实现]]></title><link>https://blog.youkuaiyun.com/Currybeefer/article/details/128095392</link><guid>https://blog.youkuaiyun.com/Currybeefer/article/details/128095392</guid><author>Currybeefer</author><pubDate>Tue, 29 Nov 2022 12:02:32 +0800</pubDate><description><![CDATA[string底层实现，参考了网上的一些代码，注释都写在代码里了，比较清楚。]]></description><category></category></item><item><title><![CDATA[旋转可重复数组的最小数字]]></title><link>https://blog.youkuaiyun.com/Currybeefer/article/details/127148587</link><guid>https://blog.youkuaiyun.com/Currybeefer/article/details/127148587</guid><author>Currybeefer</author><pubDate>Mon, 03 Oct 2022 01:34:41 +0800</pubDate><description><![CDATA[如果你也是使用labuladong的二分模板做的话，可能会有一些疑问，我在注释里写明白了。如果还有疑问，可以查看这里。]]></description><category></category></item><item><title><![CDATA[Leetcode43 字符串相乘以及字符串相加]]></title><link>https://blog.youkuaiyun.com/Currybeefer/article/details/126970608</link><guid>https://blog.youkuaiyun.com/Currybeefer/article/details/126970608</guid><author>Currybeefer</author><pubDate>Wed, 21 Sep 2022 13:04:09 +0800</pubDate><description><![CDATA[代码如下，其实就是模拟乘法竖式计算的方法，将单个相乘的结果放入数组，最后数组再做加和处理。]]></description><category></category></item></channel></rss>