内存使用

360次阅读
没有评论

共计 2264 个字符,预计需要花费 6 分钟才能阅读完成。

内存使用管理

管理项目的内存使用量对于确保各种设备能够运行您的项目至关重要。减少内存使用在某些情况下还可以提高性能。

图像

通常,对象图像(包括精灵动画)是项目中占用内存最多的部分。因此,Construct 会估计图像的峰值内存使用量,并在“项目统计”对话框中显示。在开发项目时,您应该不时地检查此项,但只能将其视为估计值。调试器还可以在运行时显示图像内存使用情况,但请注意,这可能会根据游戏中的情况而变化。请记住,此测量仅针对图像,因此您的项目至少需要这么多内存才能运行。

布局加载

Construct 仅加载当前布局的图像。这避免了将整个项目加载到内存中,这将是缓慢的并消耗大量内存。当开始一个布局时,所有在布局视图中放置的对象的图像都会被预加载。这包括任何 Sprite 对象的所有动画的所有帧。(换句话说,Sprite 要么完全加载到内存中,要么根本不加载 – 它们永远不会部分加载。)当布局结束时,所有已加载但未在下一个布局中使用的图像都会从内存中释放。

计算图像内存使用

首先要注意的是,图像格式对内存使用没有影响。通过将某些图像设置为不同的格式(如 PNG、JPEG 或 WebP),您可以节省项目的下载大小。然而,这对内存使用没有任何作用:压缩图像不能直接渲染,因此在加载时所有图像都会被解压缩为 32 位 ARGB 位图格式。这意味着每个像素需要四个字节用于 alpha、红色、绿色和蓝色通道。

因此,图像的大致内存使用量仅仅是其像素数量乘以 4。例如,100×100 的图像将使用 100 x 100 x 4 = 40000 字节,或约 39kb。高清尺寸的图像在 1920×1080 将占用 1920 x 1080 x 4 = 8294400 字节,或约 7.9mb。注意,透明像素仍然算在内!

还要注意的是,内存使用是基于源图像的 – 也就是说,就像它在图像编辑器中出现的那样。如果在布局视图或运行时拉伸对象,它不会使用更多或更少的内存。它只是在内存中以原始大小呈现源图像,并以不同大小显示在屏幕上。

图像内存使用基于当前布局上所有图像(包括所有动画帧)。因此,使用较少、较小的图像总是会减少内存使用。

不要误用“缩小质量”

Construct 使用几种优化技术来节省内存,包括 spritesheeting。将 Downscaling 项目属性设置为 High quality 会强制 spritesheeting 将所有 sprite 填充到 2 的幂大小,从而抵消 spritesheets 的内存节省。这可能会显著增加您的项目的内存需求。高质量模式仅存在以解决两个相对较小的渲染问题(sprite 的边缘毛刺或最后一个动画帧的质量改变)。除非已经特别观察到这些问题之一,并且通过选择此选项解决了问题,否则不应使用此选项。否则,您的项目将无故付出非常高的内存使用代价。

音频处理

通常,图像会占用项目内存的大部分。然而,值得注意的是音频是如何加载到内存中的。

对音频进行分类很重要,因为它们的加载方式不同,因此内存使用情况也不同。

声音

声音文件夹中的音频会被完全解压缩到内存中。这允许音效立即播放,无需首先加载或解压缩音频,确保音效在适当的时间听到。与图像一样,压缩大小有助于减少下载量,但不会减少内存使用:声音将被解压缩到 PCM 波形缓冲区中。

默认情况下,项目属性“预加载声音”是启用的,这意味着所有声音都会在显示加载条时下载和解压缩。因此,项目中的所有声音将在启动时解压缩到内存中。以 16 位样本 44.1 KHz 的常见播放配置为例,一秒单声道音频将使用 88000 字节(约 86kb),立体声则翻倍(约 172kb)。对于一分钟的音频,单声道约为 5mb,立体声为 10mb。这是音乐曲目不应归类为“声音”的主要原因:如果你有 15 分钟的立体声音乐,那将消耗 150mb 的内存。在某些平台上,解码完整的音乐曲目也可能相当慢,增加了启动时间。

如果禁用了“预加载声音”,声音在启动期间不会加载,项目可以更快地开始。然而,第一次播放每个声音可能会延迟,因为它必须首先下载并完整解码。使用音频对象中的预加载操作可以帮助缓解这个问题。注意 Construct 一旦加载就不会释放声音,以确保它们可以快速再次播放。要释放内存,你必须使用其中一个卸载操作。这使得你负责管理项目中的音频内存。

声音文件夹中的音频应该是短小、对延迟敏感的音效。考虑缩短任何非常长的音效持续时间 – 或者,如果播放延迟不重要,可以考虑将其归类为“音乐”。

音乐

与音效相反,音乐会被流式传输。通常这意味着音频引擎会有一个固定长度的小播放缓冲区,当音频播放时,它会以小块的形式加载、解码和无缝连接播放。这意味着无论音轨的长度如何,内存使用都很低,它甚至可以在完成下载之前开始播放音频。这就是为什么音乐在显示加载条时不会预加载的原因 – 没有必要等待它完成下载就开始项目。然而,播放并不总是能立即开始,因为它可能需要等待下载完成缓冲,或等待第一块加载和解码。就内存使用而言,主要考虑的是确保长音频轨道被归类为音乐而不是声音。

其他资源

许多其他类型的资源将使用少量内存。然而,这些通常相对于图像和音频的内存使用来说并不重要,所以通常你可以忽略它们。记住,在计算中没有什么是免费的 – 例如,你创建的每个对象都会使用少量内存,所以如果你创建了成千上万的对象,你也可能最终使用了大量的内存。这甚至可能意外发生,比如如果你有一个事件表创建对象但你忘记添加任何逻辑稍后销毁它们,那么它就无休止地创建越来越多的对象。

任何推向极端的事物最终都可能使用大量内存,所以尽量确保项目的各个方面保持在合理的比例内,你不太可能遇到任何其他问题。

正文完
 0
评论(没有评论)