电玩巴士 > PSV > 软件教程 > 正文

PS Suite SDK官方开发帮助文档完整中文翻译

发布时间:2012/5/29 16:33:44 来源:电玩巴士 作者:天楼神威

论坛PSS专区

  编程向导之七:释放实例和垃圾回收器

  本节说明了如何释放不再需要的实例并作为垃圾回收垃它。

  释放不再需要的实例

  在前一章节中,我们已经说明了如何实现从自己驾驶的飞机当中发射子*弹。不过,如果把这些已经离开屏幕的子*弹就那样放置下去的话,接下来发射的子*弹消耗的内存会越来越多。所以,为了防止继续消耗内存,那么释放这些不再需要的子*弹实例是十分重要的。在C++中,用new开辟的内存可以调用delete来释放。而在C#中,却不像C++中那样拥有明确的释放方法,只有在程序里取消对实例的所有引用,才能被垃圾回收器释放。在C#中,释放实例的方法如下所示。子*弹发射后,演员树将变为以下状态。

  想要释放已经离开屏幕的bulltet0。这时,应该通过父节点bulletManager中的子节点children来删除bulltet0所引用的位置。

  删除children中的引用之后,bullet0处于不在被引用的状态中。在这一状态时,只要启动垃圾回收器即可将bullet0的内存回收,而该内存区域则可以再次使用。

  在演员系统中实现释放实例的机制

  那么,让我们在演员系统中来实现释放不再需要的实例吧。首先,准备一个枚举变量来表示演员状态。
  sample/Tutorial/TutoLib/Actor.cs

  活动中的时候,将ActorStatus Status赋值为ActorStatus.Action。不再需要的时候,将ActorStatus Status赋值为ActorStatus.Dead。

  接下来,实现一个方法,将状态为ActorStatus.Dead的演员从List children中删除。
  sample/Tutorial/TutoLib/Actor.cs

  RemoveAll()是删除列表中的所有元素的方法。在上面的例子中,通过CheckStatus()方法的参数进行条件判断,如果为真,这个元素将被从列表中删除。

  接下来,在GameFrameworkSample.cs中的Update()中调用CleanUpDeadActor()。
  sample/Tutorial/Sample06_01/GameFrameworkSample.cs

  通过这个调用,在每帧中CleanUpDeadActor()将遍历演员树并删除所有被设置了死亡标记的演员。

  观察Bullet类。
  sample/Tutorial/Sample06_01/Bullet.cs

  注意<--here部分,在每帧中坐标都会被更新,并且在演员移出屏幕(当sprite.Position.Y < 0)时给它设置死亡标志。这个设置确保了调用CleanUpDeadActor()时自动删除这些演员。

  确认实例是否被释放

  在当前状态下,虽然我们可以确认实例是否已经从列表中删除,但并不能确认实例是否被垃圾回收器释放掉。下面是确认实例是否被释放的方法。为类实现析构函数,析构函数会在垃圾回收器释放实例时被调用。为Actor类实现析构函数,通过检查处理,就可以确认实例被释放了。
  sample/Tutorial/TutoLib/Actor.cs

  像上面那样添加析构函数,当垃圾回收器释放实例时将在输出窗口中显示“~bullet0”。当垃圾回收器执行后,如果没有显示文本,那个实例可能依然在其他地方被引用,检查你的源代码。因为这个过程是用来检查的,在确认后应该将其注释掉。

  注意1:在这个例子中,通过重复生成和释放实例来展示了实例的释放。然而考虑到处理时间,保留不再需要的实例并在需要时重新初始化它要比反复生成和释放实例更高效。

 << 上一页  [9] [10] [11] [12] [13] [14] [15] [16] 下一页

提示:支持键盘“← →”键翻页 阅读全文

相关推荐

评论