Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将资源文件嵌入可执行文件的性能_C++_C_Gcc_Executable - Fatal编程技术网

C++ 将资源文件嵌入可执行文件的性能

C++ 将资源文件嵌入可执行文件的性能,c++,c,gcc,executable,C++,C,Gcc,Executable,最近我发现了如何将我的资源文件嵌入到可执行文件中。还有xxd方法。考虑到这个新发现的玩具,我最初用来将GLSL着色器的文本嵌入到我的游戏中,现在我想嵌入游戏所需的每个资源文件 现在我只有几kb的三维网格数据,但在这个数字增长之前,我想知道在可执行文件中嵌入多少数据是可行的?如果我在里面放上几GB的纹理数据,可以吗?滥用此功能的性能损失是什么?此资源分配方法的缺点是,在应用程序的整个过程中,所有资源都将存在于虚拟内存中 例如,如果游戏中有10个关卡,则使用更常见的基于文件的存储解决方案,您将只加载

最近我发现了如何将我的资源文件嵌入到可执行文件中。还有xxd方法。考虑到这个新发现的玩具,我最初用来将GLSL着色器的文本嵌入到我的游戏中,现在我想嵌入游戏所需的每个资源文件


现在我只有几kb的三维网格数据,但在这个数字增长之前,我想知道在可执行文件中嵌入多少数据是可行的?如果我在里面放上几GB的纹理数据,可以吗?滥用此功能的性能损失是什么?

此资源分配方法的缺点是,在应用程序的整个过程中,所有资源都将存在于虚拟内存中

例如,如果游戏中有10个关卡,则使用更常见的基于文件的存储解决方案,您将只加载要玩的任何关卡的数据。通过在运行时加载所有游戏数据,您分配的RAM超过了需要。使用最少量RAM的解决方案只会在需要的时间内加载所需的资源

但是,如果要对资源使用基于文件的存储解决方案,并在执行开始时加载所有资源,则RAM使用情况将与静态分配资源方法相同

此外,如果您的目标机器是一个简单的游戏机,不进行多任务处理,那么您通常可以以最适合您的方式自由使用可用资源。没有“玩得好”的要求,因为通常一次只运行一个游戏

如果您在现代系统上处理的是几兆字节的数据,那么损失可以忽略不计,但是当您处理的是几兆字节的数据时,性能损失将对系统的可用内存资源造成不必要的压力


编辑:请务必查看评论中提出的要点

您最后一次看到部署了多GB可执行文件的应用程序是什么时候?我更喜欢将我的纹理和其他资源存储在数据库中。制作一个可以与opengl包装器一起管理资源池和缓存的库也是一个更好的设计。microsoft和其他公司经常为其安装程序提供如此大的可执行文件。在按需分页内存环境中,除非您真正尝试访问资源,否则您不会使用RAM。你所放弃的只是地址空间,在你达到极限之前地址空间是免费的。当您停止访问RAM时,操作系统会很高兴地将其返回。为了更好地分页该数据,您应该将该数据设置为常量,以便将其放置在可执行文件的只读部分,这将把内容分页回可执行文件,而不是交换文件(Op链接中的imagemagic不会这样做)。问题是虚拟内存。如果在32位可执行文件中嵌入1Gb的数据,则程序的虚拟内存将减少1Gb,如果您需要提取/解析该数据,这将是一个真正的问题。静态地为分配的内存赋值不算作访问吗?我知道如果我输入a[1000];“在使用之前不会分配内存,但对于”int a[1000]={1,2,3,…};“?操作系统只是将文件段映射到RAM的内存,并将按需分配?@graviton,是的,该数组可能会按需分页,至少如果该数组是全局和常量的。但是,如果它不是常量,它可能会被分配到数据段中,该数据段可能会在运行时初始化,因此当可执行文件启动时,数据会被分页。”反正是装的。