自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(112)
  • 资源 (1)
  • 收藏
  • 关注

转载 UE4 LLM工具

UE4 LLM工具LLM(Low Level Memory Tracker) 是从 4.18 开始引入的新的内存统计工具,比memreport 统计数据更加详细精确,但又不会像 MallocProfiler 那样有很大的本身开销通过LLM,可以知道游戏消耗的内存分别来自引擎的哪些模块,让开发者可以对内存占用高的模块进行有针对性优化。Debug、Development包才会启用ENABLE_LOW_LEVEL_MEM_TRACKER宏,统计逻辑才会编译进可执行二进制中,才能使用LLM相关的功能

2021-12-30 00:07:15 1199

转载 中文字符编码

程序开发常见的ASCII、GB2312、GBK、GB18030、UTF8、ANSI、Latin1中文编码到底有何不同?如果你在业务中也曾经被乱码搞晕过,不妨一起探究一下。一、字符编码要做什么事情?在计算机眼里读到的所有文字都是由0和1组成的字符串,为了能让汉字正常显示在屏幕上,我们需要做以下两件事情:1、给所有的汉字一个独一无二的数字编号,做一个数字编号到汉字的mapping关系(即字符集)2、把这个数字编号能用0和1表示出来这里需要说明的是,第2件事情并不是直接把数字编号用二进制表示

2021-03-25 13:38:53 1195

转载 骨骼蒙皮动画(二)

转载:http://blog.csdn.net/ccx1234/article/details/6641944骨骼蒙皮动画(Skinned Mesh)的原理解析(一)一)3D模型动画基本原理和分类3D模型动画的基本原理是让模型中各顶点的位置随时间变化。主要种类有Morph动画,关节动画和骨骼蒙皮动画(Skinned Mesh)。从动画数据的角度来说,三者一般都采用关键帧技术,即只给出关键帧的数据,其他帧的数据使用插值得到。但由于这三种技术的不同,关键帧的数据 是不一样的。M...

2021-02-25 12:14:13 551

转载 骨骼蒙皮动画(一)

本文转载自:https://www.cnblogs.com/tandier/p/10087656.html,感谢博主分享骨骼动画介绍一 、骨架骨架由一系列具有层次关系的关节(骨骼)和关节链组成,是一种树结构,选择其中一个是根关节,其它关节是根关节的子孙,可以通过平移和旋转根关节移动并确定整个骨架在世界空间中的位置和方向。父关节运动能影响子关节运动,但子关节运动对父关节不产生影响,因此,平移或旋转父关节时,也会同时平移或旋转其所有子关节。二、骨骼的表示通常会将关节进行编号0∼N−10∼N−

2021-02-24 00:28:02 881

转载 碰撞检测之分离轴定理算法

本文转载自https://blog.csdn.net/yorhomwang/article/details/54869018,感谢博主分享本文翻译自@sevenson的文章Separating Axis Theorem (SAT) Explanation。原文作者用的是ActionScript 3来编写算法,不过文中主要讲述的还是算法原理,我想一旦算法原理被我们掌握了,选择什么编程语言来实现算法都是次要的事情了。本人并非英文专业,所以文中翻译得有不妥或疏漏之处,欢迎各位指正,谢谢!正文如下:..

2021-02-22 13:14:23 611

转载 贝塞尔曲线

https://www.jianshu.com/p/8f82db9556d2

2021-02-01 19:03:54 103

转载 UE4 的 kDopTree

UE4中的 kDopTree 是使用二叉树对空间中的三角形进行划分,并使用Ray-Slab Intersection进行线段和包围盒碰撞检测,最终对线段和包围盒中的三角形进行相交检测。其目的是为了加快离线生成SDF的速度。下面会对这个算法的细节进行说明和总结。以下分析是基于UE4 的 14.15版本。构建 kDopTree在三维空间中使用一维的方式进行构建,也就是说只考虑其中的一根轴(x轴 或 y轴 或 z轴),那么挑选哪根轴呢?首先计算所有三角形的几何中心的平均数,得到的值就可以近...

2021-01-28 19:36:55 655

原创 二叉树的遍历数据

剑指 Offer 33. 二叉搜索树的后序遍历序列题意:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。思想:1. 根据二叉搜索树的性质:根节点的大于左子树的所有节点,小于右子树的所有节点2. 后序遍历的数组特点:根节点的左子树和右子树都在根节点之前,左子树在右子树的节点之前,根节点在最后根据以上两个性质,对于每个搜索树而言,后续遍历的数组结构满足前面的一段大于根节点,后段满足小于根节..

2020-12-31 16:46:20 103

原创 最小栈与最大队列

剑指 Offer 30. 包含min函数的栈题意:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。要求:得到最小值元素的min时间复杂度要求为O(1)思想:利用额外的栈来记录当前的最小值,如果当前push的元素比当前helper栈中的元素小或等于将其push到helper栈中(注意对于等于的处理,因为要在出栈的时候做出栈使用)实现:class MinStack {private:

2020-12-30 11:08:50 134

转载 Ambient Cubemap 环境立方体贴图

Ambient Cubemap 环境立方体贴图用处 在标准光照模型(Blinn-Phong模型)中,进入摄像机的光线分为4种,自发光、高光反射、漫反射、环境光。其中环境光适用于描述物体所收到的间接光照的。而Ambient Cubemap用于高质量光照环境的立方体贴图。 实现方式 其实就是对物体的六个方向拍照,得到一个cubemap,然后根据不同的光泽度,生成不同模糊程度的图片保存在不同mipmap中,然后根据物体的粗糙度、法线等因素,在shader中针对cubemap编写算法,然后将计算出来的结果

2020-12-24 00:27:53 1047 1

原创 C++2.0——多线程的使用之condition_variable

<condition_variable > 头文件主要包含了与条件变量相关的类和函数,如下: condition_variable (C++11) condition_variable_any (C++11) notify_all_at_thread_exit (C++11) cv_status (C++11) std::condition_variablecondition_v

2020-10-27 00:11:23 302

原创 C++2.0——多线程的使用async与future

std::asyncasync是一种利用现成的硬件并发来运行自包含异步任务的简单途径;对于async的调用返回一个包含任务结果的future;取决于启动的策略,该任务可以异步的运行在它自己的线程上,也可以同步第运行于任何在此future调用的wait或者get成员的线程上。template<classFunction,class...Args>std::future<std::result_of_t<std::decay_t<Function>(std...

2020-10-25 23:37:04 411

原创 C++2.0——多线程的使用 promise 和 packaged_task

<future> 头文件中包含了以下几个类和函数: promise (C++11) future (C++11) shared_future (C++11) packaged_task (C++11) async (C++11)

2020-10-25 20:01:24 209

原创 C++ 2.0——多线程的使用之lock_guard 与 unique_lock

C++标准为我们提供了以下基本的锁类型lock_guard(C++11) unique_lock(C++11) shared_lock(C++14) scoped_lock(C++17)以及还提供了几个与锁类型相关的 Tag 类:defer_lock_t不获得互斥的所有权 try_to_lock_t尝试获得互斥的所有权而不阻塞 adopt_lock_t假设调用方线程已拥有互斥的所有权struct defer_lock_t { }; /// Try to acquire...

2020-10-24 19:42:15 561

原创 数据结构与算法——希尔排序与归并排序

希尔排序希尔排序(shell sort),对插入算法进行了有效的改进,是一种递减增量的排序算法。希尔排序算法是不稳定的,他是是基于插入排序提出改进方法的: 插入排序在对已经排好序的数据操作时,效率高,即可以达到线性排序的效率 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。演示:描述:选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1; 按增量序列个数k,对序列进行k 趟排序; 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分

2020-10-23 22:50:14 445

原创 C++2.0 —— 多线程的使用之std::mutex

std::mutex 是C++11 中最基本的互斥量,std::mutex 对象提供了独占所有权的特性——即不支持递归地对 std::mutex 对象上锁,而 std::recursive_lock 则可以递归地对互斥量对象上锁。Mutex 分类std::mutex,最基本的 Mutex 类。 std::recursive_mutex,递归 Mutex 类。 std::time_mutex,定时 Mutex 类。 std::recursive_timed_mutex,定时递归 Mutex 类。

2020-10-23 00:27:18 882

原创 C++2.0 —— 多线程的使用之std::thread

基本概念线程状态:在一个线程的生存期内,可以在多种状态之间转换,不同的操作系统可以实现不同的线程模型,定义许多不同的线程状态,每个状态还可以包含多个子状态,但大体来说,如下几种状态是通用的:就绪:参与调度,等待被执行,一旦被调度选中,立即开始执行 运行:占用CPU,正在运行中 休眠:暂不参与调度,等待特定事件发生 中止:已经运行完毕,等待回收线程资源线程环境:线程存在于进程之中,进程内所有全局资源对于内部每个线程都是可见的。进程内典型全局资源如下:代码区:这意味着当前进程空间内所

2020-10-22 23:10:16 1698

原创 数据结构与算法——冒泡排序,选择排序和插入排序

冒泡排序冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。演示:描述:比较相邻的元素。如果第一个比第二个大,就交换它们两个; 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数; 针对所有的元素重复以上的步骤,除了最后一个; 重复步骤1~.

2020-10-22 15:09:20 214

原创 C++2.0—— 右值引用(Rvalue_reference)的使用

左值和右值左值(lvalue):表达式结束后依然存在的对象,也叫做变量; 右值(rvalue):右值标识是临时性对象的表达式,这类对象没有指定的变量名,都是临时生成的。引用一个引用是它所引用对象的同义词,是其另一个变量名。#include <iostream>using namespace std;int main() { int i = 10;//i:左值 10:右值 int& j = i;//j: 左值引用 j = 100; cout &l

2020-10-11 21:10:57 326

原创 C++2.0——lambda、 override和final的介绍

LambdaISO C++ 11 标准的一大亮点是引入Lambda表达式,Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。基本语法如下: [capturelist](parameterlist)mutable->...

2020-10-11 17:58:58 196

原创 C++2.0—— =default,=delete、using、noexcept的介绍

=default在C++中,当我们设计与编写一个类时,若不显著申明,则类会默认为我们提供如下几个函数:构造函数 析构函数 拷贝构造函数 拷贝赋值函数 移动构造函数(C++2.0) 移动赋值函数 (C++2.0)C++11允许添加“=default”说明符到函数声明的末尾,以将该函数声明为显示默认构造函数;这就使得编译器为显示默认函数生成了默认实现,它比手动编程函数更加有效;当我们声明一个有参构造函数时,编译器就不会创建默认构造函数。在这种情况下,我们可以使用default说明符来创建默.

2020-10-11 16:25:13 1583

原创 C++2.0—— 一致性初始化(uniform initialization) 与 Initializer_list

Initializer_list一致性初始化(uniform initialization)C++11引入了“一致性初始化”概念,意思是面对任何初始化动作,可使用相同语法 {},进行一致性的初始化。

2020-10-11 00:14:56 287

原创 C++2.0——explicit、decltype、nullptr、auto 和 for循环

explict在 c++2.0之前,一个参数的构造函数(或者除了第一个参数之外其余参数都有默认值的多参构造函数),承担着两个作用:1. 构造器2. 隐含的类型转换操作符;而explicit关键字一直存在,只能作用在构造函数中, 目的是阻止编译器进行不应该允许的构造函数进行隐式转换。而在C++2.0中,explicit可以支持不止一个参数的构造函数使用。decltypeautonullptr...

2020-10-10 23:01:38 259

原创 C++2.0——语言新特性之Variadic Templates

variadic template 特性本身是一个很自然的需求,它完善了 C++ 的模板设计手段。原来的模板参数可以使类和函数的参数类型“任意化”,如果再加上“参数个数的任意化”,那么在参数方面的设计手段就基本上齐备了,有了variadic template 显然可以让设计出来的函数或是类有更大的复用性。因为有很多处理都是与“处理对象的个数”关系不大的,比如说打屏(printf),比如说比较大小(max,min),比如函数绑定子(bind,function要对应各种可能的函数就要能“任意”参数个数和类型)。

2020-10-09 23:56:49 222

原创 C++进阶——内存管理(三)

在VC和BorlandC5.0编译器标准库内部实现中,容器的std::allocater都是通过::operator new/delete来完成的,其本质就是直接调用malloc 和 free其他什么都没有做。而GNU2.9 C++中使用的版本是std::alloc——使用了诸如pool等高级的分配逻辑,在经过更新迭代后在GNU4.9中改名为__gnu_cxx::__pool_alloc!GNU2.9中std::alloc的实现考虑到小型内存所可能造成的内存破损问题,SGI设计了双层级配置器,第..

2020-09-27 00:44:05 322

原创 C++进阶——内存管理(二)

C++ memory primitives分配 释放 类型 可否重载 malloc free C函数 不可 new delete C++表达式 不可 ::operator new ::operator delete C++函数 可 allocator<T>::allocate allocator<int>::deallocate C++标准库 可自由设计并以之搭配任何容器

2020-09-25 00:27:46 433

转载 C++进阶——内存管理(一)

[导语]内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能。本期专题将从内存管理、内存泄漏、内存回收这三个方面来探讨C++内存管理问题。1.

2020-09-18 00:09:18 369

转载 Android开发——内存管理及内存泄漏分析

1、堆和栈要了解Android的内存,必须先从Java的堆和栈看起,我们先看看《Think In Java》中对它们的定义:(1)堆栈(stack):位于通用RAM中,但通过它的“堆栈指针”可以从处理器哪里获得支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时候,JAVA编译器必须知道存储在堆栈内所有数据的确切大小和生命周期,因为它必须生成相应的代码,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些JAVA数据

2020-09-17 18:31:52 331

转载 Android开发——Cmakelist的使用

一、背景:Cmakelist的使用项目创建好以后我们可以看到和普通Android项目有以下4个不同。main 下面增加了 cpp 目录,即放置 c/c++ 代码的地方 module-level 的 build.gradle 有修改 增加了 CMakeLists.txt 文件 多了一个 .externalNativeBuild 目录image.png二、正文第一章:CMakeLists.txt 文件 讲解2.1 一个基本的Cmakelist文件cmake_minimum.

2020-09-17 12:02:53 4069 1

原创 C++设计模式——结构型模式之代理模式(Proxy)

代理模式(Proxy):是一种程序设计最为重要的一种模式,其具体的使用非常广泛,根据它的作用,其实我们可以直接理解为中间件或者中间层,比如各类软件的中间件,软件与硬件中的中间层。Subject: 声明真实对象和代理对象的共同接口。Proxy: 代理对象与真实对象实现相同的接口,所以它能够在任何时刻都能够代理真实对象。代理角色内部包含有对真实对象的引用,所以她可以操作真实对象,同时也可以附加其他的操作,相当于对真实对象进行封装。RealSubject: 它代表着真实对象,是最终实现功能的具体对

2020-09-15 18:43:55 234

原创 C++基础——STL常见问题总结

1. STL由哪些组件组成容器(Containers):各种数据结构,如:vector、list、deque、set、map。用来存放数据。从实现的角度来看,STL容器是一种class template。 算法(algorithms):各种常用算法,如:sort、search、copy、erase。从实现的角度来看,STL算法是一种 function template 迭代器(iterators):容器与算法之间的胶合剂,是所谓的“泛型指针”。共有五种类型,以及其他衍生变化。从实现的角度来看,迭代器

2020-09-13 18:34:33 788

原创 C++设计模式——结构型模式之组合模式(Composite)

组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。组合模式为了描述分支包含关系,也就是我们说的树形关系,其对象分为枝和叶,每一枝可包含枝和叶,直到全部为叶节点。我们对枝和叶进行行为抽象,可认为枝和叶都是Component,而叶是最小的操作单元,其下不存在枝和叶,而枝作为Composite里面存有其下枝和叶的组件列表。上述的结构图中关于叶对节点的操作方法只保留了Operator的功能,其他的如add、remove、ge

2020-09-12 00:00:04 125

原创 C++设计模式——结构型模式之桥接模式(Brige)

桥接模式(Brige):将抽象部分和它的实现部分分离,使它们都可以独立的变化。当一个抽象可能有多个实现时,通常用继承来协调它们;抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现。但有时候此方法不够灵活,因为继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立的进行修改、扩充和重用;桥接模式把依赖具体实现,提升为依赖抽象,来完成对象和变化因素之间的低耦合,提高系统的可维护性和扩展性。桥接模式的主要目的是将一个对象的变化与其它变化隔离开,让彼此之间的耦合度最低。Ab

2020-09-11 23:37:15 506

原创 C++设计模式——结构型模式之装饰器模式(Decorator)

装饰器模式(Decorator)是动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活;装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象添加功能。Component:定义一个对象的对外接口,将通过这个接口来实现对象动态地添加职责; ConcreteComponent:定义一个具体的Component,继承自ConcreateComponent,重写了Component类的虚函数; Decorator:维持一个指向Component对象的指针,该指针指向需要

2020-09-11 23:00:38 218

原创 C++进阶——STL源码之unordered_set与unordered_multiset

STL源码之unordered_set与unordered_multisetstd::set 是关联容器,含有 Key 类型对象的已排序集。用比较函数 Compare 进行排序。搜索、移除和插入拥有对数复杂度。 set 通常以红黑树实现,红黑树具有自动排序的功能,因此set内部所有的数据,在任何时候,都是有序的。std::unordered_set 是含有 Key 类型唯一对象集合的关联容器,依赖于哈希表。搜索、插入和移除拥有平均常数时间复杂度。在内部,元素并不以任何特别顺序排序,而是组织进桶中,元

2020-09-11 00:09:31 688

原创 C++设计模式——结构型模式之适配器模式(Adapter)

结构型模式之适配器模式(Adapter)适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。使原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适配器模式有“类适配器”和“对象适配器”两种不同的形式。上图是适配器模式的第一种实现形式,适配器Adapter继承自Target和Adaptee类,Adapter类需要重写Target类的Request函数,在Request中做适当的处理,调用Adaptee类的SepcificRequest。最终,Target...

2020-09-10 19:34:12 144

原创 C++进阶——STL源码之unordered_map、unordered_multimap

STL源码之unordered_map、unordered_multimapSTL中几种map的区别map  内部数据的组织,基于红黑树实现,红黑树具有自动排序的功能,因此map内部所有的数据,在任何时候,都是有序的。hash_map  基于哈希表,数据插入和查找的时间复杂度很低,几乎是常数时间,而代价是消耗比较多的内存。底层实现上,使用一个下标范围比较大的数组来存储元素,形成很多的桶,利用hash函数对key进行映射到不同区域进行保存。插入操作:得到key -> 通过hash

2020-09-10 00:28:10 1593

原创 Android开发——Activity的生命周期与启动模式

Activity的生命周期onCreate:Activity正在被创建,可以进行一些初始化工作:setContentView加载界面布局等onRestart:Activity正在被重新启动,正常情况下从不可见变为可见状态时,onRestart会被调用onStart:Activity正在被启动,但是当前不可见;无法与用户进行交互onResume:Activity已经可见,并出现在前台活动onPause:Activity正在停止,正常情况下会接着执行stop,不可做太耗时的操作onSto

2020-09-08 00:15:37 360

原创 Android开发——BLE蓝牙开发入门

BLE蓝牙开发入门蓝牙低能耗(Bluetooth Low Energy,或称Bluetooth LE、BLE,旧商标Bluetooth Smart)也称低功耗蓝牙,是蓝牙技术联盟设计和销售的一种个人局域网技术,旨在用于医疗保健、运动健身、信标、安防、家庭娱乐等领域的新兴应用。相较经典蓝牙,低功耗蓝牙旨在保持同等通信范围的同时显著降低功耗和成本。Android BLE 的特点是低功耗,其峰值功耗为传统蓝牙的一半,传输距离提升到100米左右,最短可在3ms内完成连接并开始数据的传输,缺点是传输的数据量较

2020-09-08 00:14:40 838

原创 C++进阶——STL源码之hashtable

STL源码之hashtablehashtable 是一种在插入、删除、搜寻等操作上也具有 “常数平均时间”(散列表)的数据结构,而且这种表现是以统计为基础,不需依赖输入元素的随机性。STL中hashtable是实现hash_map和hash_set的底层。它解决冲突的方式是开链法,每个放置索引值的节点称为桶节点(也就是该索引值的头结点),桶节点里放着一个value值,一个指向下一个节点的next指针。 维护了一个vector<node *> buckets存放所有桶节点,...

2020-09-04 23:53:21 1039

3D数学基础 图形与游戏开发

3D数学基础 图形与游戏开发,3D数学基础 图形与游戏开发,3D数学基础 图形与游戏开发

2016-02-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除