2

我有一组不断改变大小的点数据(用于粒子)。为了适应不断变化的大小,我使用如下代码在大约 60 赫兹创建大小正确的缓冲区。

 free(points);
 points = malloc(sizeof(point3D) * pointCount);

这是可以接受的还是有另一种方法可以做到这一点?这会导致我的应用程序变慢或导致内存抖动吗?当我在模拟器中的仪器下运行它时,它看起来并不特别糟糕,但我知道模拟器与设备不同。

编辑:在撰写本文时,如果没有开发人员许可,则无法在设备上进行测试。我没有许可证,无法在设备上配置文件。

4

6 回答 6

3

尝试从估计的粒子计数开始,然后malloc-ing 一个该大小的数组。然后,如果您的粒子数需要增加,请使用realloc重新调整现有缓冲区的大小。这样,您可以最大限度地减少您正在执行的分配/释放操作的数量。

如果您想确保不浪费内存,还可以记录最后 100 个(左右)粒子计数。如果该集合中的最大粒子数小于(假设)当前缓冲区大小的 75%,则将缓冲区的大小调整为适合较小的粒子数。

于 2010-09-14T00:08:12.980 回答
3

分配内存相对于某些事物来说是快的,而相对于其他事物来说是缓慢的。Objective-C 程序平均每秒执行超过 60 次分配。对于几百万字节的分配,malloc+free 应该花费不到一千秒。与算术运算相比,这很慢。但与其他事物相比,它很快。

在您的情况下是否足够快是一个测试问题。在 iPhone 上进行 60 Hz 内存分配当然是可能的——处理器以 600 MHz 运行。

不过,这似乎确实是重用内存的好选择。跟踪池的大小并在需要时分配更多。不分配内存总是比分配它快。

于 2010-09-14T00:26:30.360 回答
2

我将添加另一个更直接指向原始问题的答案。在此之前的大多数答案(包括我自己的)很可能是过早的优化。

我的 iPhone 应用程序每秒执行 1000 次 malloc 和释放,它们甚至没有出现在应用程序的配置文件中。

所以原始问题的答案是否定的。

于 2010-09-14T01:32:23.333 回答
1

除非粒子数量增加(或者您在此期间处理了内存警告),否则您不需要重新分配。只需保留最后一个 malloc 的大小以进行比较。

于 2010-09-14T00:08:58.760 回答
1

正如 hotpaw2 所提到的,如果您需要优化,您也许可以通过仅在需要更多空间时分配来做到这一点,即:

particleCount = [particles count];
if (particleCount > allocatedParticleCount) {
  if (vertices) {
    free(vertices);
  }
  if (textures) {
    free(textures);
  }
  vertices = malloc(sizeof(point3D) * 4 * particleCount);
  textures = malloc(sizeof(point2D) * 4 * particleCount);
  allocatedParticleCount = particleCount;
}

...在您的对象实例化时将allocatedParticleCount 初始化为0。

PS不要忘记在您的对象被销毁时释放您的对象。考虑使用 .mm 文件并将 C++/Boost 的shared_array用于顶点和纹理。然后,您也不需要上述自由声明。

于 2010-09-14T00:41:44.910 回答
0

在这种情况下,您可能希望保留该内存并重新分配它。

于 2010-09-13T23:55:14.943 回答