
算法
文章平均质量分 71
tkokof1
这个作者很懒,什么都没留下…
展开
-
动画通知(Anim Notify)问题小记
本文简单记录了使用 动画通知(Anim Notify) 过程中遇到的一些问题和可能的解决方法。原创 2023-02-14 12:08:01 · 2044 阅读 · 0 评论 -
Sweet Snippet 之 最短增广路径算法
本文简单实现了最短增广路径算法首先我们简单实现 queue(队列) 数据结构 :local queue = {}queue.__index = queuefunction queue:push(val) table.insert(self.data, val)end function queue:pop() if #self.data > 0 then return table.remove(self.data, 1) endend.原创 2022-05-12 20:32:38 · 554 阅读 · 0 评论 -
Sweet Snippet 之 四则运算求值
本文简单介绍了一种四则运算求值的实现方法(基于语法分析)双栈算法可以实现四则运算的求值,但是扩展性比较低,更好的方式是基于语法分析来实现,整体大概包括以下几个步骤:词法分析语法分析语法树生成运算求值我们先来看词法分析:首先定义我们需要用到的词法类型:local token_type = { add = 1, -- '+' minus = 2, -- '-' mul = 3, -- '*' div = 4, -- '/' lbrace = 5,.原创 2022-01-28 14:17:26 · 741 阅读 · 0 评论 -
Sweet Snippet 之 大整数乘法
本文简单介绍了一种大整数乘法的实现方式当整数范围较大时,直接使用乘法运算符(*)很容易导致数值溢出,如果开发工作中确实需要处理这种大范围的整数,那么我们便需要实现一下大(范围)整数的乘法运算(一般方法便是将大整数表达为字符串,然后基于字符串来进行乘法运算).在实现大整数乘法之前,我们先来实现一下大整数的加法运算,朴素方法便是从低到高按位进行加法操作,并考虑进位的影响,代码大概如下(Lua):local big_int = {}local function digit_num(v) re.原创 2022-01-04 21:23:31 · 355 阅读 · 1 评论 -
Sweet Snippet 之 计算逆序数
本文简单介绍了几种计算逆序数的实现方法简介所谓逆序数,是指一个排列中所有逆序对的总数,而所谓逆序对,则是指排列中前后位置和大小顺序相反的数对,举个简单的例子:{ 1,4,2,3 }\{\ 1, 4, 2, 3 \ \}{ 1,4,2,3 }上面的排列中,有下面两个逆序对:<4,2> <4,3><4, 2>\ <4, 3><4,2> <4,3>所以该排列的.原创 2021-12-21 21:00:34 · 1002 阅读 · 0 评论 -
Sweet Snippet 之 骑士金币问题
本文简述了骑士金币问题的两种实现方法首先我们来看下什么是 骑士金币问题:骑士金币问题国王要用金币赏赐忠于他的骑士.骑士在就职的第一天得到一枚金币,接下来的两天(第二天和第三天)每天会得到两枚金币,接下来的三天(第四、五、六天)每天会得到三枚金币,接下来的四天(第七、八、九、十天)每天会得到四枚金币,这样的赏赐形式会一直持续下去,问题是给定一个天数(譬如第十天),求骑士将会获得的总的金币数量.举个简单的例子,如果给定第十天(NNN = 10),那么骑士将会获得的总的金币数量(CCC)为:C=1+.原创 2021-10-07 12:50:35 · 924 阅读 · 0 评论 -
Sweet Snippet 之 PlayerPrefs for UE4
在 Unity 中进行本地存储,我们一般会用到 PlayerPrefs,而在 UE4 中,我们一般会使用 USaveGame,不过 USaveGame 在使用上和 PlayerPrefs 相差较大,这里给出一个 UE4 的 PlayerPrefs 实现,原理上仅是对 USaveGame 做了进一步的封装首先我们继承 USaveGame 创建 UPlayerPrefsSaveGame 类型#include "CoreMinimal.h"#include "GameFramework/SaveGa.原创 2021-08-17 19:46:49 · 326 阅读 · 0 评论 -
编程小知识 之 range search
本文简述了 range search 的一些知识问题所谓 range search,是指给定一些数值范围(range)和某一数值,我们来搜索该数值所属的数值范围,譬如我们给定以下的数值范围:[0, 10] -> range 0[11, 50] -> range 1[51, 100] -> range 2给定的数值为 32,那么我们可以搜索得到 32 所属的数值范围为: range 1.实现如果给定的数值范围比较少,我们直接遍历搜索就可以了,代码大概如下:publi.原创 2021-04-09 20:33:11 · 867 阅读 · 0 评论 -
编程小知识 之 Base64 编码
本文简述了 Base64 编码的一些知识简介在一些 支持可打印字符(而不(完善)支持其他字符) 的开发场景下(譬如原始的电子邮件中),为了能够传输存储二进制数据(广义上的非打印字符),我们需要一种将二进制数据转换为可打印字符的编码方式, Base64 就是这么一种编码方式.基础Base64 编码的步骤如下:将待转换的字节数组(即二进制数据)按每 3 个字节分为一组(共 3 x 8 = 24 bit(二进制位))将上述 24 bit 按每 6 bit 一组重新分为 4 组分别计算上面 4 .原创 2021-01-30 20:26:52 · 270 阅读 · 0 评论 -
Sweet Snippet 之 Lua readonly table
Lua table 用作静态配置是常见的使用情境,而用作静态配置的 Lua table 往往都有保持只读的需求,本文简单介绍了一些让 Lua table 变更为只读的知识 (代码基于 Lua 5.4)基础基础变更 Lua table 为只读的方法,在 《Programming in Lua》 中就已经给出了(这里),基本思路即是通过 __index 和 __newindex 两个元方法来做 table 的读写限制,代码大体如下:function readonly(t) local prox.原创 2021-01-19 19:41:10 · 344 阅读 · 0 评论 -
[译]寻路优化
看到一篇关于寻路优化的文章,简单翻译了一下,原文在这里译文并未照搬原文翻译,多处是意译原文图片已经失效,不过其他转载网址仍有图片,我对应着补了一下寻路对很多游戏来讲都是不可或缺的元素,在一般的游戏中,使用一些基本的寻路算法(譬如 BFS, Dijkstra 或者 A* 等等)就可以很好的解决寻路问题,但是在另一些游戏中,尤其是在游戏地图比较庞大的情况下,这些基本寻路算法需要耗费大量的时间进行寻路,进而造成游戏卡顿,这使得寻路优化变得非常重要.在这篇文章中,我会简单介绍一下 A* 算法以及该算.翻译 2020-12-16 17:56:41 · 2930 阅读 · 5 评论 -
Sweet Snippet 之 统计二进制中 1 的个数
本文简述了几种用于统计二进制中 1 的个数的方法简介二进制中1的个数是汉明重量(Hamming Weight)的一种,广泛应用于二进制比较等操作中,举例来说,二进制 1011 的汉明重量便是 3,因为该二进制中总共包含 3 个 1.实现遍历最简单的实现方法便是遍历二进制的各个位,然后统计各个位中 1 的个数,代码实现的话大概是这个样子(Lua 代码(5.4),下同):function count_1_raw(val) local count = 0 while .原创 2020-10-28 11:34:58 · 283 阅读 · 0 评论 -
简单聊聊 Perlin 噪声(下篇)
程序开发中总会用到随机方法,一般的随机方法虽然通用,但是产生的随机数又因为过于"随机",不适合用来生成平滑连续的随机数据(譬如自然地形的高度),这个时候我们便需要使用特殊的随机方法了, Perlin 噪声便是一种能够产生平滑(随机)数值的随机方法.Perlin 噪声理解了二维的 Value 噪声,我们就可以进一步来看 二维的 Perlin 噪声了.二维 Perlin 噪声的生成方式和 二维 Value 噪声的生成方式大体相同,二维 Perlin 噪声也是根据给定的坐标选取对应的正方形,并将该正方形.原创 2020-08-31 16:05:43 · 962 阅读 · 0 评论 -
简单聊聊 Perlin 噪声(上篇)
程序开发中总会用到随机方法,一般的随机方法虽然通用,但是产生的随机数又因为过于"随机",不适合用来生成平滑连续的随机数据(譬如自然地形的高度),这个时候我们便需要使用特殊的随机方法了, Perlin 噪声便是一种能够产生平滑(随机)数值的随机方法.Value 噪声为了更容易的理解 Perlin 噪声,我们先从较简单的 Value 噪声看起:首先我们考虑 一维 情况(即通过一维坐标来获取随机值),如果我们仅使用一般随机方法的话,得到的随机数值是这样的:可以看到数据杂乱无章,远不能说是平滑连续,有.原创 2020-08-27 10:38:05 · 1886 阅读 · 0 评论 -
Sweet Snippet 之 BitMask
本文简述了 BitMask 的(一种)使用场景和实现方法游戏开发中往往会遇到不同游戏逻辑触发相同游戏操作的情况,举个简单的例子:在播放游戏过场动画时,我们往往需要隐藏游戏UI;而当我们进行游戏截屏时,往往也需要隐藏游戏UI.假设显示/隐藏游戏UI的接口如下:void SetUIActive(bool active);按照上面所说的功能需求(过场动画和游戏截屏都需要隐藏游戏UI),我们...原创 2020-04-30 21:01:11 · 255 阅读 · 0 评论 -
Sweet Snippet 之 Timeslice Update
本文简述了一种基于时间片(Timeslice)的对象更新(Update)方法游戏开发中,我们一般都要进行大量的对象更新(Update)操作,拿 Unity 中的 MonoBehavior 举例,其便支持定义专门的 Update 方法来处理相关 Component 的更新:using UnityEngine;public class CustomScript : MonoBehaviou...原创 2020-04-29 19:02:00 · 287 阅读 · 0 评论 -
编程小知识 之 序列 rotate
本文简述了 序列 rotate 的一些知识基础本篇文章中所说的 序列 rotate(旋转) 可能跟我们平常理解的 图像 rotate(旋转) 不太相同,所谓 序列 rotate,其实就是一种调整序列元素顺序的方法,而要理解这种方法之所以称为 rotate(旋转),我们需要将序列想象为一个环形结构,而 rotate 操作其实就是在这个环形结构上对序列进行旋转.举个简单的例子,假设我们有序列...原创 2020-03-26 20:53:42 · 911 阅读 · 0 评论 -
Sweet Snippet 之 方差计算
方差计算的简单实现在概率统计中,方差用于衡量一组数据的离散程度,相关的计算公式如下(总体方差):μ=1N∑i=1Nxiσ2=1N∑i=1N(xi−μ)2 \begin{aligned} &\mu = \frac{1}{N}\sum_{i = 1}^{N}x_i \\ &\sigma^2 = \frac{1}{N}\sum_{i = 1}^{N}(x_...原创 2020-02-16 16:43:18 · 778 阅读 · 0 评论 -
Unity 中进行数据压缩的一种方法
本文简单描述了一种在 Unity 中进行数据压缩的方法一般的游戏开发中,数据压缩往往跟资源加载等底层机制关系密切,在上层逻辑中的使用则并不常见..Net 中, System.IO.Compression命名空间下就原生提供了可以进行数据(解)压缩的各种类型(方法),譬如 DeflateStream, GZipStream 等等.但是如果我们直接在 Unity 中使用这些类型(方法)来进行...原创 2020-01-11 14:31:26 · 3097 阅读 · 1 评论 -
编程小知识之 虚假唤醒(spurious wakeup)
本文简单介绍了一些 虚假唤醒(spurious wakeup) 相关的知识(注: 本文假设读者对多线程开发有一定了解)高层次的多线程编程中,条件变量是个常见的同步方法,跟传统仅使用互斥量的方法相比,条件变量可以减少锁的竞争.拿 Pthread 举例,一个常见的条件变量的使用示例大概是这个样子的:// flag for syncbool g_signaled = false;pthr...原创 2019-12-16 20:07:16 · 783 阅读 · 0 评论 -
编程小知识之 Dithering
本文简单介绍了 Dithering(抖动) 的一些知识图形后处理有一种操作称为 Dithering(抖动),所谓 Dithering,就是一种能够在较小色彩空间上"模拟出"较大色彩空间的图像处理方法,说的有些抽象,我们来举个例子:假设我们需要在显示器上显示以下图片(图片来自这里):图片的像素格式为 RGB24RGB24RGB24(像素的 R,G,BR,G,BR,G,B 通道各占 111...原创 2019-11-29 19:46:56 · 1653 阅读 · 0 评论 -
编程小知识之 Lua split 函数
本文简单介绍了如何在 Lua 中实现 split 函数Lua 的标准库并没有提供字符串的 split 函数,不过自己实现一下也并不困难,网上其实也早有了很多实现版本:一个 gist 实现SO 上的一个版本GitHub 上的一个实现…之前有童鞋使用 Lua 实现了自己的 split 版本还与 js(基于V8) 中的标准实现进行了性能比较,有兴趣的朋友可以看看,过程其实挺有趣的,只...原创 2019-06-01 14:33:21 · 7553 阅读 · 0 评论 -
编程小知识之 CanvasScaler 的一点知识
本文简述了 Unity 中 CanvasScaler 的一点知识制作 UI 时,一般都需要进行多分辨率适配,基本的方法大概有以下几种:UI 参照单一的分辨率(参考分辨率)进行制作,实际显示时按照某种方式调整到实际的设备分辨率UI 按照所有可能的分辨率分别进行制作,实际显示时选择对应的设备分辨率显示上述两种方法(间)的某种平衡方式(譬如根据占比较高的几种分辨率来制作UI)UGUI ...原创 2019-05-16 18:07:16 · 624 阅读 · 3 评论 -
编程小知识之生成排列
本文简述了两种生成排列的方法生成排列的方法不少,一种经典的方法就是采用递归,假设我们需要求解 1 ~ n 的所有排列,那么我们假设已经求解了 1 ~ n - 1 的所有排列,然后对于求解出的每一种排列(1 ~ n - 1 的一种排列),我们将 n 放置于该排列中可能的 n 个空位上,即可完成 1 ~ n 的排列求解.说的有些抽象,举个实际的例子:假设我们要求解 1 ~ 3 这三个数字的所...原创 2019-04-29 23:57:22 · 1442 阅读 · 3 评论 -
随便聊聊水面效果的2D实现(一)
0. 引子 一直想随便写写自己关于水面效果2D实现的一些了解,可惜各种原因一直拖沓,幸而近来有些事情终算告一段落,自己也有了一些闲暇时间,于是便有了这篇东西 :) 1. 概述 关于水面效果的实现方法,google一下非常之多,目前的很多游戏也有非常好的呈现,其中最令我印象深刻的当数《Crysis》~ 自己由于工作原因接触过一段时间的Cr原创 2014-11-05 10:50:41 · 8313 阅读 · 11 评论 -
业务逻辑中如何处理断线重连
本篇文章简单介绍了在业务逻辑中处理断线重连的一种方法之前一直对如何在业务逻辑中处理断线重连没有一个清晰的认识,后来做了一些思考,这里简单记录一下~假设存在一段业务逻辑 AAA ,整体实现上分为两部分:服务器逻辑部分 ASA_SAS客户端逻辑部分 ACA_CAC一般来讲都是 ASA_SAS 负责维护逻辑状态与事件分发,ACA_CAC 则主要负责显示,输入等表现层的处理.假...原创 2019-06-21 21:53:54 · 865 阅读 · 0 评论 -
Sweet Snippet 系列之 扩展欧几里得算法
扩展欧几里得算法的简单实现扩展欧几里得算法是欧几里得算法(辗转相除法)的扩展,欧几里得算法可以用于求解两个自然数(记为 aaa 和 bbb)的最大公约数,而扩展欧几里得算法不仅可以求出 aaa 和 bbb 的最大公约数,还能同时计算出两个整数 xxx 和 yyy, 使它们满足等式(等式中的 gcd(a,b)gcd(a, b)gcd(a,b) 即表示 aaa 和 bbb 的最大公约数):ax...原创 2019-07-06 11:30:21 · 263 阅读 · 0 评论 -
关于满二叉树的一个证明
本文简单给出了在满二叉树中 内部节点数目(CiC_iCi) = 叶子节点数目(ClC_lCl) - 1 的两种证明方法二叉树大家都不陌生,但是分类上可能大家就不那么熟稔了,本篇博文中提到的所谓满二叉树,定义上也有些分歧,在此我们采用如下定义:满二叉树(Full Binary Tree),即只存在 度为 0 的节点(叶子节点) 和 度为 2 的节点(内部节点) 的二叉树(定义中提到的...原创 2019-08-07 23:05:35 · 1318 阅读 · 2 评论 -
Sweet Snippet 之 字符串编辑距离
字符串编辑距离的简单实现字符串编辑距离应该是动态规划中的代表问题了:给定两个字符串 aaa 与 bbb,求解将 aaa 编辑至 bbb 的操作步数(距离),编辑包含以下两种操作:删除某一字符增加某一字符(这里我们不允许变更某一字符,注意一下)求解方法则是根据子问题的结果"递推"出原问题的结果:设字符串 aaa 的长度为 mmm, 字符串 bbb 的长度为 nnn, 我们定义问...原创 2019-09-10 19:33:43 · 446 阅读 · 0 评论 -
Modern C++ 书籍推荐
本文介绍了一些 Modern C++ 的相关书籍整理了一份 Modern C++(现代 C++,意指使用 C++11 及之后标准特性的 C++),有兴趣的朋友可以参考一下(下文介绍的一些书籍没有给出资源链接,后续会持续更新)~基础The C++ Programming Language第四版中包含了对 C++11 的介绍 [pdf]C++ Primer第五版中包含了对 ...原创 2019-09-14 21:43:43 · 3135 阅读 · 2 评论 -
程序面试题之我见
本文简述了自己对于程序面试题的一些看法前些年程序面试题比较流行,自然也涌现了不少网红试题,这里简单讲解一下,也顺道说说自己的看法~链表简单起见,以下讨论的链表都是单链表如何判断两条(不存在环)链表有交点 ? 如果有交点,如何找出交点 ?存在交点的两条(不存在环)链表,其尾部节点一定是相同的(这里有些朋友可能会有疑问,相交的链表不能是蝶形的吗(这样两条链表就可能存在不相同的尾部...原创 2019-09-30 20:01:15 · 3624 阅读 · 2 评论 -
另一种(Yet Another)三角形线性插值方法
本文简述了一种三角形线性插值的方法(本文仅讨论二维情况)相关问题给定一个三角形的顶点坐标(P0, P1 和 P2)以及对应的数值(V0, V1 和 V2),插值求解三角形内一点(坐标给定为P)的数值(V).问题说的有些抽象,给张图会清晰明了一些,图中的 V 即是我们想要插值求解的数值.插值方法如何求解呢?一般我们是采用比例面积的方法,见下图(图中 a0, a1 和 a2 分别代表三...原创 2019-04-17 23:35:23 · 4773 阅读 · 0 评论 -
[译]OpenGL投影矩阵
这是关于OpenGL投影矩阵的一篇译文,原文在这里.概览(Overview)电脑显示屏是一个2D平面,为了能够在这个2D平面上显示OpenGL渲染的3D场景,我们必须将3D场景当作2D图像投影到这个2D平面(计算机屏幕)上.GL_PROJECTION 矩阵就是用来做这种投影变换的.首先,该矩阵将所有观察空间的顶点坐标变换到裁剪空间,接着,将变换后的顶点坐标(即裁剪坐标)的每个分量(x,y,...翻译 2019-04-09 16:07:36 · 788 阅读 · 0 评论 -
小聊聊NGUI中Panel的Clip功能(之一)
NGUI中的Panel具有裁剪的功能,操作上便是设置一个Panel类型即可~ 原理上,该裁剪功能是基于Shader来实现的,简单列一下相关的着色器代码: v2f vert (appdata_t v){ o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); o.color = v.color; o.texcoord = v.texcoord原创 2016-08-01 21:31:32 · 7950 阅读 · 5 评论 -
小聊聊NGUI中Panel的Clip功能(之二)
上篇简单聊了一下NGUI中Panel裁剪的实现原理,总结来看其实比较简单,就是通过Shader计算fragment关于Panel裁剪区域的相对位置,然后通过调整alpha值来实现裁剪效果~ 那么依样画瓢,如果我们想要实现非NGUI元素的裁剪,也可以考虑使用Shader的方式,在此以ParticleSystem为例,看看我们如何将其挂接到UI之上,并且实现裁剪效果~ 回忆一下原创 2016-08-03 21:29:39 · 5483 阅读 · 2 评论 -
再谈谈列表元素的删除
之前(以及更早之前)都提到了列表元素的删除,也提到过几种方法,有兴趣的朋友可以去看看,其中一种个人比较倾向的写法大概是这个样子(C++):auto iter = vec.begin();while (iter != vec.end()) { if (isEven(*iter)) { iter = vec.erase(iter); } else { ++iter; }原创 2016-04-27 21:40:34 · 815 阅读 · 0 评论 -
C++11(14) 简易推荐小记~
之前了解过一些C++新标准的内容,觉得很不错,在此写篇小记,简易推荐一下~ 容器内元素操作是个很普通的需求,工作中应是屡见不鲜,这里假设有个list容器,存储的是一系列int,表达的意思就算作是年龄吧,新年将近,大家的年龄也都会不情愿的涨上一岁,简单用C++表达一下,大概是这个样子:#ifndef __TEST_1_H__#define __TEST_1_H__#in原创 2015-12-07 20:57:11 · 739 阅读 · 0 评论 -
数学笔记(三)之镜面矩阵
镜面变换在游戏中并不少见,相关资料网上也俯拾即是,不过自己总是感觉略显生疏,在此简单一记,算作是加深印象吧~ 问题很简单,假设存在点P(x, y, z)以及平面(n, D)(不太清楚为何平面如此表示的朋友可以参考这里),求解P相对与平面的镜像变换矩阵~ 为了方便推导,画张图先: 简单解释一下图中内容:设点P(x, y, z)为平面正方向上的一点,点原创 2015-12-10 20:53:05 · 4775 阅读 · 0 评论 -
数学笔记(二)之平面表示
关于平面的表示方法,之前也有些模糊的地方,在此顺便一记吧~ 假设我们知道垂直于平面的法向量n,以及平面上的一点p0,如何使用这两个元素来表示该平面呢? 取平面上的任意一点p,并设d为从点p0到点p的向量,以坐标表示如下: n = (xn, yn, zn) p0 = (x0, y0, z0) p = (x, y, z) d = p - p0 = (x原创 2015-11-22 15:37:30 · 4083 阅读 · 0 评论 -
随便聊聊水面效果的2D实现(二)
0. 引子 之前提到想要随便聊一聊RippleEffect的2D实现方法,近来又总算有了些许空余时间,于是便有了这篇东西~ 1. 概述 RippleEffect我个人的理解是波纹或者说涟漪效果,与之前所讲的WaterEffect有所不同的是,RippleEffect表现的是水波产生与消散的一个过程,而WaterEffect更注重的则是持续的水波“荡漾”效果。原创 2014-12-15 19:24:09 · 4653 阅读 · 3 评论