自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(57)
  • 收藏
  • 关注

原创 UE5引擎源码小记 —反射信息注册过程

最近看了看反射相关的知识,用不说一点人话的方式来说,反射是程序在运行中能够动态获取修改或调用自身属性的东西。一开始我是觉得反射用处好像不大,后续查了下一些反射的使用环境,发现我格局小了,我觉得用处不大的原因是我从c++的角度来考虑使用反射,在c++中确实用处不大,但是捏,把格局打开,要从更上一层的视角来看反射,不要局限于c++,比如我们要使用c++以外的东西调用c++,比如配置文件,蓝图,python,lua这些去调c++,或是设计到编辑器功能的时候,这时候反射就是极为好用方便的一个特性。

2023-07-27 16:23:52 566

原创 UE5源码小记— Delegate(委托)

花了三天时间简单看了看ue5种委托功能的源码,很有收获,很多地方写的很巧妙。在看源码之前有几个点需要重点关注,比如内存布局,类型擦除,函数签名转换。

2023-06-29 11:25:44 958

原创 UE5引擎源码小记 — UWorld::Tick

好长好长,要看到寄啦,摸了,这里了解个大概概念,结合看其他东西在回头看这里吧。

2023-06-29 11:24:10 738

原创 UE5引擎源码小记 -- UGameEngine::Tick

本人是第一次接触UE萌新,本文只是在阅读源码之时的一些记录和推测,并不能保证内容是正确的。所以如果有错误的地方,请多多包涵。在看UE代码之前我觉得至少要掌握UE引擎如何将游戏世界如何进行抽象化。也就是要了解UE是如果构成游戏世界的,我推荐可以看看InsideUE4系列。

2023-03-20 10:51:03 796

原创 UE5 关闭编辑器后C++类从内容浏览器中消失

在ue5中新建c++类,然后拖入场景中,编译后关闭UE编辑器,再打开时候发现新建的c++类消失不见了,场景中对应的actor也不见了。目前解决办法就是:在打开ue前,先用vs打开ue项目,切换版本到DevelopMent Editer再编译一遍,再打开UE编辑器。

2023-03-20 10:47:37 1941

原创 字符编码中空码处理

字符集处理

2022-08-24 10:16:41 195

原创 远程Linux开发个人环境记录

linux远程开发

2022-08-24 10:15:24 114

原创 STL源码阅读小记(六)——Any

stl中any实现

2022-08-24 10:14:25 210

原创 STL源码阅读小记(五)——Shared_ptr

前言感觉好久没看stl了,中间跑去看图形学入门了,图形学是真的有趣,但是也是真难,不过接着补坑,把unique_ptr的好兄弟shared_ptr也看了。STL版本本文所使用的stl版本为libc++ 13.0,属于LLVM项目。LLVM项目Github如果遇到不熟悉的宏定义可以参考文档Symbol Visibility MacrosShared_ptr应该算是c++中的老熟人,应该绝大部分人应该使用过,或者在面试中见过它,对它的引用计数器印象深刻吧。这次我们看看stl的源码中shared_p

2022-04-21 14:58:22 984

原创 STL源码阅读小记(四)——Unique_ptr

前言继续看stl中常用东西的源码,打算把智能指针的坑给填了,这次先写点unique_prt,下次写shared_ptr。unique_prt的代码总体而言比较简单,唯一稍微复杂的地方就是对自定义析构函数的萃取。STL版本本文所使用的stl版本为libc++ 13.0,属于LLVM项目。LLVM项目Github如果遇到不熟悉的宏定义可以参考文档Symbol Visibility MacrosUnique_ptr依照惯例,来看一下定义的模板参数和一些typedef。template <cl

2022-02-22 11:05:31 883

原创 OpenGL实现三角形旋转

最近在看图形学编程,有点比较简单习题是实现一个二维的三角形旋转//main.cpp//#include<GL/glew.h>#include<GLFW/glfw3.h>#include<iostream>#include<string>#include"Utils.h"#include<glm/gtx/string_cast.hpp>#include<vector>using namespace std;using

2022-02-15 15:34:06 1041

原创 c++中enable_if和void_t的妙用

std::enable_ifstd::enable_if在c++中是个好工具,利用SFINAE对不同类型进行不同处理。个人总结一下,std::enable_if有四种使用方式,分为返回值,参数,类型模板参数,非类型模板参数,对于后两种需要c++11以上的版本才支持。举个例子,比如我需要输出一个数字,模板类型T需要为一个数字类型,我们来看看四种用法。返回值template<class T>typename std::enable_if<std::is_integral<T&

2022-02-15 15:32:51 913 1

原创 STL源码阅读小记(三)——Function

前言这几天简单的看了下list,deque发现基本实现和stl源码刨析中基本类似,由于stl是个大块头,就打算选择性的看把,一些像queue,stack这样的适配器也粗略瞄一眼,就不细看了。刚好最近使用funtion比较频繁,所以这次来看下function的实现。STL版本本文所使用的stl版本为libc++ 13.0,属于LLVM项目。LLVM项目Github如果遇到不熟悉的宏定义可以参考文档Symbol Visibility Macrosfunction先看看function的定义,由于f

2021-12-24 14:56:44 520

原创 C++中labmda效率问题

最近使用lambda进行替换原有逻辑,不经想到使用lambda与直接写逻辑究竟有什么区别。当然在不开优化下lambda会变成匿名函数,但是在开了O2优化的情况是否还是一样呢?是否lambda也是会进行内联。本文各种汇编代码皆是在开启O2优化的情况下生成,使用的是VS2019。最简单的labmda首先我我们先看一下最简单lambda。// main.cppint main(){ using namespace std; auto testf = []() { for (int i = 0

2021-12-15 10:39:08 1425

原创 STL源码阅读小记(二)——Vector

前言最近事情都完成差不多了,看看vecotr实现吧。vector算是stl中很常见的容器了,可能很多人学完c++语法,接触stl就是从vector开始的。vector的数据结构就不细细说明了,相信大家对数组这数据结构绝对都懂。另外看了标准库才明白要达到Standard Template实际上是很复杂的一件事。一些非常见的函数就只看看声明吧,以及一些类型萃取就不展示了,要完整的展示出来实在太太长了。一份vector<T>加上vector<bool>的源码大概在4000行左右。博客

2021-12-15 10:38:32 820

原创 STL源码阅读小记(一)——Allocator

Allocator前言STL版本AllocatorAllocator本体allocate函数deallocate函数construct函数与destroy函数小结个人博客备份前言最近开始阅读stl源码刨析一书,但是总觉得光看书是否有的不妥,便想着拉一份libc++的源码来看看现在的stl源码。大致想看完stl源码刨析中的内容,在看看C++11之后的一些内容是怎么实现的。不过开始阅读就遇到挺多困难,查手册能解决一大部分,还有一些为了性能而做的优化因为c++水平不足,就不一定能看的出来。总而言之这算是我自

2021-11-26 09:52:59 594

原创 c++利用模板实现抽象工程模式与原型模式

#pragma once#include<string>#include<map>template<class AbstractProduct>class AbstractRegister {public: AbstractRegister() = default; virtual AbstractProduct* createProduct() = 0;};template<class AbstractProduct>class Fact

2021-08-27 11:37:05 359

原创 c++实现懒汉单例模式

最近在看设计模式,单例模式是较为简单的一种设计模式,在c++11之后,标准保证局部静态成员变量在初始化时候的线程安全,这样就可以很容易的写出简洁的单例模式。不需要手动的做一个原子操作。我自己实现如下:#Singleton.h#pragma once#include<memory>template<class T>class Singleton {public: Singleton() = delete; Singleton(Singleton&) = del

2021-08-26 15:00:31 302

原创 浅谈MMORPG服务器架构

前言本篇文章虽然是谈谈MMO服务器架构,但可能只是我个人的碎碎念把,这是算我进入公司两个月以来的一个回顾与总结吧。先说下项目把,我们项目是一个十多年历史的老MMO端游,存在这架构老旧,代码臃肿等一系列问题,不过把因为历史原因而没有设计好的地方剔除来看,这个项目还许多值得学习的地方。不过做为一个新手游戏程序员能够接触到较为复杂的MMO服务器,我认为是比较幸运的。不过有失必有得,我们项目上线多年,很多东西是已经开发好,相对从0开始开发项目,会缺少一些从设计到实现的经验。游戏服务器特点因为游戏服务器并没有

2021-08-17 11:01:33 1385 1

原创 c++模板线程池解读

前言本篇文章是我个人在阅读一个模板线程池适合遇到的困惑,了解c++11一些特性后总算是能看懂了,虽然C++11新特性不难,但是结合模板用起来会比较蒙的。线程池代码线程池代码来自github上,链接在这里#ifndef THREAD_POOL_H#define THREAD_POOL_H#include <vector>#include <queue>#include <memory>#include <thread>#include &l

2021-08-11 17:04:24 350

原创 VS C++编译C2146和C4430错误

遇到的坑记一下如果你遇到了这样的错误:error C2146: syntax error : missing ‘;’ before identifiererror C4430: missing type specifier - int assumed.一条C2146错误跟着一条或多头C4430错误,可以考虑检查一下是否头文件互相包含。如-----AFile A.h-------#include"A.h"--------------------------BFile B.h-------

2021-08-10 17:21:35 1066

原创 C++构造函数使用初始化列表的坑

C++构造函数相信许多小伙伴一定使用C++中的构造函数。但是最近在看深度探索C++对象模型的时候发现了一个重要的坑点,就是使用初始化列表初始构造函数时是按照类内成员声明顺序构造的。如已下代码:#include<iostream>class A{public: int first = 0; int second = 0; A(int x):second(x),first(second){};};int main(){ A a(4); std:

2021-07-13 10:03:41 238

原创 在C++中嵌入lua

在C++中使用lua在C++中使用lua就和在C一样,头文件加入extern “多线程与lua虚拟机参考

2021-03-11 18:45:23 708

原创 游戏服务端实习小结

实习基本情况项目使用框架项目使用了skynet作为底层架构,上层使用lua进行编写。传输协议使用protobuf。架构设计游戏同步帧同步状态同步接口对接总结与感想

2021-01-14 11:30:02 323

原创 protobuf 中int32超过127后数据变超大

protobuf 中int32超过127后数据变超大环境:客户端 :unity c#服务端:skynet lua先说结论:unity中Encoding.UTF8.GetString() 对包含protobuf的byte[]转换出现了问题。建议直接使用byte[],而不要将byte转换为string,如果需要分割byte[],可以自己实现个分割函数。首先发现这个问题是因为摇杆操作无法同步,我们的游戏是一个手机游戏,使用帧同步进行多人游戏,测试时候发现摇杆一但拖动,protobuf的decode模

2020-12-31 10:19:19 1099 2

原创 Lua导表工具

在公司写了个小工具练手,主要功能是把excel表转化为程序使用表。可以从xml转换为lua,json,txt,三种方式。这样的工具即方便了策划也方便了程序。使用方法为 lua main.lua mode srcDir dstDirmode == ’Server’ | ‘Client'例如要导出客户端表lua main.lua Client srcDir dstDir会根据srcDir下的rule.xml表自动进行导表,导出的会放在dstDirrule.xml表如图,File为文件名,Type为ex

2020-12-03 11:26:21 733

原创 lua中实现类

要求:模仿C++类的行为实现 a = A()类的复制实现深拷贝实现构造函数只考虑单继承,多继承实现在lua程序设计中有提及,但是个人认为在lua中使用多继承会不会不太合适。local function class(...) --只考虑单继承 local tmpClass = { classType = 'class', _ctor = function () end } local mt = {} for key, value

2020-11-17 17:31:43 132

原创 lua中实现table的打印

刚学lua不久,导师布置的一个作业,实现一个能处理table的print--[[ evn:Lua 5.1]]function prettystring(...) for key, value in pairs({...}) do prettyOneString(value) endendfunction prettyOneString(data,onlyTable,tab) --data处理的数据,onlyTable记录表,tab为tab数量 printT

2020-11-06 14:03:58 745

原创 简易静态web服务器

tiny_http_server项目地址:https://github.com/hangxin001/tiny_http_server默认目录为二进制文件下的./www特性:Reactor模型基于epoll的多路复用支持Get,Post,Head三种请求方法,同时支持浏览缓存(IMS头)可自动增长的缓冲区基于priority_queue与shared_prt的应用层定时器ClassEpoll:封装epollThread Pool:轻量线程池Http Server:管理线程池,定

2020-10-13 20:40:03 151

原创 C++ std::string不再使用COW实现的原因分析

引言这个问题是在个人处理HTTP响应头的时候突然冒出来的。因为我需要分割以CRLF结尾的各个参数,函数声明是这样的std::string retrieveUntilCRLFAsString(const char*)。每一次都要分割为std::string类型,都有一次拷贝的资源消耗,但这个资源开销有多大呢?这让我对string的性能产生了好奇。std::string实现方式COWCOW,也就是写时拷贝,是一种编译器级别上的优化手段,目的是为了减少一些无意义的深拷贝开销。据我了解,在g++4.5版本

2020-10-06 03:35:18 645

原创 一个基于优先队列的C++定时器

定时器定时器的实现方式有多种,底层实现有双向链表,最小堆实现以及时间轮。本文以基于最小堆实现一个简单的定时器。使用了C++ 11中实现了priority_queue模板,虽然名字中带有queue,但是实现方式是堆,名字中带有queue,只是因为使用queue的接口。Chrono库具体实现...

2020-09-17 13:51:34 1121 2

原创 C++简单线程池的实现

线程池基础知识C++ 11特性实现

2020-09-08 22:42:06 164

原创 vs2019 linux远程开发 配置小坑

vs2019 linux远程开发 配置小坑一直都是在笔记本上装双系统跑linux系统编程。未免有些麻烦。正好腾讯云打折,1年的机子只要90。便想着做个远程开发。vs直接连到远程linux便可以直接开发。但由于不熟悉vs还是踩了一些小坑。环境:ide:vs2019本地系统:win10远程系统:ubuntu18CMAKE 问题使用CMake,首先需要配置vs中CMakeSettings.json文件。保证远程linux上cmake版本大于3.8.x,否则会报错。另外不要相信vs内的提示的安装二进

2020-09-06 20:45:27 759

原创 高性能服务器程序框架 总结

高性能服务器程序框架 总结基本概念阻塞和非阻塞同步和异步小结服务器编程框架模块I/O模型IO操作时发生了什么?事件处理模式ReactorProactor并发模式半同步/异步模式领导者/追随者模式基本概念个人在学习linux高性能服务器中容易遇到一些容易混淆的概念。以及一些知识的个人总结。阻塞和非阻塞阻塞指的是在调用时没有收到返回结果,当前线程则会挂起。直到调用线程收到返回结果后,当前进程才会继续运行。非阻塞则指的是调用时没有收到返回结果,当前线程则也会继续运行。同步和异步同步指的是调用没有结果

2020-08-17 01:42:12 121

原创 Linux系统程序设计 课后习题答案

个人开学考试复习使用。都是自己做过,在linux上运行通过的。本来想用c++写,不过靠考虑到是考试还是按c的方式来写吧。第一章3.简述系统调用和库函数区别系统调用是直接调用linux系统中的接口,库函数则是调用c语言库中的接口。第二章填空题1.vi 三种工作模式(命令模式,插入模式,末行模式)2.gcc生成可执行文件四个过程(预处理,编译,汇编,连接)5,库分为(静态库,共享库) 我还是比较习惯叫动态库,不过考试嘛,没法。编程题2.编写一个makefile,自动编译当前目录下全部的

2020-07-20 00:59:21 6524

原创 linux安装apue库 (UNIX环境高级编程)

在学unix高级变成环境。之前在虚拟机上已经编译过一次了。这次就记录下编译中的问题吧。因为apue项目过老了,出点问题也正常。undefined reference to `minor’首先是这个,先上错误代码devrdev.c: 在函数‘main’中:devrdev.c:19:25: 警告:隐式声明函数‘major’ [-Wimplicit-function-declaration] 19 | printf("dev = %d/%d", major(buf.st_dev), mino

2020-07-18 16:37:18 1438 1

原创 gentoo下利用distcc分布式编译

distccdistccdistcc介绍注意事项源码安装windows上安装服务端使用客户端使用顶不住了,用了gentoo,感觉编译好慢啊,顶不住了。chromium编译了差不多6个小时。必须找了点办法加速一下。distccdistcc介绍Distcc 是一个被设计用来将编译任务发布到网络上特定主机的程序。 它由一个服务器 distccd和一个客户端 distcc>程序组成.说白了就是能利用空闲的的电脑,服务器加快编译速度。distcc项目地址distcc文档地址注意事项想要运行di

2020-07-17 19:24:21 632

原创 小白的gentoo之旅 基本系统篇

小白的gentoo之旅 一第一步 参考手册第一步 参考手册参考官方wiki,我认为室安装gentoo中最最最重要的一步。跟着wiki万事无忧Gentoo WIKI

2020-07-14 21:33:04 652

原创 c++ primer 16.1.2节练习 实现泛型vector

StrVec可以看我之前写个。不过在写本篇时候发现StrVec有bug。有时间再改吧因为写完本篇程序发现个奇怪的问题,程序用vec就没事,用vec就炸,排查了一下又是越界问题。这里吹一下vs,debug功能好强啊,因为string释放时会调用析构,导致free函数释放时多释放了一个空的指针。但基础类型销毁的时候没有析构函数所以没事。完整代码#include <iostream>#include<string>#include<vector>#include&.

2020-07-08 02:56:21 215

原创 c++ 构造函数 which is of non-class type奇葩问题

一个奇怪的问题,明明模仿书上代码小试一下,结果出现一个error: request for member 'push' in 's', which is of non-class type 'T_stack<int>()'|先上实现代码,先不要在意我为什么不直接用stl::stack,而是自定义的stack里套一个std::vector。这里是想试一下模板类。然后就出问题了。template <typename T> class T_stack{public: ty

2020-07-07 21:41:22 22672 2

空空如也

空空如也

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

TA关注的人

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