
随性
文章平均质量分 71
tkokof1
这个作者很懒,什么都没留下…
展开
-
动画通知(Anim Notify)问题小记
本文简单记录了使用 动画通知(Anim Notify) 过程中遇到的一些问题和可能的解决方法。原创 2023-02-14 12:08:01 · 2044 阅读 · 0 评论 -
[译]Lua编程技巧
这个原则((YAGNI原则))和你计划在将来添加的程序特性有关,该原则是 “You aren’t gonna need it(你不会需要它的)” 的缩写.你不应该在需求明确之前添加新的程序功能或者程序特性,任何新的程序特性其实都会对程序的扩展性产生限制,所以一个不必要的程序特性很可能会影响到之后新增的一些必要的程序特性,并且当程序特性需求不明确时,我们也很难定义该程序特性实际的开发内容和测试方法.相比较复杂代码,简单代码往往更优雅,更不易产生Bug, 同时也更方便构建扩展,程序员之间也经常会提起这两个原则(原创 2022-06-04 21:24:29 · 334 阅读 · 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 评论 -
UE4 微笔记 之 调整网格材质参数
简单记录一下调整网格(Mesh)材质参数的方法修改网格材质参数一般有以下几个步骤:首先创建材质参数(这里有较详细的说明)创建动态材质实例(UMaterialInstanceDynamic)设置动态材质参数(通过 SetVectorParameterValue 等方法)以下是一段简单的代码示例:void SetMeshMaterial(UMeshComponent* MeshComponent, int MaterialIndex){ if (MeshComponent) { a.原创 2021-12-03 17:56:37 · 1083 阅读 · 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 评论 -
C++(UE4) Memory Management Review
以下是关于 C++(UE4) 内存管理的一点简单分享原始方式(Raw)malloc/free 是 C 中用于分配内存和释放内存的主要方式new/delete 是 C++ 中用于分配内存和释放内存的主要方式,除了内存管理之外, new/delete 还负责调用对象的构造函数和析构函数new[]/delete[] 是 new/delete 的数组形式比较重要的一点是, new/delete 等内存管理的调用一定要匹配,譬如调用了 new 就一定要调用 delete(而不能 不调用 delete.原创 2021-08-15 22:27:31 · 359 阅读 · 0 评论 -
Sweet Snippet 之 RingBuffer for UE4
本文简述了一种 环形缓冲区(ring buffer) 的实现方法环形缓冲区(ring buffer)在一些情况下非常有用, UE4 中提供了一个默认的实现 TCircularBuffer(代码较短,下面直接贴出完整源码):// Copyright Epic Games, Inc. All Rights Reserved.#pragma once#include "CoreTypes.h"#include "Misc/AssertionMacros.h"#include "Containe.原创 2021-08-10 20:32:41 · 381 阅读 · 0 评论 -
MiniGame 之 扫雷实现
本文是 扫雷(MiniGame) 的一个实现样例(使用 Unity/C#),主要以代码为主,辅以一点简单的注解实现样例中的扫雷实现主要是两个类型(BombGame 和 BombGrid),下面是完整代码:// desc bomb game implementation// maintainer hugoyuusing System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngi.原创 2021-07-18 16:15:41 · 259 阅读 · 1 评论 -
代码宏的一点小知识
本文是一篇关于宏定义的短文C/C++ 中我们可以定义宏来做一些代码的简化工作,一般我们不推荐使用宏,因为使用过程中很容易出现问题,目前有一些方法可以用来取代宏的部分功能(譬如内联函数),但是仍然有些宏功能现在还没有更可靠方便的替代方法,遇到这些使用情境的话,我们还是需要使用宏.宏的一个简单应用就是定义重复常量,譬如:#define MAX_COUNT 1024通过使用这种常量宏,我们可以较方便的维护代码中常量的变更.我们也可以定义参数宏,能够起到"模拟"函数等作用:#define MAX(.原创 2021-07-07 15:06:30 · 249 阅读 · 0 评论 -
UE4 微笔记 之 HitResult (持续更新)
UE4 中使用 FHitResult 结构来存储碰撞检测后的相关数据,在此简单记录一下该结构中各个成员的含义.FHitResult 结构对应于蓝图中有一个 Break Hit Result 节点,我们可以参照该节点来了解 FHitResult 中各个成员数据(为了便于理解,下面记录的成员数据顺序有所调整):Blocking Hit如果发生了碰撞则为 true, 否则为 falseInitial Overlap用于表示碰撞检测起始处是否与碰撞体发生了重叠, 发生了重叠为 true, 否则.原创 2021-06-20 07:25:54 · 4224 阅读 · 1 评论 -
编程小知识 之 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 评论 -
Sweet Snippet 之 Lua Utils
之前写过不少关于 Lua 的 Utils 代码,不少都挺实用的,但是平时使用中却又总是觉得零散,遂而收集整理了一个 repo,希望可以持续完善,有兴趣的朋友可以看一看,欢迎 PR ~以下内容仅为当前 repo 的 readme 内容,后面持续更新:lua utilsdescthis is a simple lua util functions collection for easy usage and intergrationfunction reference(TODO)table u.原创 2021-02-17 09:38:45 · 356 阅读 · 1 评论 -
编程小知识 之 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 评论 -
C++ 标准库の使用迷思
转眼 2020 已经过去,回顾来看总有些迷幻,新年之际,自己倒不打算写些什么年终总结,想想还是记一小篇技术小文: C++ 标准库的使用迷思.了解 C++ 的朋友对于标准模板库肯定不陌生,平日用 C++ 开发时基本也是离不开标准模板库的,举个最普遍的例子:当我们需要动态数组时,甚至于仅需要静态数组时,我们都会第一个想到 vector :#include <vector>std::vector<int> int_array;原因就在于使用 vector 方便且稳定,不用自.原创 2021-01-02 17:35:02 · 305 阅读 · 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 评论 -
小记 TypeScript 中的循环引用问题
随着项目规模的不断增长,循环引用问题似乎总是不可避免,本文就 TypeScript 中可能出现的循环引用问题做了一些简单记录~平时编写 TypeScript 代码时,一般都倾向于使用模块(Module),通过结合使用 import 和 export 我们便可以方便的进行模块的导入和导出.举个简单的例子,假设我们有以下的 TypeScript 代码文件(A.ts):export class A { // methods here}可以看到,上述代码使用 export 导出了类型 A,如.原创 2020-10-09 19:43:24 · 8348 阅读 · 1 评论 -
Octave 笔记
简单用了一下 Octave,发现用他来进行数据运算、矢量绘制等操作的时候还是非常方便的,在此做一点简单笔记.注释% 或者 # 为单行注释# this is line comment% this is line comment%{ 与 %} 或者 #{ 与 #} 为块(多行)注释%{ block comment%}#{ block comment#}向量在 Octave 中我们可以直接创建向量,使用 空格 或者 逗号 来分隔列;使用 分号来分隔行.>&g.原创 2020-09-02 11:28:27 · 852 阅读 · 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 评论 -
Lua 5.4 新特性概览
本文简单介绍了一些 Lua 5.4 的新特性Lua 5.4 正式发布了,很多朋友应该会比较好奇 Lua 5.4 与之前版本的区别,本文就此简单介绍一些 Lua 5.4 的新特性.完整的 Lua 5.4 变更列表可以在这里找到,本文我们仅简单概览下其中主要的几点变化:分代 GC之前 Lua 采用的是 分步 GC 算法来进行垃圾回收, Lua 5.4 加入了 分代 GC 算法,值得注意的一点是, Lua 5.4 仍然支持 分步 GC 算法(并且目前 分步 GC 算法仍然是默认的 GC 算法),我们可.原创 2020-07-08 14:35:36 · 5803 阅读 · 0 评论 -
ZeroBrane Studio 简易适配 Lua 5.4
本文介绍了 ZeroBrane Studio 简易适配 Lua 5.4 的一些细节Lua 5.4 已经到 rc4 版本了,相信不少朋友都已经有所尝试,最简单的测试方法应该就是手动编译一个 lua.exe,然后直接命令行执行脚本:lua.exe lua_script_path当然,使用 IDE 来编写测试脚本会更方便些,自己平时用 ZeroBrane Studio 比较多,不过最新版本的 ZeroBrane Studio 还没有直接支持 Lua 5.4 脚本的运行和调试,自己简单尝试适配了一下,发.原创 2020-06-03 20:07:30 · 993 阅读 · 0 评论 -
PS4 Pro 拆机记
本文是自己拆解 PS4 Pro 的一些记录起因过年的时候孩子玩闹,将一张银行卡塞进了 PS4 Pro 的光驱里,导致整个光驱都罢工了,一开始以为光驱进入异物可能是常见现象,修理方法应该不难,没想搜索了一番信息下来,似乎只有两个解决方法(并且两个方法都不简单…):送修拆机自己简单尝试了一下使用镊子直接从光驱入口掏银行卡,发现不拆机的话根本就是"暗箱"操作,任何操作不当都极易损坏光驱...原创 2020-05-04 22:04:58 · 6803 阅读 · 0 评论 -
Sweet Snippet 之 BitMask
本文简述了 BitMask 的(一种)使用场景和实现方法游戏开发中往往会遇到不同游戏逻辑触发相同游戏操作的情况,举个简单的例子:在播放游戏过场动画时,我们往往需要隐藏游戏UI;而当我们进行游戏截屏时,往往也需要隐藏游戏UI.假设显示/隐藏游戏UI的接口如下:void SetUIActive(bool active);按照上面所说的功能需求(过场动画和游戏截屏都需要隐藏游戏UI),我们...原创 2020-04-30 21:01:11 · 255 阅读 · 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 评论 -
.NET GC 精要(七)
本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management(注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等)深入并发执行模式(工作站模式下)的一点细节之前讲到工作站模式分为 并发 和 非并发 两种执行模式,其中非并发 执行模式比较容易理解,即在整个 GC 流程中应用线程(appli...原创 2020-02-09 10:23:46 · 405 阅读 · 0 评论 -
.NET GC 精要(六)
本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management(注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等)深入内存段(memory segment)的申请每个托管进程(managed process)都有各自独立的 SOH 和 LOH,并且在开始执行的时候,托管进程会为 SOH ...原创 2020-02-06 10:02:02 · 520 阅读 · 0 评论 -
.NET GC 精要(五)
本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management(注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等)深入之前讲过 .NET GC 出于效率等因素的考虑,对 SOH(Small Object Heap)进行了分代处理(Gen 0, Gen 1 和 Gen 2),当时只是大概讲述...原创 2020-02-01 08:54:10 · 368 阅读 · 0 评论 -
.NET GC 精要(四)
本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management(注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等)进阶之前在讲述 GC 分代回收的时候,我们只是了解了一下 SOH(Small Object Heap) 相关的内存回收行为,实际上,在进行 Gen 2 GC(也称为 full ...原创 2020-01-30 09:04:07 · 390 阅读 · 0 评论 -
.NET GC 精要(三)
本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management(注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等)进阶.NET 为了处理非托管资源(unmanaged resource)的释放问题,引入了终结器(Finalization)的机制,相关的代码实现上也并不复杂,仅需要在类型中定...原创 2020-01-27 10:50:13 · 475 阅读 · 0 评论 -
.NET GC 精要(二)
本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management(注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等)进阶之前我们讲述 SOH(Small Object Heap) 时提过其会执行内存压缩过程,但如果程序中存在大量的(小)对象的话,在 SOH 中完整执行一遍内存压缩也会消耗不少...原创 2020-01-25 12:09:54 · 1820 阅读 · 0 评论 -
.NET GC 精要(一)
本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management(注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等)基础稍有 .NET 基础的朋友一定知道 .NET GC 管理的是托管堆(managed heap)的内存释放问题,而托管堆又可以进一步分成两类:Small Object H...原创 2020-01-22 16:15:11 · 2357 阅读 · 0 评论 -
Unity 中进行数据压缩的一种方法
本文简单描述了一种在 Unity 中进行数据压缩的方法一般的游戏开发中,数据压缩往往跟资源加载等底层机制关系密切,在上层逻辑中的使用则并不常见..Net 中, System.IO.Compression命名空间下就原生提供了可以进行数据(解)压缩的各种类型(方法),譬如 DeflateStream, GZipStream 等等.但是如果我们直接在 Unity 中使用这些类型(方法)来进行...原创 2020-01-11 14:31:26 · 3097 阅读 · 1 评论 -
编程小知识之 Lua 长度运算符(#)
本文讲解了 Lua 中长度运算符(#)的一些知识(注: 以下讨论基于 Lua 5.3.5 版本)基础Lua 中的长度运算符(#)可以用于获取 table 的"长度",举个简单的例子:local t = { 1, 1, 1 }print(#t) -- 3但其实对于 table 而言,长度运算符并不等同于获取 table 的"长度",更准确一些的说法应该是获取 table 序列部分的...原创 2019-12-20 17:52:47 · 1538 阅读 · 0 评论