问题标签 [object-pooling]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
619 浏览

java - 如何在 Java 或 JavaScript 中为事件侦听器创建对象池

我一直在阅读有关对象池如何减少游戏垃圾收集的文章,特别是对于关键事件不断被创建和销毁的事件侦听器。他们提到对象池将如何减少内存问题,但在代码中没有说明如何实际做到这一点。

您如何为 JavaScript 或 Java 中的事件提供对象池?

0 投票
1 回答
1992 浏览

java - 在 LibGDX 游戏中重用 Box2D 对象(池化)

我在一个游戏中工作,我每 1-3 秒生成一个对象。该游戏对象包含一些用于渲染目的的资产和一个 Box2D 主体。问题是我不想创建数千个对象。相反,我想重用它们,重置它的属性(位置、摩擦力等),而不是创建一个全新的对象。我认为最好的方法是实现这些对象的池,但我很担心,因为在搜索了一些信息后,我发现有几个开发人员报告内存泄漏,因为所有对象都是由 Box2D 在内部创建的。

您认为最好的方法是什么?

这是我用来表示每个游戏对象的类:

0 投票
2 回答
403 浏览

java - 在 Android 中处理 ImageViews 的对象池?

在我的 Android 应用程序中,我创建了一个显示 9x9 字段的视图(参见简化屏幕截图):

在此处输入图像描述

视图中的每个字段都由一个 ImageView 表示(显示图片而不是矩形)。某些 ImageView 将通过将其设置为null并将可见性设置为删除,并且View.GONE每次将新元素添加到该字段时都会创建新的 ImageView。这意味着我在很短的时间内创建了大量的 ImageView。关键是,该游戏在我的 HTC One 上运行良好,但一段时间后会出现滞后(我认为是在垃圾收集运行时),然后它停止滞后并再次运行良好。

这让我想到了使用Pool's 来管理我的对象,例如通过回收“已删除的 ImageViews”并通过设置位置和更改图像源来重用它们。我正在为普通的 Android 开发,但我考虑使用 LibGDX 框架。

我的问题是:您对如何在纯 Java/Android 中实现 Pool 有什么建议吗?我发现这篇文章很有趣,以为我可以使用 Apache Commons ObjectPool。在 Android 或 LibGDX 上有更好的方法吗?

注意:每轮 ImageView 的位置不同。我使用 Tween Engine 移动它们。但是,图像视图的数量是恒定的。意味着在游戏的某个时刻,我确实有 81 个 ImageView (9*9) 以及一些用于动画特殊事件的 ImageView(可能是 +10)。

我将不胜感激任何意见/建议。

此致,

吉米

0 投票
1 回答
166 浏览

javascript - Javascript对象池以避免垃圾收集值得吗?

我正在尝试为在浏览器中运行的 Javascript 构建游戏工具包。我已经遇到了过多的垃圾收集可能导致的可怕的 100 毫秒以上的暂停。这往往会破坏用户体验。

正如我所读到的,对此的补救措施是首先避免创建垃圾,例如通过对象的池化和重用。我整理了一个简单的应用程序来测试这个概念:http: //jsfiddle.net/gk6Gn/

矢量类包含在源代码中,并且定义非常简单:

我使用 requestAnimationFrame 每秒计算大约 60 次帧。每一帧,我都会进行 N 次迭代。在每次迭代中,我创建两个向量并将其相加,得到第三个向量。我慢慢增加迭代次数,直到性能下降到每秒 59 帧以下,并考虑我每帧的最大迭代次数:

为了比较苹果和苹果,我设置了一个“经典”方法,我只是新建向量对象并将它们留给垃圾收集器,以及一个“池化”方法,我使用非收缩数组来存储向量重用的对象。在此示例中,池永远不会大于三个向量:

对于我的汇总测试,这里是我的获取和释放函数:

这一切都可以在所需的浏览器中运行,但我看到的性能结果完全令人印象深刻:

在任何情况下,我都看不到池化的更好性能,而且在许多情况下,性能要差得多。对于 Chrome 来说尤其如此,其性能差距为 10 比 1。

我在网上看到其他文章显示这种技术提高了他们的性能。我的测试有问题吗?

还是我可能错过了这种方法的重点?例如,最好预先对性能进行打击(高达 90%!),以防止 GC 在随机时间中断超过 16 毫秒的帧?

0 投票
1 回答
350 浏览

unity3d - 在被 KeyPress 调用时,我的游戏对象看起来不错,但在按键时不会再次被调用?

我早些时候实例化并销毁了我的游戏对象,但在得知它是处理器密集型的之后,我操纵了我的代码,使其成为一个包含 1 个对象的对象池。当我按下 Z 时,只要按下 Z,我的对象就会被激活并开始放大,并且在向上键时,它会停用对象,但是当再次按下 Z 时,对象不会再次被调用。我究竟做错了什么 ?

0 投票
0 回答
53 浏览

java - 这是我可以使用对象池的唯一方法吗?

我一直在研究将 Apache 公共池用于我正在开发的 android 游戏,但是对象池似乎不适用于泛型类。

所以我相信我有两个池化选项。

  1. 我使每个游戏对象通用,但更改它们的设置,使对象具有不同的起始属性,例如质量、大小、状态、3d 身体等。

或者

2.我为每个子类型设置了多个较小的池。

这个假设正确吗?

0 投票
1 回答
59 浏览

java - 对象池:桌面上的邪恶,推荐在移动设备上。这怎么可能?

我曾经阅读过各种博客和建议,认为池化普通 Java 对象(而不是连接等对象)不会提高并且实际上可能会降低性能,这是一种反模式。然而,这在 Android 平台上并不常见,例如,许多游戏库都提供了用于重用现有对象的类。现在我读到对象池减少了垃圾收集周期的数量,提高了性能。

台式计算机与移动设备有何不同,以至于建议采用不同的开发模式?可能的答案可能是

  • 对象池还使桌面应用程序运行得更好
  • 对象池实际上对 Android 应用程序没有帮助
  • Java SE 和 Android JVM 之间有一些重要的区别。
  • 不建议将对象池用于桌面,因为使用它带来的好处比它为移动应用程序带来的好处少(但确实如此,在某些情况下可能很好?)
0 投票
1 回答
160 浏览

java - 对象池能够在退出时保存对象并在启动时重新加载?

Apache Commons 似乎是不错的对象池实现。或任何其他可以支持该事业的框架

如何在关闭期间保存其池状态;可能会将其对象序列化为外部形式 json、xml ..?并在下次启动时重新加载?

0 投票
1 回答
690 浏览

c# - 任务并行库和对象池设计模式

我有一个场景,比如我正在使用任务并行库,我需要限制创建的对象(这里是任务)的数量。这意味着它将重用现有任务,我正在考虑使用对象池设计模式来实现此功能。但是当我做一些研究时了解到“不支持重新启动正在运行或已完成的任务”。所以我的问题是我可以在这里使用对象池模式,即使它没有重用任务。因为无论如何我都在限制要创建的任务数量。请给一些建议。

0 投票
2 回答
462 浏览

c# - (Unity) 尝试将对象池脚本从 UnityScript 转换为 C#- 遇到错误

我找到了一个很棒的对象池脚本,但它在 UnityScript 中,而我的项目在 C# 中。我一直在尝试转换它,但我遇到了一个我不太理解的错误。这是我的脚本:

错误是:“无法将类型‘UnityEngine.GameObject’隐式转换为‘PoolObject’”

对于行:

该脚本引用了另一个名为 PoolObject 的脚本,但它没有给我任何错误,所以我不认为它与这些错误有关。这是那个脚本:

有人告诉我我在这里做错了什么吗?