大端、小端字节序

一、概念 计算机系统中内存是以字节为单位进行编址的,每个地址单元都唯一的对应着 1 个字节(8 bit) 有些类型的长度是超过 1 个字节的,比如 C/C++ 中,short 类型一般是 2 个字节,int 类型一般 4 个字节等。因此这里就存在如何安排多字节数据中,各字节存放顺序的问题。正是因为不同的安排顺序导致了大端存储模式和小端存储模式的存在。 大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中(高低低高) 小端模式:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中(高高低低) 假如有一个 4 字节的数据为 0x12345678(十进制:305419896,0x12 为高字节,0x78 为低字节),若将其存放于地址 0x4000 8000 中,则有: 内存地址 0x4000 8000(低地址) 0x4000 8001 0x4000 8002 0x4000 8003(高地址) 大端模式 0x12 0x34 0x56 0x78 小端模式 0x78 0x56 0x34 0x12 现状:...

April 21, 2022 · 2 min · Rick Cui

C++11 内存对齐 alignof alignas max_align_t

alignof( type-id ) 查询类型的对齐要求,以字节为单位 struct Storage { char a; int b; double c; long long d; }; // struct alignas(alignof(long double)) AlignasStorage { // struct alignas(long double) AlignasStorage { struct alignas(std::max_align_t) AlignasStorage { // max_align_t 相当于 alignof(long double) 内存对齐为 16 字节 // 这三种写法都可以 char a; int b; double c; long long d; }; struct Empty {}; struct alignas(64) Empty64 {}; int main() { std::cout << alignof(Storage) << std::endl; // 8 std::cout << sizeof(Storage) << std::endl; // 24 内存对齐为 8 字节,所以大小为 8 的整数倍 std::cout << alignof(AlignasStorage) << std::endl; // 16 std::cout << sizeof(AlignasStorage) << std::endl; // 32 内存对齐为 16 字节,所以大小为 16 的整数倍 int a = 10; int &b = a; std::cout << alignof(b) << std::endl; // 4 引用类型返回引用类型的对齐要求 int x[10]; std::cout << alignof(x) << std::endl; // 4 数组类型返回元素类型的对齐要求 std::cout << "Alignment of" "\n" "- char : " << alignof(char) << "\n" // 1 "- pointer : " << alignof(int*) << "\n" // 8 "- int : " << alignof(int) << "\n" // 4 "- long long : " << alignof(long long) << "\n" // 8 "- empty class : " << alignof(Empty) << "\n" // 1 "- alignas(64) Empty: " << alignof(Empty64) << "\n"; // 64 return 0; }

April 19, 2022 · 1 min · Rick Cui

Cesium4Unreal——Editing Tileset Materials

Cesium for Unreal 插件的材质被设计成模块化的,所以可以被很容易地添加和删除。 目标 浏览和理解现有的 Cesium for Unreal 3D Tileset 的材质 基于包含在 Cesium for Unreal 插件内的材质实例文件创建自定义材质 修改 tileset 的材质 了解 tileset mesh 的材质限制 Material Instances Cesium for Unreal 通过使用 Material Instances 实现最大的灵活度,每个材质实例通过使用更多的材质图层来应用图像叠加,水,或其他材质效果。 ![MaterialInstances](./img/MaterialInstances.jpg) 图层资产:包含将显示在给定层上的材质图层节点 混合资产:包含一个节点,该节点确定该材质图层将如何与下面的图层混合 每个材质图层和材质图层混合都可以像其他材质对象一样在材质编辑器中编辑 创建应用到整个 tileset 的材质 在插件目录找到 MI_CesiumThreeOverlaysAndClipping 材质实例文件,并把它拷贝到项目的内容文件夹中,将其改名为 MI_GroundTint。 在【内容】面板右击,创建一个【材质图层】资产,并将其命名为 ML_GroundTint。 双击 ML_GroundTint,打开材质编辑窗口,点击【SetMaterialAttributes】节点,在【细节】面板中的【属性设置类型】数组中添加两个元素,第一个元素设置为默认值【BaseColor】,第二个元素设置为【Opacity】。 添加一个【Constant3Vector】节点,并右击节点,将其【转换为参数】,并命名为 Color。 添加一个【Constant】节点,,将其【转换为参数】,并命名为 Opacity。 右击 Color 节点,在【细节】面板设置默认颜色,比如红色,设置 Opacity 的默认值为 0....

April 17, 2022 · 1 min · Rick Cui

Cesium4Unreal——Hide Parts Tilesets

使用 CesiumCartographicPolygon actor,可以定义一个 tileset 的隐藏区域,或应用其他材质效果。CesiumCartographicPolygon 可以通过 Cesium PolygonRasterOverlay 组件添加到一个或多个 tilesets。 在这里,一个 CesiumCartographicPolygon 被用来隐藏 Cesium World Terrain 和 Cesium OSM Buildings,它们与 Aerometrex Denver Photogrammetry 重叠。 注意:虽然 CesiumCartographicPolygon 有助于基于材质的改变,如 clipping,但它们不影响物理。你仍然可以与 tileset 的隐藏部分发生碰撞。 第一步:添加 CesiumCartographicPolygon actor 可以修改多边形的节点(增加、删除、拖拽节点),修改线的颜色,以及地理位置 第二步:将 CesiumCartographicPolygon 连接到 tileset 数据 选择要将 CesiumCartographicPolygon 应用到的 tileset,比如 Cesium World Terrain,添加组件 CesiumPolygonRasterOverlay 关连 CesiumCartographicPolygon 可以手动刷新 tileset (Refresh Tileset)观看效果 Exclude Tiles Inside: 是专为 clipping 使用。如果这个设置被启用,任何完全位于多边形内部的 tiles 都不会被加载,这可以提高性能。如果你使用这个多边形不是为了 clipping,要禁用这个设置。否则,多边形内的 tiles 将不会被渲染。 Material Layer Key: 将多边形与特定部分的 tileset 的材质连接起来。如果你把这个键换成别的东西,它不会起作用,直到你创建一个使用新键的材质,并将该材质应用到 tileset。

April 16, 2022 · 1 min · Rick Cui

Cesium4Unreal——Using Custom Controllers

目标 此步骤将学习如何设置控制器,而不是使用 Cesium 的 DynamicPawn。 第一步:添加摄影测量数据 为了防止地形和摄影测量数据交叉,将 Aerometrex Denver Photogrammetry 的 actor 的位置的 Z 值设置为 600。 第二步:定位到摄影测量数据 方式一:如果有经纬度坐标和高程数据,直接设置 CesiumGeoreference 的数据 Origin Latitude = 39.752827 Origin Longitude = -104.999689 Origin Height = 1570.879421 方式二:在【世界大纲视图】中双击 Aerometrex Denver Photogrammetry,使用场景视图导航到想要放置世界原点的位置,并点击【Place Georeference origin Here】按钮 第三步:导入第三人称角色 可以添加 UE 自带的【Third Person】资源,也可以添加自己做的角色。添加自带的小白人资源有两种方式: 方式一:通过【添加/导入】中的【添加功能或内容包】 方式二:从其他有【第三人称游戏模板】的项目中,将 ThirdPersonCharacter 迁移到本项目中。 第四步:将 ThirdPersonCharacter 放入到场景中 找到 ThirdPersonCharacter 并将其拖拽到场景里,并调整合适的朝向 效果如下: 设置【自动控制玩家】为【玩家0】,这样在点击【运行】的时候就可以看到小白人了 注意:如果你现在试着玩这个关卡,你会注意到你的演员可能会在丹佛摄影测量完全加载之前开始下降。继续阅读,看看如何解决这个问题。出于这个原因,还建议禁用当前未与之交互的任何物理对象的物理功能。 第五步:设置一个安全的起始位置 在小白人的脚下放置一个立方体,防止开始游戏时,由于 3DTiles 数据在加载过程中,小白人由于受重力影响而掉下去。 第六步:在场景中添加一个车辆控制器 第七步:设置关卡蓝图 通过 C 和 V 切换小白人和车辆控制器的控制权。...

April 16, 2022 · 1 min · Rick Cui