我们是几个制作游戏的人。游戏实体的数据存储在嵌套数组中。顶级数组包含数组,每个数组对应一个实体。实体是指存储在数组中的游戏对象参数和数组中引用的starling对象。
这些子阵列引用了starling movieclip或starling sprite以及该实体的大约15个其他变量。因此,由于各种原因,变量不会存储在movieclip / sprite中。 Blitting的可能性就是其中之一。
问题是如何以最好的方式组织这个并最终实现starling对象的回收以减少垃圾收集的问题。 我有三个建议,但我知道,其他的东西可能更好。
1) 每个物体都有一个“墓地”容器:一个用于小行星,一个用于玩家,一个用于.... 每当实体被销毁时,相应的对象将进入正确的坟墓场。每当创建相同类的实体时,如果它拥有任何实体,则从相应的容器中重用一个实体。
2) 所有被毁的动画片段和精灵的一个大容器。 每当sprite或movieclip产生时,如果它拥有任何对象,则重用该容器中的对象。还应设置正确的动画。我不知道是否需要大量的cpu或者是否可能。
3) 让垃圾收集处理被破坏的动画片段和精灵。不要回收它们。
答案 0 :(得分:0)
例如Asteroid类扩展MovieClip:
package
{
import starling.display.MovieClip;
import starling.textures.Texture;
public class Asteroid extends MovieClip
{
/** a object pool for the Asteroids **/
protected static var _pool :Vector.<Asteroid>;
/** the number of objects in the pool **/
protected static var _nbItems :int;
/** a static variable containing the textures **/
protected static var _textures :Vector.<Texture>;
/** a static variable containing the textures **/
protected static var _fps :int;
public function Asteroid()
{
super( _textures, 60 );
}
/** a static function to initialize the asteroids textures and fps and to create the pool **/
public static function init(textures:Vector.<Texture>, fps:int):void
{
_textures = textures;
_fps = fps;
_pool = new Vector.<Asteroid>();
_nbItems = 0;
}
/** the function to call to release the object and return it to the pool **/
public function release():void
{
// make sure it don't have listeners
this.removeEventListeners();
// put it in the pool
_pool[_nbItems++] = this;
}
/** a static function to get an asteroid from the pool **/
public static function get():Asteroid
{
var a :Asteroid;
if( _nbItems > 0 )
{
a = _pool.pop();
_nbItems--;
}
else
{
a = new Asteroid();
}
return a;
}
/** a static function to destroy asteroids and the pool **/
public static function dispose():void
{
for( var i:int = 0; i<_nbItems; ++i ) _pool[i].removeFromParent(true);
_pool.length = 0;
_pool = null;
}
}
}
因此,您可以使用Asteroid.get();
方法获得一个小行星,这将在池中获得一个小行星,或者如果池为空则创建一个小行星。
在使用静态函数Asteroid.init(textures, fps)
当你不再需要小行星时,你可以拨打myAsteroid.release();
,这会将小行星返回到水池中供下次使用。
当您不再需要小行星时,可以调用静态Asteroid.dispose();
来清除池。
希望这可以帮到你。