Optimize Web export size

This commit is contained in:
2026-03-17 23:31:34 +01:00
parent a38633c453
commit 750fd1f941
22 changed files with 122 additions and 50 deletions
+4 -4
View File
@@ -276,7 +276,6 @@ namespace Flax.Build
case TargetPlatform.Linux:
case TargetPlatform.iOS:
case TargetPlatform.Mac:
// TODO: try to disable this on more platforms! (eg. LocalizationService::OnLocalizationChanged uses it)
options.CompileEnv.EnableExceptions = true;
break;
}
@@ -288,7 +287,6 @@ namespace Flax.Build
options.CompileEnv.PreprocessorDefinitions.Add("BUILD_DEBUG");
options.CompileEnv.FunctionLevelLinking = false;
options.CompileEnv.Optimization = false;
options.CompileEnv.FavorSizeOrSpeed = FavorSizeOrSpeed.Neither;
options.CompileEnv.DebugInformation = true;
options.CompileEnv.RuntimeChecks = true;
options.CompileEnv.StringPooling = false;
@@ -306,7 +304,8 @@ namespace Flax.Build
options.CompileEnv.PreprocessorDefinitions.Add("BUILD_DEVELOPMENT");
options.CompileEnv.FunctionLevelLinking = true;
options.CompileEnv.Optimization = true;
options.CompileEnv.FavorSizeOrSpeed = FavorSizeOrSpeed.FastCode;
if (options.CompileEnv.FavorSizeOrSpeed == FavorSizeOrSpeed.Neither)
options.CompileEnv.FavorSizeOrSpeed = FavorSizeOrSpeed.FastCode;
options.CompileEnv.DebugInformation = true;
options.CompileEnv.RuntimeChecks = false;
options.CompileEnv.StringPooling = true;
@@ -324,7 +323,8 @@ namespace Flax.Build
options.CompileEnv.PreprocessorDefinitions.Add("BUILD_RELEASE");
options.CompileEnv.FunctionLevelLinking = true;
options.CompileEnv.Optimization = true;
options.CompileEnv.FavorSizeOrSpeed = FavorSizeOrSpeed.FastCode;
if (options.CompileEnv.FavorSizeOrSpeed == FavorSizeOrSpeed.Neither)
options.CompileEnv.FavorSizeOrSpeed = FavorSizeOrSpeed.FastCode;
options.CompileEnv.DebugInformation = false;
options.CompileEnv.RuntimeChecks = false;
options.CompileEnv.StringPooling = true;
@@ -113,6 +113,7 @@ namespace Flax.Deps.Dependencies
{
BuildStarted(platform, architecture);
var isMSVC = Platform.GetPlatform(platform, true) is Build.Platforms.WindowsPlatformBase;
var buildDir = Path.Combine(root, "build-" + architecture);
var installDir = Path.Combine(root, "install-" + architecture);
var depsFolder = GetThirdPartyFolder(options, platform, architecture);
@@ -120,7 +121,11 @@ namespace Flax.Deps.Dependencies
SetupDirectory(buildDir, true);
File.Delete(Path.Combine(root, "CMakeCache.txt"));
Dictionary<string, string> envVars = null;
var envVars = new Dictionary<string, string>
{
{ "CXXFLAGS", isMSVC ? "/EH- /GR-" : "-fno-exceptions -fno-rtti" }, // Disable exceptions and RTTI
{ "CMAKE_BUILD_PARALLEL_LEVEL", CmakeBuildParallel },
};
var libName = "libmsdfgen-core.a";
var cmakeArgs = string.Join(" ", args);
switch (platform)
@@ -131,13 +136,9 @@ namespace Flax.Deps.Dependencies
libName = "msdfgen-core.lib";
break;
case TargetPlatform.Linux:
envVars = new Dictionary<string, string>
{
{ "CC", "clang-" + Configuration.LinuxClangMinVer },
{ "CC_FOR_BUILD", "clang-" + Configuration.LinuxClangMinVer },
{ "CXX", "clang++-" + Configuration.LinuxClangMinVer },
{ "CMAKE_BUILD_PARALLEL_LEVEL", CmakeBuildParallel },
};
envVars["CC"] = "clang-" + Configuration.LinuxClangMinVer;
envVars["CC_FOR_BUILD"] = "clang-" + Configuration.LinuxClangMinVer;
envVars["CXX"] = "clang++-" + Configuration.LinuxClangMinVer;
cmakeArgs += " -DCMAKE_POSITION_INDEPENDENT_CODE=ON";
break;
}
@@ -37,6 +37,11 @@ namespace Flax.Build.Platforms
private string _compilerPath;
private Version _compilerVersion;
public static bool WithExceptions(NativeCpp.BuildOptions options)
{
return EngineConfiguration.WithCSharp(options);
}
/// <summary>
/// Initializes a new instance of the <see cref="WebToolchain"/> class.
/// </summary>
@@ -102,8 +107,10 @@ namespace Flax.Build.Platforms
options.CompileEnv.PreprocessorDefinitions.Add("__EMSCRIPTEN__");
if (Configuration.WebThreads)
options.CompileEnv.PreprocessorDefinitions.Add("__EMSCRIPTEN_PTHREADS__");
options.CompileEnv.EnableExceptions = false;
options.CompileEnv.EnableExceptions = WithExceptions(options);
options.CompileEnv.CpuArchitecture = CpuArchitecture.SSE4_2;
if (options.Configuration == TargetConfiguration.Release)
options.CompileEnv.FavorSizeOrSpeed = FavorSizeOrSpeed.SmallCode;
}
private void AddSharedArgs(List<string> args, BuildOptions options, bool debugInformation, bool optimization)
@@ -114,15 +121,17 @@ namespace Flax.Build.Platforms
args.Add("-g0");
if (options.CompileEnv.FavorSizeOrSpeed == FavorSizeOrSpeed.SmallCode)
args.Add("-Os");
args.Add("-Oz");
if (options.CompileEnv.FavorSizeOrSpeed == FavorSizeOrSpeed.FastCode)
args.Add("-O3");
else if (optimization && options.Configuration == TargetConfiguration.Release)
args.Add("-O3");
else if (optimization)
args.Add("-O2");
else if (options.CompileEnv.DebugInformation)
args.Add("-Og");
else
args.Add("-O0");
args.Add("-O1");
if (options.CompileEnv.RuntimeTypeInfo)
args.Add("-frtti");
@@ -169,10 +178,8 @@ namespace Flax.Build.Platforms
args.Add("-fsanitize=address");
if (sanitizers.HasFlag(Sanitizer.Undefined))
args.Add("-fsanitize=undefined");
//if (sanitizers == Sanitizer.None && options.Configuration != TargetConfiguration.Release)
// args.Add("-fsanitize=null -fsanitize-minimal-runtime"); // Minimal Runtime
if (sanitizers == Sanitizer.None) // TODO: fix random memory issues around malloc (eg. when resizing canvas) that are not happening when using Address sanitizer (wierd)
args.Add("-fsanitize=address");
if (sanitizers == Sanitizer.None && options.Configuration != TargetConfiguration.Release)
args.Add("-fsanitize=null -fsanitize-minimal-runtime"); // Minimal Runtime
if (Configuration.WebThreads)
args.Add("-pthread");
@@ -283,8 +290,17 @@ namespace Flax.Build.Platforms
{
args.Add(string.Format("-o \"{0}\"", outputFilePath.Replace('\\', '/')));
//args.Add("--minify=0");
AddSharedArgs(args, options, options.LinkEnv.DebugInformation, options.LinkEnv.Optimization);
// Strip unused things
args.Add("-sAUTO_JS_LIBRARIES=0");
args.Add("-sGL_ENABLE_GET_PROC_ADDRESS=0");
args.Add("-sUSE_GLFW=0");
args.Add("-sUSE_WEBGL2=0");
args.Add("-sERROR_ON_UNDEFINED_SYMBOLS=0");
// Setup memory
var initialMemory = Configuration.WebInitialMemory;
if (options.CompileEnv.Sanitizers.HasFlag(Sanitizer.Address))
@@ -303,11 +319,18 @@ namespace Flax.Build.Platforms
args.Add("-sLZ4");
// https://emscripten.org/docs/compiling/Dynamic-Linking.html#dynamic-linking
// TODO: use -sMAIN_MODULE=2 and -sSIDE_MODULE=2 to strip unused code (mark public APIs with EMSCRIPTEN_KEEPALIVE)
if (options.LinkEnv.Output == LinkerOutput.Executable)
if (!options.Target.UseSymbolsExports)
{
// Strip unused code
args.Add("-sMAIN_MODULE=2");
}
else if (options.LinkEnv.Output == LinkerOutput.Executable)
{
args.Add("-sMAIN_MODULE");
args.Add("-sEXPORT_ALL");
//args.Add("-sEXPORT_ALL");
// Uncomment to debug dynamic library loading issues
//args.Add("-sDYLINK_DEBUG=1");
}
else
{