字符串压缩算法比较_ModularFeature:为UE4集成ZSTD压缩算法

本文介绍了如何在Unreal Engine(UE)中替换默认的Zlib压缩算法,采用Facebook的ZSTD算法以提高压缩率和解压速度。通过创建插件并实现ModularFeature,详细阐述了集成过程,包括修改UnrealPak以支持加载插件,以及通过项目设置调整压缩参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇文章搬运自我自己的博客,原文链接:

https://imzlp.me/posts/8470/​imzlp.me

UE在打包时默认使用Zlib作为资源的压缩算法,但是从压缩率和解压速度来看它并不是最好的选择,可以从Squash Compression Benchmark去看各种压缩算的效率对比,我选择了facebook开源的ZStandard作为替换Zlib的压缩实现,因为ZSTD在保证压缩比的同时还具有不错的解压效率。 本篇文章并不只是讲怎么在UE里集成一个压缩算法,还会简单介绍一下UE里的一些功能的模块化组织方式——ModularFeature,使用这种方式可以比较方便地替换某些功能的实现,本文中的替换压缩算法是一个实践。

我在UE中集成ZSTD的方式是写了一个插件,源码集成,开源在Github上:hxhb/ue4-zstd,支持Android和Windows(iOS和Mac还未测试),欢迎Star。

写在前面

其实ZStandard在考虑压缩速度的情况下和zlib的压缩比是差不多的(zstd的compression level为10左右),但是zstd解压更快。zstd的压缩level为1~22,默认情况下为3,我写的插件中默认Level为10,可以通过启动引擎时指定-zstdlevel=参数来指定(如果编译了UnrealPak也可以通过修改项目设置的Pacakge-PakFileCompressionCommandlineOptions-zstdlevel=参数来指定)。

ModularFeature

UE中所有的ModularFeature的实现都要继承自IModularFeature,它内部没有任何成员,只是作为一个通用类型。可以从 ModularFeature的组织方式由IModularFeatures类来管理(默认实现为FModularFeatures),它提供了注册/取消注册/根据名字获取IModularFeature的实例,它本质上实现的功能是把一个Name与一堆实现对应起来,比如UE内的压缩算法都是属于COMPRESSION_FORMAT_FEATURE_NAME的,它对应这一个数组,里面的每一个元素都是一个压缩算法的实现,这样就可以根据我们的需求来随意指定使用哪一个压缩算法。

// Runtime/Core/Private/Features/ModularFeatures.cpp
void FModularFeatures::RegisterModularFeature( const FName Type, IModularFeature* ModularFeature )
{
    
  ModularFeaturesMap.AddUnique( Type, ModularFeature );
  ModularFeatureRegisteredEvent.Broadcast( Type, ModularFeature );
}

可以看到注册一个ModularFeature就是往一个Map里添加元素,注意ModularFeaturesMap不是普通的TMap,它是TMiltiMap,允许一个key对应多个value。

具体的流程为:

  1. 在UE的Module加载时把我们缩写的ModularFeature注册到IModularFeatures中;
  2. 在使用的时候就可以根据我们的ModularFeature类别的名字来查找某个ModularFeature的所有实现;
  3. 之后就可以通过自己定义的接口来调用ModularFeature实现的功能了。

注意IModularFeatures::GetModularFeature是通过模板实现的,可以做到直接获取到某个Feature类别的具体类型。

指定压缩算法

首先先来看一下UE中怎么替换打包时使用的压缩算法:

打开Project Settings找到Packing-Pak File Compression Format(s)

200c12371292ebd4a9eff49dab8cc70c.png

它是一个FString类型,可以输入一串字符串,使用逗号分隔,如果指定了多个,则该列表将按优先级顺序排列,并在格式错误或不可用(未启用插件等)的情况下回退到其他格式。

该字符串用于传递给UnrealPak-compressionformats=参数。

// Programs/AutomationTool/Scripts/CopyBuildToStagingDirectory.Automation.cs
string CompressionFormats = "";
if (PlatformGameConfig.GetString("/Script/UnrealEd.ProjectPackagingSettings", "PakFileCompressionFormats", out CompressionFormats))
{
    
  CompressionFormats = " -compressionformats=" + CompressionFormats;
}

在模块PakFileUtilities中,默认使用的是ZLib压缩算法。

// Developer/PakFileUtilities/Private/PakFileUtilities.cpp
FString DesiredCompressionFormats;
// look for -compressionformats or -compressionformat on the commandline
if (FParse::
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值