- 博客(124)
- 收藏
- 关注
原创 UE多人网络游戏中Actor的Network Role属性
多人网络游戏中,每个Actor都具有一个属性,。代码中的对应类型为ENetRole。AuthorityProxyAuthority属性通过Local Role和变量来跟踪,Local Role表示该Actor在本机上的权限属性,而Remote Role表示该Actor在远程服务器上的权限属性。UE默认采用的 server-authoritative模型,意味着,所有信息都会从服务器复制到客户端。因此基本可以这样说:服务器上的Actor的Local Role变量肯定为Authority,而在远程客户端上的。
2024-04-21 01:01:47
820
原创 UE C++获取某个旋转状态(欧拉角表示)下的三个方向向量的方法
当想要获取某个轴(比如 X 轴)的方向向量时,可以直接从旋转矩阵中提取对应的列。可以直接理解成,对局部空间的x轴应用矩阵R,从而得到了世界空间中的方向向量结果。数学上,这些向量是通过旋转矩阵与原始坐标轴向量相乘得到的。其中,每一列实际上代表了旋转后的坐标轴在原始坐标系中的方向向量。实际上这个旋转矩阵乘以。
2024-04-19 16:28:53
268
1
原创 Vulkan中的SwapChain、FrameBuffer和RenderPass:概念理解及关系
实际上,imageView并没有直接存储图像数据,你可以将其比喻为一个"窗口",你可以透过这个窗口看到图像的一部分,同时指定这个窗口的属性,比如窗口的大小、位置等。SwapChain提供了可以呈现到屏幕上的图像和图像视图,FrameBuffer关联了这些图像视图,并指定了RenderPass,RenderPass定义了渲染操作的步骤和依赖关系。总体而言,framebuffer 的附件设置是根据你的渲染需求而定的,但通常会包括至少一个与 swapchain 相关的颜色附件。如果你有其他需要渲染的内容,例如。
2024-01-25 21:06:59
812
原创 vulkan中的texture(VkImage、VkImageView、VkSampler、VkDeviceMemory)
在 Vulkan 中,对于很多对象(比如 VkBuffer 和 VkImage),数据存储和句柄是分离的,这为开发者提供了更多的灵活性。这样的设计允许你更精细地控制数据的存储位置、布局和访问权限。以便在着色器中进行纹理采样操作。
2024-01-23 19:28:46
681
原创 vulkan中分配显存并拷贝数据的流程(vkBuffer、vkDeviceMemory的关系)以及VMA库介绍
设备内存对象(GPU显存),用于实际存储 Vulkan 缓冲区对象的数据。缓冲区需要分配显存后才能存储实际的数据,最后成功分配的显存块是通过。再次强调,它并不包含任何指向实际显存块的指针,只是一些信息。表示一个缓冲区对象,用于存储数据,比如顶点数据、索引数据等。函数将缓冲区对象和分配的设备内存关联起来,使得。函数从vkBuffer对象中获取缓冲区的内存。是两个不同的概念,但它们通常是一起。函数为缓冲区分配实际的设备内存(),并将该内存与缓冲区关联起来。对象,定义了缓冲区的。能够真正使用这块显存。
2024-01-17 17:11:30
1117
原创 $ git push ssh: connect to host github.com port 22: Connection timed out fatal: Could not read from
解决方法一:改用HTTP协议(我没试过,应该是可以的)
2024-01-17 03:41:27
1126
1
原创 vulkan中从CPU到GPU传输数据,暂存缓冲区(staging buffer)的必要性
在使用诸如Vulkan、DirectX等现代图形API时,经常用于充当主机和GPU之间的桥梁,以进行高效的数据传输。要明确知道,staging buffer是。既然都是从CPU到GPU传输数据,为什么要先从CPU端拷贝到。(显存块)呢,这不很多余么?
2024-01-17 03:03:53
978
5
原创 vulkan中的指令队列的大致原理
在vulkan中,指令池`vkCommandPool`分配指令缓冲`vkCommandBuffer`,而指令缓冲用于记录`计算、渲染指令`,记录完后,把该指令缓冲提交给指令队列`vkQueue`,然后等待执行。
2024-01-15 03:46:25
670
原创 C++17 inline静态变量,静态变量不用再类内定义类外初始化了
并且这个表达式还是constexpr,从而可以在编译时进行求值,提供更好的优化。然后再在其他任何.cpp文件中包含MyClass.h文件,使用。而在 C++17 引入的标准中,你可以直接在类中定义并初始化。这使得静态成员变量的定义和初始化。
2023-12-24 02:16:25
695
原创 用VS Code修改源代码的编码格式
用VS Code打开一个编码格式为GB2312的源代码文件,中文部分显示为乱码。此时我们点击上面红框这个位置,命令面板弹出两个选项,选择。,选择你想保存的格式即可,这里我选择UTF-8。可以看到VS Code已经猜测出该文件就是。然后,这个文件里的中文部分就可以正常显示了。这是因为VS Code默认解码格式为。最后,再重新点击右下角的。编码的,这里我们选择。
2023-12-21 22:00:51
1258
原创 VS Code + MinGW 搭建 Windows C++开发环境以及如何简单根据CMake维护的项目生成.sln文件
这是Visual Stuidio(IDE)用的编译器,在VSCode中,如果选择MSVC作为编译器,结果就是生成一个对应VS版本的.sln解决方案,后面就不说了吧 用Visual Studio 2022 打开就行。必须掌握的技能,目前github上开源项目几乎都采用CMake来维护,不会使用则寸步难行,学会CMake之后,其他的构建工具都简简单单,比如Premake。,并指定调试相关配置属性,比如调试的目标可执行文件,调试采用的调试器路径等。,这是C/C++插件默认帮我们生成的,必须有这个文件才能编译。
2023-12-20 23:26:19
2703
原创 cmake中的configure_file() 和option()命令
cmake中的configure() 和option()命令的作用域问题。
2023-12-15 17:19:03
667
原创 【游戏引擎 - C#脚本系统】4、C++调用C#函数
,而该调用方法特定于你提供的方法签名,这意味着对于可以传递哪些参数没有歧义。那么,何时应该使用mono_runtime_invoke,何时应该使用非托管方法桩呢?这取决于情况。如果你在编译时(C++编译时)不知道方法的签名,那么你可能应该使用mono_runtime_invoke,尽管你也可以使用非托管方法桩,但通常你希望参数在编译时已知。
2023-12-07 00:25:49
1020
原创 【游戏引擎 - C#脚本系统】5、字段和属性(Fields & Properties)
翻译 from peter1745的《mono-guide》
2023-12-06 10:56:40
1101
原创 C++11 模板参数包(Parameter pack)
Template parameter pack(模板参数包)是C++中用于接受零个或多个模板参数的一种机制
2023-11-20 18:43:28
302
原创 C++11 原始字符串字面量R“()“
`R"()"`是C++11引入的一项特性,它允许创建**不需要转义字符**的字符串字面量。字符串中包含特殊字符、换行符和其他转义字符时,**不需要反斜杠**转义它们。
2023-11-14 01:32:40
580
原创 C++17 std::filesystem
用于表示文件系统路径。它提供了一系列方法,允许你对路径进行各种操作,如拼接、分解、获取文件名等。路径可以是相对路径或绝对路径,可以包含文件名、目录名等信息。std::filesystem 是 C++17 标准引入的文件系统库,提供了一套用于处理文件和目录的 API。:用于表示目录中的一个条目,可以是文件或目录。你可以使用这个类来检查目录中的条目类型、获取条目路径等信息。:是一个用于遍历目录内容的迭代器。你可以使用它来遍历目录中的所有文件和子目录,并获取它们的信息。:用于删除文件或目录。
2023-11-10 17:23:33
812
原创 C++11 initializer_list 轻量级初始化列表的使用场景(让自定义类可以用初始化列表来初始化内部STL容器)
`initializer_list` 是 C++11 中的一个特性,它允许你使用花括号 `{}` 中的值列表来初始化**容器或数组**。通常用于初始化标准库容器,比如 `std::vector`、`std::set`、`std::map` 以及`数组`。
2023-11-03 15:14:54
1063
原创 错误 LNK1181 无法打开输入文件“\VulkanSDK\**.lib”
这个错误消息表明在项目构建过程中,链接器无法找到名为 “.lib” 的库文件。
2023-10-31 11:06:39
1018
原创 关于git推送代码到github远程仓库中文乱码问题,visual studio保存文件默认编码格式问题
当你用GB2313格式保存一个文件,用utf-8的编码格式打开,它必然就显示乱码。据我所知,github上面是utf-8,而visual studio默认保存为GB2312,把代码推送到github上面看,中文部分就是乱码。
2023-10-29 13:55:05
1470
1
原创 GIT常用操作记录
强制回退到某个具体历史提交记录,即要删除它之后的所有提交,可以用git reset命令。请注意,这将永久删除提交历。并谨慎使用 git reset 和强制推送。
2023-10-29 02:49:20
343
原创 C++17 带有初始化器的if语句
在之前的C++标准中,你可能需要在if语句之外单独声明和初始化这些变量,这会使代码变得更加冗长。这个特性使得代码更加简洁,因为你可以在if语句中立即声明所需的变量,并且这些变量的。,它允许在if语句中声明并初始化一个变量,然后在if条件中使用这个变量。C++17之前的版本,则需要提前声明并初始化,然后进行判断。C++17引入的一个新特性,称为。,不会影响外部作用域。
2023-10-19 16:36:48
275
原创 C++11 强枚举类型(enum class)
可以显示指定其底层存储类型,默认为int。(为其他的比如char的话 有什么作用和意义我不太清楚),通常默认为int。这可能导致不同编译器和平台之间的兼容性问题,因为int的大小可能会有所不同。C++11 推出的 强类型枚举(enum class)可以隐式转换为整数。不同枚举类型的值混淆。给每个枚举添加命名空间可以解决,但属实非常麻烦。没有底层类型: 传统的C风格枚举没有。的主要优势在于提供了更好的。,这可能导致潜在的命名冲突。
2023-10-18 16:12:40
637
原创 C++11 右值引用和完美转发
C++11 引入了 右值引用(rvalue reference)的概念,允许程序员更好地处理右值。右值引用的引入使得可以实现,即将资源的所有权从一个对象转移到另一个对象,从而提高了性能。因此一般把左右值的情况分开处理,对右值采用进行优化。
2023-10-18 13:52:53
85
原创 C++类型转换运算符重载
通常在类中定义,允许将该类的对象隐式地转换为目标类型。这使得在使用这些对象时,它们可以表现得像目标类型的对象。这个类型转换运算符允许将。
2023-10-16 23:24:50
208
原创 C++内存分区概念
堆区用于动态分配内存,通常由程序员手动分配和释放。堆内存的生存期不受函数作用域的限制,可以在程序的任何地方进行分配和释放。C++中的 new 和 delete 操作符或者 malloc() 和 free() 函数用于在堆区分配和释放内存。栈区用于存储函数调用的上下文和局部变量。每次调用函数时,将分配一部分栈内存用于存储局部变量和函数调用信息。当函数退出时,这些局部变量将自动销毁。,而全局常量、静态全局常量、函数内部静态常量都存放在。全局变量、静态全局变量、函数内部静态变量都是存放在。
2023-09-24 02:24:23
182
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人