我用CImGui.jl写了一个程序,但是最后发现常驻的内存占用高达1G,有什么很好的优化方法?

我用CImGui.jl写了一个程序,但是最后发现常驻的内存占用高达1G,有什么很好的优化方法?
我已经用–track-allocation看了一下内存的分配情况并做了适当的调整,但是实际的占用内存和这个似乎并不直接相关,所以应该如何优化才能将内存的占用有效的降低呢?

julia 本身内存占用就高,暂时没有办法。

你指的是julia的编译器吗?可是那也就300MB,还有700MB是不是有可能优化一下,我以为是不是帧循环里分配的局域变量多导致的内存占用多,不过我没想到一个很好的方案来验证和解决这个事情。

如果没有内存泄漏的话,基本上就是UI之外做的普通的allocation,把UI相关的代码剥离,再做memprofile即可。

我最后发现加载字体和图像纹理分别占了~400MB和~100MB,有没有什么方式能有效降低这部分的内存占用呢?

没有代码参考,无法给出建议。。

dir::String, firstfont::String, secondfont::String, fsize::Int = begin
    conf.Fonts.dir, conf.Fonts.first, conf.Fonts.second, conf.Fonts.size
end
fonts = unsafe_load(CImGui.GetIO().Fonts)
ranges = ImVector_ImWchar_create()
ImVector_ImWchar_Init(ranges)
builder = ImFontGlyphRangesBuilder_ImFontGlyphRangesBuilder()
addchar = ['α', 'β', 'γ', 'μ', 'Ω', '┌', '│', '└']
for c in addchar
    ImFontGlyphRangesBuilder_AddChar(builder, c)
end
ImFontGlyphRangesBuilder_AddRanges(builder, ImFontAtlas_GetGlyphRangesChineseFull(fonts))
ImFontGlyphRangesBuilder_BuildRanges(builder, ranges)
r = unsafe_wrap(Vector{ImVector_ImWchar}, ranges, 1)
global firstft = CImGui.AddFontFromFileTTF(fonts, joinpath(dir, firstfont), fsize, C_NULL, r[1].Data)
global secondft = secondfont == firstfont ? firstft : CImGui.AddFontFromFileTTF(fonts, joinpath(dir, secondfont), fsize, C_NULL, r[1].Data)

这是我原本的代码,第二个字体主要用来弥补第一个中文字体中缺失的希腊字母和个别特殊字符,但是第二个字体我用的是思源黑体,占用内存量很大,有没有办法将第二个字体中的几个字符单独加载并和第一个字体合并为一个字体

我在这里找到了解决方法。
现在的代码

dir::String, firstfont::String, secondfont::String, fsize::Int = begin
    conf.Fonts.dir, conf.Fonts.first, conf.Fonts.second, conf.Fonts.size
end
fonts = unsafe_load(CImGui.GetIO().Fonts)
ranges = ImVector_ImWchar_create()
ImVector_ImWchar_Init(ranges)
builder = ImFontGlyphRangesBuilder_ImFontGlyphRangesBuilder()
addchar = ['α', 'β', 'γ', 'μ', 'Ω', '┌', '│', '└']
for c in addchar
    ImFontGlyphRangesBuilder_AddChar(builder, c)
end
ImFontGlyphRangesBuilder_AddRanges(builder, ImFontAtlas_GetGlyphRangesDefault(fonts))
ImFontGlyphRangesBuilder_BuildRanges(builder, ranges)
r = unsafe_wrap(Vector{ImVector_ImWchar}, ranges, 1)
CImGui.AddFontFromFileTTF(fonts, joinpath(dir, firstfont), fsize, C_NULL, ImFontAtlas_GetGlyphRangesChineseFull(fonts))
fontcfg = ImFontConfig_ImFontConfig()
fontcfg.MergeMode = true
CImGui.AddFontFromFileTTF(fonts, joinpath(dir, secondfont), fsize, fontcfg, r[1].Data)
1 个赞