在学习javascript和python的过程中,我们通常会接触到map
、filter
、reduce
之类的一等公民高阶函数。理解map
和filter
是相对简单的事情,但理解reduce
的话还是需要一番推敲。正值十一假期,今天这篇文章就好好讲讲reduce
这个东西
我们首先以python为例,看一段reduce
程序的操作:
在学习javascript和python的过程中,我们通常会接触到map
、filter
、reduce
之类的一等公民高阶函数。理解map
和filter
是相对简单的事情,但理解reduce
的话还是需要一番推敲。正值十一假期,今天这篇文章就好好讲讲reduce
这个东西
我们首先以python为例,看一段reduce
程序的操作:
在vue技术栈下做图表需求,echarts是一个非常棒的选择,提供了非常多种多样的图标示例以及非常复杂强大的API。由于笔者近期工作内容中需要分析采样点的分布情况,因此自然而然接触到了echarts的3D散点图。在笔者的需求中,需要对不同点进行分类,并按特定的颜色显示出来。经过一番踩坑,了解到了echarts在实现这方面的机制。
echarts绘图/刷新只需要通过setOption
接口即可实现。在各种options中,visualMap视觉映射组件能够根据数据在特定维度上的值,指定对应点的视觉属性(比如颜色、透明度、图元大小等等)。
要用到visualMap特性,需要import相关组件:
截至2021.9,不知道哪天更新了vscode,发现默认的终端从以前的git-bash变成了powershell,笔者用的windows电脑,于是乎要解决这个问题,把powershell变回git-bash。
打开settings,发现以前的terminal.integrated.shell.windows
设置已经失效,不能再用。在settings的图形界面查看shell设置,默认的选项变成了PowerShell
、Command Prompt
和Javascript Debug Terminal
,不能直接指定git-bash路径。
经过一番查找,发现官方文档已经说明可以通过设置terminal.integrated.profiles.windows
的方法,增加一个shell选项,从而达到目的。于是我们可以在settings
里添加一个git-bash
选项:
1 | "terminal.integrated.profiles.windows": { |
然后在shell选项里就能选择git-bash了。试试看吧~
近期在研究寻路功能的测试工作,需要对玩家寻路过程中的行进轨迹进行采样,判断采样点是否在特定的寻路区域内。UE4自带了NavModifierVolume
的actor,可以放置到场景里标识某个区域的寻路成本(不了解寻路相关背景的话可以参考先前的文章),因此我们做采样的时候,也需要判断某个点是否在特定的NavModifierVolume
里。由于自己所负责的游戏是网游,NavModifierVolume
最后导出给服务器用了,实际游戏里获取不到这些actor的数据,因此实际测试时,一方面需要下载服务器上的NavModifierVolume
数据,另一方面还要手写相关的计算方法,来达到我们的工作目的。
NavModifierVolume
是一个空的长方体,可以旋转成任意形式。因此判断玩家寻路采样点是否在特定寻路区域内,也就必须解决这个数学问题——3D空间下判断一个点是否在特定长方体内。
通常而言,这个问题有以下的解法:
在游戏领域,行为树是常用的AI解决方案,用行为树可以快速明了地描述AI的行为模型,而UE4提也供了非常完善的行为树解决方案,不仅有用户友好的界面,而且也有多样化的底层支持。在官网的行为树快速入门指南中,我们可以了解到UE4行为树编辑器的使用以及用蓝图创造行为树节点的方式,而在一些特定的需求当中,蓝图相对于C++并不会非常灵活。因此,笔者稍微研究了下行为树C++层次中的内容,简单分享下行为树里各种节点的C++写法
首先上一张行为树完整图,是基于场景查询系统(EQS)快速入门制作的:
在手游时代,尤其对于大世界游戏而言,寻路的实现基本在专门的寻路服务器上进行。在众多寻路的解决方案中,recastnavigation是最为经典实用的一个,很多游戏甚至游戏引擎都采用类似的实现。recastnavigation项目自带了RecastDemo,用图形化的界面帮助用户认识寻路网格(navmesh)的生成以及寻路的过程。因此,作为初学者的笔者,也决定通过RecastDemo去初步认识寻路的机理奥秘。
首先克隆recastnavigation项目,从文档中可以看到RecastDemo的构建支持Windows、Linux、MacOS三端。从实际测试的效果来看,MacOS可能存在字体无法加载的问题,建议是用Windows跟Linux跑着玩。以Windows为例,首先需要下载premake5以及SDL开发库VC。premake5需要放到PATH
下,而SDL开发库VC解压后需要按照文档描述,放到recastnavigation项目目录的RecastDemo/Contrib
目录下,更名为SDL
。
之后,在RecastDemo
目录下执行premake5 vs2019
,可以在RecastDemo/Build/vs2019
中看到recastnavigation.sln
项目文件。用VS2019打开,构建RecastDemo,就会生成exe在RecastDemo/Bin
目录下。进入这个目录执行RecastDemo.exe
,就能打开工具界面了。
在测试工具的开发过程中,可能会遇到需要生成excel文件的需求。笔者在自研excel-diff工具的过程中,也同样接到了需要生成excel文件来展示每个sheet的diff数据。每个包含diff的sheet需要生成1个excel文件,每个文件分成3个sheet,2个sheet用于展示sheet原先的数据与修改后的数据,1个sheet用于描述性统计和超链接每个diff的情况。要生成这样的excel文件,不用专门的excel库是不行的。基于python的技术栈,经过一番调研,笔者采用openpyxl作为生成excel的库,并且顺利完成了需求。
学习openpyxl可以直接从官方文档入手。一些基本操作如下:
在python开发期间,由于GIL的原因,不能直接采用并行的方式处理代码逻辑。在multiprocessing库的支持下,python程序能够启动子进程执行特定的任务,但子进程的管理也成为了问题。为了简化用户开发成本,python在concurrent.futures下内置了ProcessPoolExecutor这一数据结构,实现了简单的进程管理及任务调度。如果没有特别的需求,开发者只需要用ProcessPoolExecutor即可实现并行执行任务。因此,本文简单对ProcessPoolExecutor的实现进行分析,帮助大家更加了解python开发中进程/任务调度的一种方式。
首先来看ProcessPoolExecutor的用法,可以参考官方文档
可以看到用法非常简单,用户一侧只需要这样操作即可得到任务执行结果:
golang的数据类型转换是困惑新gopher的一大问题之一。相对于python,golang的数据类型转换可要麻烦的多,而且还不走寻常路地诞生了些新的方法跟名词。因此本文讲解golang常见数据类型string、int、rune等数据类型相互之间的转换方法,给大伙儿避坑。
在讲述方法之前,首先非常有必要讲下go源码对这些数据类型的表述: