Articles of 对象池

ParticleEffectPool.obtain()不重置粒子

我想在libGDX中使用ParticleEffectPools,但是我遇到了一个奇怪的问题,那就是在池中获得的效果似乎没有被重置。 下面的代码为命名的效果查找现有的ParticleEffectPool,如果需要则创建一个,然后为新创建的Actor获取粒子效果。 粒子效应应该在获取函数中重置(如果你看它的源代码)。 会发生什么情况是第一个效果如预期的那样工作,但是随后的每个效果都会在屏幕上非常短暂地闪烁,就好像它的耗尽时间一样。 public class ParticleEffectActor extends Actor { private static final Map<String, ParticleEffectPool> ParticlePools = new HashMap<>(); private final PooledEffect effect; public ParticleEffectActor(String effectName, float rotation) { if(!ParticlePools.containsKey(effectName)) { ParticleEffect particleEffect = new ParticleEffect(); particleEffect.load(Gdx.files.internal("resources/particles/" + effectName + ".p"), Images.Atlas); ParticlePools.put(effectName, new ParticleEffectPool(particleEffect, 10, 50)); } this.effect = ParticlePools.get(effectName).obtain(); rotation -= 90f; for(ParticleEmitter […]

对象池布对象不工作

布料对象在场景中直接使用时工作正常,但是如果将其用作预制件或对象,则不起作用。 有没有解决这个问题? 更多信息:我已将网/边缘布对象附加到圆环/箍环物体上。 直接在现场使用时,净移动。 y分量的值为0.5外部加速度。 我把这个保存到预制,使用对象池并从场景中删除。 这次网不动,不包含场景中分配的球形对撞机。 如果我尝试直接添加球形对撞机到预制networking对象它不会添加。 即使从游泳池使用,也要移动网布物体。

从游戏引擎中的现有对象生成对象

为了简化,让我们说在en引擎我正在编写一个游戏,我有一个主类的对象类。 在Main类的更新方法中,我遍历游戏中所有对象的数组。 我也有一个从我可以得到和返回对象的主类的池。 Main.update(){for(all Objects){Object [i] .update()}} 我的问题是什么是从现有的对象的更新方法创建新的对象的好方法? 我必须将主类传递给对象吗? 或使主要静态类? 另一个问题是如何处理对象破坏,我将它们返回到未使用的池。 先谢谢了。

我如何围绕对象池建筑师?

例如我有一个“敌人” class ,和5种types的敌人subclasses 。 这些敌人会经常产卵,所以我想使用一个对象池。 然而,这意味着我不能再为敌人使用一个对象池了,现在我必须为每个敌人的子类使用一个对象池,所以现在我必须创建5个对象池,这是一个任意的数字, 25。 例如。 // Each with their own implementations of Enemy's "attack" or similar method class Dragon extends Enemy { … } class Ogre extends Enemy { … } ObjectPool<Ogre> ogrePool; ObjectPool<Dragon> dragonPool; // etc … 这似乎有点奇怪。 那我能做什么? 如果我拿出子类,我可以将每个子类的所有function都放到基类中,并保留这个基类表示的类的typesID,相应地调用适当的函数…但是这会使得一个臃肿的硬维护需要大量修改的类,每次我添加或删除子类的行为。 例如: class Enemy { enum EnemyType {OGRE, DRAGON, ETC;} EnemyType enemyType; […]

如何在无限跑步者的x位置随机产生障碍物? 2D

我试图让两个不同大小的障碍物以随机顺序排列在玩家将要前进的一条直线上。 不必与对象池合在一起。 看来,EnemyGenerator类是无用的,所有可以在platformGenerator中完成。 使用UnityEngine; 使用System.Collections; public class EnemyGenerator : MonoBehaviour { public ObjectPooler enemyPool; public float distanceBetweenEnemies; public void SpawnEnemies (Vector3 startPosition) { GameObject karhu = enemyPool = enemyPool.GetPooledObject (); karhu.transform.position = startPosition; karhu.SetActive (true); //GameObject punakuono = enemyPool = enemyPool.GetPooledObject (); //punakuono.transform.position = new Vector3(startPosition.x – distanceBetweenEnemies, startPosition.y, startPosition.z); //punakuono.SetActive (true); } } 这也返回错误:“资产/脚本/ […]

为什么我的障碍物浮在地上? Unity2D

我正在做一个无限的亚军游戏,我试图产生障碍,但他们都漂浮在地面上,而不是在地面上。 这是召唤熊的代码。 PlatformGenerator类 if (Random.Range (0f, 100f) < randomEnemyThreshold) { GameObject newEnemy = enemyPool.GetPooledObject(); Vector3 enemyPosition = new Vector3 (0f, 0f, 0f); newEnemy.transform.position = transform.position + enemyPosition; newEnemy.transform.rotation = transform.rotation; newEnemy.SetActive(true); } 如果您需要更多信息,请询问更多关于游戏的信息。 编辑: 这是全class同学 PlatformGenerator类 using UnityEngine; using System.Collections; public class PlatformGenerator : MonoBehaviour { public GameObject thePlatform; public Transform generationPoint; public float distanceBetween; […]

何时不应该使用对象池?

有什么情况下我不应该使用对象池,而是依靠Instantiate和Destroy ? (或者更一般地说,在Unity之外,在每个实例的基础上而不是在一个池中创建对象)?

Java游戏对象池管理

目前我正在使用数组来处理我正在制作的游戏中的所有游戏对象,而且我知道这对于性能来说有多可怕。 我的问题是处理游戏对象的最佳方式是什么,而不是损害性能? 下面是我如何创建一个数组,然后通过循环来更新数组中的对象: public static ArrayList<VboCube> game_objects = new ArrayList<VboCube>(); /* add objects to the game */ while (!Display.isCloseRequested() && !Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) { for (int i = 0; i < game_objects.size(); i++){ // draw the object game_objects.get(i).Draw(); game_objects.get(i).Update(); //world.updatePhysics(); } } 我不是在寻找某人为我写资产或对象管理的代码,而只是指出我更好的方向来获得更好的性能。 我感谢你们过去为我提供的帮助,我不认为如果没有交stream的支持,我会和我的项目一样远!

如何在Libgdx中产生块?

我目前正在用无限的地图进行2D平台游戏。 我做了我的研究,发现我可以使用块。 根据我的理解,块是在正确的时间产卵地形,然后在不需要的时候移除它们。 我的想法是池身体,然后将其添加到数组列表,以便我可以使用静态身体,并随时删除它没有任何问题。 但是后来我意识到Pooling不适用于身体。 我怎样才能产生块,而不是每一次创建一个新的身体,然后在不需要时将其删除?

游戏消息系统devise

我正在做一个简单的游戏,并决定尝试实现一个消息系统。 该系统基本上是这样的: 实体生成消息 – >消息被发布到全局消息队列 – > messageManager通过onMessageReceived(消息消息)通知每个消息的新消息 – >如果对象想要,它作用于消息。 我做消息对象的方式是这样的: //base message class, never actually instantiated abstract class Message{ Entity sender; } PlayerDiedMessage extends Message{ int livesLeft; } 现在我的SoundManagerEntity可以在onMessageReceived()方法中做这样的事情 public void messageReceived(Message msg){ if(msg instanceof PlayerDiedMessage){ PlayerDiedMessage diedMessage = (PlayerDiedMessage) msg; if(diedMessage.livesLeft == 0) playSound(SOUND_DEATH); } } 这种方法的优点: 非常简单和容易实施 该消息可以包含尽可能多的信息,因为您可以创建一个新的消息子类,它具有任何必要的信息。 缺点: 我不知道如何将Message对象回收到对象池 ,除非我为Message的每个子类都有不同的池。 所以我有很多很多的对象创建/内存分配随着时间的推移。 […]