diary
个人来说,写博客占用学习时间大概是伪命题,因为不写博客可能真的没怎么学习ORZ
简单写一个学习和日常的记录
没更新就说明又摸大鱼去了,基本每周或每两周记录一次,当周报!
2024/1/22
期末大摆!直到寒假!一些要做的
学习一下腾讯的远程课题,ue5一点不会
调研小论文方向的一些最新内容
养生了,直接开睡
2023/12/17
试了用RNN网络做图像分类实验,图像的处理太抽象了调了快一天,最后全靠GPT的帮助才把图像数据成功输入到网络里
下周估计很忙,很多实验课节课,还要准备知识点
2023/11/19
期中基本结束,但任务还是比较多,一点点来完成
这周接触了一下ResNet、GAN、Nerf,基本理解其由来和基本实现原理
准备看一下 games104,会同步更新到博客,学完可能会去看开源引擎的源码,分析其设计和尝试修改,教程的样例引擎Piccolo终于编译过了,最逆天的一集拿MinGW摁编译MSVC的东西
C/C++ 准备多看看代码,了解新特性、编码的 trick 等
进一步了解 AI 相关,未来有点想研究 ...
games104笔记-开篇和渲染
简化的架构
Tool Layer:面向用户,DCC和引擎交互
Function Layer:tick,渲染+逻辑,etc…
Resource Layer:资源格式转换为资产(更高效的内部数据),GUID资产识别,资产生命周期管理(核心)
Core Layer:数学库,更高效的数据结构、容器,内存管理
Platform Layer:RHI(封装不同的图形API,向上提供统一接口)
Function 和 Core 可能有很多交汇
Game World
各种光源、人物角色、像机乃至空气墙、触发器都可以表示成对象Object
各种过于复杂的关系导致继承系统很难表示,引入组件components,可以看一下ECS模式
component-based Tick,相同组件同时tick,更加高效
事件系统,消息机制类似进程信箱通信,需要可扩展消息以支持物体间各种交互事件
场景管理,八叉树、BVH(bounding box)等等
pretick & posttick,多线程下统一时序
引擎中的渲染
可结合games101
一些挑战
场景中的大量物体需要渲染
复杂的底层硬件适配
稳定的帧率
...
games104-动画、物理、粒子系统
动画概览
一些挑战
动作不可预测,如何realtime、如何对适配复杂的环境交互
表情细节
不同部位的动作如何融合
3D动画
DoF:Degree of freedom,自由度,刚体6个自由度,三维中的平移和旋转 3+3
几种实现方式:
早期刚体动画:方块,连接处不自然
顶点动画:可模拟布料、流体
Morph Animation(顶点影响权重,插值):一般用于面部动作
Skinned Animation(蒙皮动画):目前常用
基于物理:布娃娃Ragdoll、布料、流体、反向动力IK,有定点如何自然运动
蒙皮动画
mesh、skeleton(分为Joint、Bone)、刷蒙皮(顶点绑定骨骼)、骨骼动画
骨骼可以拓展至衣服、外饰、面部,武器(可以插在手部joint,插槽的概念),但最好定义好基础骨骼
Root joint,一般在模型最底层的中间位置,方便高度等位置表达
数学基础-旋转
三维空间中的旋转可以通过三个轴的旋转叠加出来,欧拉角,一般用于编辑物体,但是
当顺序不同时结果可能不同
难插值
难用于定轴旋转
四元数!
引入,复平面下的角度叠加可以用复数的相乘表示
群论定义 ...
games104-gameplay和游戏AI
gameplay事件机制
发布订阅模式
核心:
事件定义:可以用面向对象的类定义,但是如何扩展、如何热重载是个很大问题,利用反射写在外部文件?dll注入?
回调函数注册:GO没了咋办,空指针问题,强引用(shared_ptr,有东西没释放对象也不能释放)/ 弱引用(常用一点,对某一时刻查看场景中其他对象可以用如weak_ptr)
消息分发:循环队列事件池,加上多个不同类型的队列架构,大量消息的触发导致帧延迟,如何解决?
脚本系统
游戏逻辑,热更新,编译型语言不行
解释型语言闪亮登场,方便热更新,寄了也是虚拟机寄不影响引擎,非常哇塞
GO管理,利用解释性语言的垃圾回收!,适用于对象特别多的,简单的可以引擎内核直接管理
可视化脚本
blueprint蓝图!低代码平台
基础AI导航Navigation
地图表示
寻路:A*算法:启发式算法,g(n)+f(n)已经走过的距离+估计要走的距离,优先搜索估计最近的点,同时找到目的就结束计算(区分与迪杰斯特拉算法)
路径平滑:Funnel算法,烟囱收缩大法,很强,直接直线走
转向
主要用于车辆寻路
群体模拟
宏观定义:定义一个路线 ...
games104-Lumen
传统功夫
蒙特卡洛积分Monte Carlo Integration,基于采样Sampling
优化:主要对采样的方式进行优化
RSM:光子映射
LPV:分块,光线在块内碰撞
SVOGI:片元变体素
VXGI:上面的优化,clipmap存储数据,近处voxel更细远处更粗
SSGI:屏幕空间,可用于镜面效果等
Lumen
基础:SDF,面片sdf,由于连续函数可微,导数就是法线方向,光线步进算法,阴影计算等都可以大大简化,一般分4层lumen,精度按照与摄像机的距离逐渐降低
核心:在表面附近放置大量probe
Mesh card:每个物体6个面,采样,各种信息(法线、深度等等)
surface cache:4096*4096,存储一系列mesh card
docker
docker官方一个很好的入门教程Overview of the get started guide | Docker Docs
Overview
A container is a sandboxed process running on a host machine that is isolated from all other processes running on that host machine. That isolation leverages kernel namespaces and cgroups.
如果对OS熟悉的话,可以类比成一个从镜像文件构建的文件系统(多了隔离性)
Core
核心只有 container 和 image
简单来说,容器是镜像的一个实例,修改容器再把内容全部写入镜像,就像一个U盘,不管放到哪台电脑一插即用
就ubuntu镜像来说,可以理解为把其iso文件pull下来运行,你可以在ubuntu容器里各种操作,退出时把数据写入iso文件(对于应用源文件来说)
所谓的用户数据容器是只在临时空间存储的,如果直接放入image中会产生严重的安全问题(普 ...
cmake
cmake的小记录,最近在Linux上整活,正好学一下
暂时不涉及库文件的生成
文件树
123456# 项目标准文件树.├── CMakeLists.txt├── include├── linux.sh└── src
12345678# cmake后的文件树,可执行文件在bin中,构建在build中.├── CMakeLists.txt├── bin├── build├── include├── linux.sh└── src
CMakeLists.txt
CMakeLists感觉CMakeLists放最顶层方便一点,当然模块化的话就通过add_subdirectory递归地构建,基本满足目前的99%需要
12345678910111213141516171819202122232425262728293031cmake_minimum_required(VERSION 3.15)# set the project nameproject(test-cmake)# bin file output# you can also set others set(EXECUTABLE_O ...
WSL2+miniconda+Jupyter notebook
WSL2+miniconda+Jupyter notebookwin11下构建的开发环境,顺便熟悉一下Linux下的开发
cuda、cuDNN可以直接在win下处理,会直接集成到WSL2,可用nvidia-smi查看相关信息
WSL2安装
安装 WSL | Microsoft Learn
minicond安装
Miniconda — miniconda 文档
conda包含了包管理和环境管理,很方便
1234567# 免不了 conda 换源conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forgeconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --a ...
Linux拾遗
回顾了以前学的内容,纯纯的只学命令而没有真的在linux下整过什么东西,恶补有关内容,真正拥抱这个社区
最近重新把 win+wsl2 拿起来,发现 nvidia 的 cuda 在 win 下安装后通过某种方式直接集成到wsl中了,vscode也接入了wsl,准备日后学习和工作迁移到linux上
拾遗GNU计划
GNU - 维基百科
名称是GNU’s Not Unix!的缩写
Linux操作系统包涵了Linux内核与其他自由软件项目中的GNU组件和软件,可以被称为GNU/Linux
其内容软件完全以GPL方式发布
POSIX标准
可移植操作系统接口(Portable Operating System Interface of UNIX)
定义了应用程序和操作系统之间的接口,以及命令行shell和程序接口,以实现软件的可移植性
常见的Linux, BSD, macOS, iOS, Android等操作系统均遵循POSIX
开源许可证
宽松式:BSD、MIT、Apache2
Copyleft:GPL(传染性)、LGPL、AGPL、Mozilla(MPL)
选择时可以看那张经典的 ...
MNIST-about convolution
Convolution Neural NetworkDigit Recognizer | Kaggle
最近基本补完了卷积的相关知识,拿 MNIST 来实践巩固一下,torch封装的确实好,定义完网络基本就是调参,对外屏蔽了太多的细节,但对于开发者来说就可以把精力花在对具体问题的分析和解决上(努力达到这个目标!)
准备以这个实验为例子,仔细记录和分析一下CNN重点知识&代码相关的内容
在参考的时候还看到有纯数学实现的CNN网络,太逆天了
同样使用 pytorch 构建 CNN,score 为 0.99035
可以通过数据增强等方法进一步提升模型精度
Notebook基本的一些库,包括torch, numpy, pandas, matplotlib, sklearn,都是必须的库
有用到TensorDataset, DataLoader,进一步标准化训练流程,也是为了防止显存溢出(最后预测的代码段如果不分batch,会报显存 out of memory)
最后,device判断 GPU 是否可用,使用 Kaggle 平台的 GPU P100,有卷积层的情况下,CPU 和 GP ...