- 博客(197)
- 资源 (25)
- 收藏
- 关注
原创 Sweet Snippet 之 计算 MaxSortedDistance
很久没有动手写博文了,原因能"编"出来很多,大抵都是些老生长谈的东西,不赘述了,今天也仅是兴盛所致写了一篇,希望以后能多写一些了,是为记.所谓 MaxSortedDistance,是指一个无序数组经过排序后相邻元素的最大差值.本文简述了 计算 MaxSortedDistance 的一些方法。但是排序数组的时间复杂度比较高,有可能进一步降低吗?代码简单直白,通俗易懂.
2023-11-12 16:45:32
183
原创 Sweet Snippet 之 PlayMode实现
其中 PingPong 模式的处理会有些特殊,但是了解了上面 Elapsed 的处理方式(PingPong 模式下)就容易理解了,有兴趣的朋友可以细看一下.作用就是处理浮点数的除法和取模(用以解决除零等问题)以及线性插值.本文简述了一种 PlayMode 的实现方式。
2023-04-20 20:58:53
697
原创 [译]Lua编程技巧
这个原则((YAGNI原则))和你计划在将来添加的程序特性有关,该原则是 “You aren’t gonna need it(你不会需要它的)” 的缩写.你不应该在需求明确之前添加新的程序功能或者程序特性,任何新的程序特性其实都会对程序的扩展性产生限制,所以一个不必要的程序特性很可能会影响到之后新增的一些必要的程序特性,并且当程序特性需求不明确时,我们也很难定义该程序特性实际的开发内容和测试方法.相比较复杂代码,简单代码往往更优雅,更不易产生Bug, 同时也更方便构建扩展,程序员之间也经常会提起这两个原则(
2022-06-04 21:24:29
298
原创 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
491
原创 Sweet Snippet 之 四则运算求值
本文简单介绍了一种四则运算求值的实现方法(基于语法分析)双栈算法可以实现四则运算的求值,但是扩展性比较低,更好的方式是基于语法分析来实现,整体大概包括以下几个步骤:词法分析语法分析语法树生成运算求值我们先来看词法分析:首先定义我们需要用到的词法类型:local token_type = { add = 1, -- '+' minus = 2, -- '-' mul = 3, -- '*' div = 4, -- '/' lbrace = 5,.
2022-01-28 14:17:26
710
原创 Sweet Snippet 之 大整数乘法
本文简单介绍了一种大整数乘法的实现方式当整数范围较大时,直接使用乘法运算符(*)很容易导致数值溢出,如果开发工作中确实需要处理这种大范围的整数,那么我们便需要实现一下大(范围)整数的乘法运算(一般方法便是将大整数表达为字符串,然后基于字符串来进行乘法运算).在实现大整数乘法之前,我们先来实现一下大整数的加法运算,朴素方法便是从低到高按位进行加法操作,并考虑进位的影响,代码大概如下(Lua):local big_int = {}local function digit_num(v) re.
2022-01-04 21:23:31
320
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
908
原创 UE4 微笔记 之 调整网格材质参数
简单记录一下调整网格(Mesh)材质参数的方法修改网格材质参数一般有以下几个步骤:首先创建材质参数(这里有较详细的说明)创建动态材质实例(UMaterialInstanceDynamic)设置动态材质参数(通过 SetVectorParameterValue 等方法)以下是一段简单的代码示例:void SetMeshMaterial(UMeshComponent* MeshComponent, int MaterialIndex){ if (MeshComponent) { a.
2021-12-03 17:56:37
992
原创 Sweet Snippet 之 骑士金币问题
本文简述了骑士金币问题的两种实现方法首先我们来看下什么是 骑士金币问题:骑士金币问题国王要用金币赏赐忠于他的骑士.骑士在就职的第一天得到一枚金币,接下来的两天(第二天和第三天)每天会得到两枚金币,接下来的三天(第四、五、六天)每天会得到三枚金币,接下来的四天(第七、八、九、十天)每天会得到四枚金币,这样的赏赐形式会一直持续下去,问题是给定一个天数(譬如第十天),求骑士将会获得的总的金币数量.举个简单的例子,如果给定第十天(NNN = 10),那么骑士将会获得的总的金币数量(CCC)为:C=1+.
2021-10-07 12:50:35
804
原创 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
257
原创 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
286
原创 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
335
原创 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
189
1
原创 代码宏的一点小知识
本文是一篇关于宏定义的短文C/C++ 中我们可以定义宏来做一些代码的简化工作,一般我们不推荐使用宏,因为使用过程中很容易出现问题,目前有一些方法可以用来取代宏的部分功能(譬如内联函数),但是仍然有些宏功能现在还没有更可靠方便的替代方法,遇到这些使用情境的话,我们还是需要使用宏.宏的一个简单应用就是定义重复常量,譬如:#define MAX_COUNT 1024通过使用这种常量宏,我们可以较方便的维护代码中常量的变更.我们也可以定义参数宏,能够起到"模拟"函数等作用:#define MAX(.
2021-07-07 15:06:30
210
原创 UE4 微笔记 之 HitResult (持续更新)
UE4 中使用 FHitResult 结构来存储碰撞检测后的相关数据,在此简单记录一下该结构中各个成员的含义.FHitResult 结构对应于蓝图中有一个 Break Hit Result 节点,我们可以参照该节点来了解 FHitResult 中各个成员数据(为了便于理解,下面记录的成员数据顺序有所调整):Blocking Hit如果发生了碰撞则为 true, 否则为 falseInitial Overlap用于表示碰撞检测起始处是否与碰撞体发生了重叠, 发生了重叠为 true, 否则.
2021-06-20 07:25:54
3319
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
739
原创 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
323
1
原创 编程小知识 之 Base64 编码
本文简述了 Base64 编码的一些知识简介在一些 支持可打印字符(而不(完善)支持其他字符) 的开发场景下(譬如原始的电子邮件中),为了能够传输存储二进制数据(广义上的非打印字符),我们需要一种将二进制数据转换为可打印字符的编码方式, Base64 就是这么一种编码方式.基础Base64 编码的步骤如下:将待转换的字节数组(即二进制数据)按每 3 个字节分为一组(共 3 x 8 = 24 bit(二进制位))将上述 24 bit 按每 6 bit 一组重新分为 4 组分别计算上面 4 .
2021-01-30 20:26:52
238
原创 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
299
原创 C++ 标准库の使用迷思
转眼 2020 已经过去,回顾来看总有些迷幻,新年之际,自己倒不打算写些什么年终总结,想想还是记一小篇技术小文: C++ 标准库的使用迷思.了解 C++ 的朋友对于标准模板库肯定不陌生,平日用 C++ 开发时基本也是离不开标准模板库的,举个最普遍的例子:当我们需要动态数组时,甚至于仅需要静态数组时,我们都会第一个想到 vector :#include <vector>std::vector<int> int_array;原因就在于使用 vector 方便且稳定,不用自.
2021-01-02 17:35:02
266
翻译 [译]寻路优化
看到一篇关于寻路优化的文章,简单翻译了一下,原文在这里译文并未照搬原文翻译,多处是意译原文图片已经失效,不过其他转载网址仍有图片,我对应着补了一下寻路对很多游戏来讲都是不可或缺的元素,在一般的游戏中,使用一些基本的寻路算法(譬如 BFS, Dijkstra 或者 A* 等等)就可以很好的解决寻路问题,但是在另一些游戏中,尤其是在游戏地图比较庞大的情况下,这些基本寻路算法需要耗费大量的时间进行寻路,进而造成游戏卡顿,这使得寻路优化变得非常重要.在这篇文章中,我会简单介绍一下 A* 算法以及该算.
2020-12-16 17:56:41
2764
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
252
原创 小记 TypeScript 中的循环引用问题
随着项目规模的不断增长,循环引用问题似乎总是不可避免,本文就 TypeScript 中可能出现的循环引用问题做了一些简单记录~平时编写 TypeScript 代码时,一般都倾向于使用模块(Module),通过结合使用 import 和 export 我们便可以方便的进行模块的导入和导出.举个简单的例子,假设我们有以下的 TypeScript 代码文件(A.ts):export class A { // methods here}可以看到,上述代码使用 export 导出了类型 A,如.
2020-10-09 19:43:24
7668
1
原创 Octave 笔记
简单用了一下 Octave,发现用他来进行数据运算、矢量绘制等操作的时候还是非常方便的,在此做一点简单笔记.注释% 或者 # 为单行注释# this is line comment% this is line comment%{ 与 %} 或者 #{ 与 #} 为块(多行)注释%{ block comment%}#{ block comment#}向量在 Octave 中我们可以直接创建向量,使用 空格 或者 逗号 来分隔列;使用 分号来分隔行.>&g.
2020-09-02 11:28:27
672
原创 简单聊聊 Perlin 噪声(下篇)
程序开发中总会用到随机方法,一般的随机方法虽然通用,但是产生的随机数又因为过于"随机",不适合用来生成平滑连续的随机数据(譬如自然地形的高度),这个时候我们便需要使用特殊的随机方法了, Perlin 噪声便是一种能够产生平滑(随机)数值的随机方法.Perlin 噪声理解了二维的 Value 噪声,我们就可以进一步来看 二维的 Perlin 噪声了.二维 Perlin 噪声的生成方式和 二维 Value 噪声的生成方式大体相同,二维 Perlin 噪声也是根据给定的坐标选取对应的正方形,并将该正方形.
2020-08-31 16:05:43
869
原创 简单聊聊 Perlin 噪声(上篇)
程序开发中总会用到随机方法,一般的随机方法虽然通用,但是产生的随机数又因为过于"随机",不适合用来生成平滑连续的随机数据(譬如自然地形的高度),这个时候我们便需要使用特殊的随机方法了, Perlin 噪声便是一种能够产生平滑(随机)数值的随机方法.Value 噪声为了更容易的理解 Perlin 噪声,我们先从较简单的 Value 噪声看起:首先我们考虑 一维 情况(即通过一维坐标来获取随机值),如果我们仅使用一般随机方法的话,得到的随机数值是这样的:可以看到数据杂乱无章,远不能说是平滑连续,有.
2020-08-27 10:38:05
1807
原创 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
5417
原创 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
898
原创 编程小知识 之 杂记两则
本文简述了之前遇到的两则编程杂记隐式字符串字面量合并之前看到一段 C/C++ 代码:void func(const char* str) { // implementation ...}func("string" "params");代码定义了一个参数为字符串指针的函数 func,调用时却使用了 “string” “params” 这种字符串连写的方式(中间没有逗号分隔符),初看时我一直怀疑调用代码存在"笔误",甚至认为这种写法会引起编译错误,但实际上, func(“string.
2020-05-31 10:10:49
489
原创 PS4 Pro 拆机记
本文是自己拆解 PS4 Pro 的一些记录起因过年的时候孩子玩闹,将一张银行卡塞进了 PS4 Pro 的光驱里,导致整个光驱都罢工了,一开始以为光驱进入异物可能是常见现象,修理方法应该不难,没想搜索了一番信息下来,似乎只有两个解决方法(并且两个方法都不简单…):送修拆机自己简单尝试了一下使用镊子直接从光驱入口掏银行卡,发现不拆机的话根本就是"暗箱"操作,任何操作不当都极易损坏光驱...
2020-05-04 22:04:58
6133
原创 Sweet Snippet 之 BitMask
本文简述了 BitMask 的(一种)使用场景和实现方法游戏开发中往往会遇到不同游戏逻辑触发相同游戏操作的情况,举个简单的例子:在播放游戏过场动画时,我们往往需要隐藏游戏UI;而当我们进行游戏截屏时,往往也需要隐藏游戏UI.假设显示/隐藏游戏UI的接口如下:void SetUIActive(bool active);按照上面所说的功能需求(过场动画和游戏截屏都需要隐藏游戏UI),我们...
2020-04-30 21:01:11
228
原创 Sweet Snippet 之 Timeslice Update
本文简述了一种基于时间片(Timeslice)的对象更新(Update)方法游戏开发中,我们一般都要进行大量的对象更新(Update)操作,拿 Unity 中的 MonoBehavior 举例,其便支持定义专门的 Update 方法来处理相关 Component 的更新:using UnityEngine;public class CustomScript : MonoBehaviou...
2020-04-29 19:02:00
261
原创 编程小知识 之 序列 rotate
本文简述了 序列 rotate 的一些知识基础本篇文章中所说的 序列 rotate(旋转) 可能跟我们平常理解的 图像 rotate(旋转) 不太相同,所谓 序列 rotate,其实就是一种调整序列元素顺序的方法,而要理解这种方法之所以称为 rotate(旋转),我们需要将序列想象为一个环形结构,而 rotate 操作其实就是在这个环形结构上对序列进行旋转.举个简单的例子,假设我们有序列...
2020-03-26 20:53:42
829
原创 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
733
原创 .NET GC 精要(七)
本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management(注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等)深入并发执行模式(工作站模式下)的一点细节之前讲到工作站模式分为 并发 和 非并发 两种执行模式,其中非并发 执行模式比较容易理解,即在整个 GC 流程中应用线程(appli...
2020-02-09 10:23:46
371
原创 .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
490
原创 .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
340
The Modern C++ Challenge.zip
2019-09-14
Professional C++ 4th.zip
2019-09-14
Optimized C++.zip
2019-09-14
Modern C++ Programming Cookbook.zip
2019-09-14
Mastering the C++17 STL.zip
2019-09-14
Mastering C++ Multithreading.zip
2019-09-14
Discovering Modern C++ An Intensive Course for Scientists.zip
2019-09-14
C++17 STL Cookbook.zip
2019-09-14
C++17 Quick Syntax Reference.zip
2019-09-14
Beginning C++17 From Novice to Professional, 5th edition.zip
2019-09-14
C++ Concurrency in Action.zip
2019-09-14
The C++ Standard Library A Tutorial and Reference (2nd Edition).zip
2019-09-14
Effective.Modern.C++.zip
2019-09-14
2013 Stroustrup - The C++ Programming Language 4th Edition.zip
2019-09-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人