ActionScript 3.0のSoundクラスを用いてメモリ上にロードしたサウンドの開放方法が分からなかったので、Google先生で調べてみました。いくつか有用な記事が見つかりました。
Arrayの要素としてSoundオブジェクトを生成、deleteおよびnull代入によって開放を行うようです。
Memory Optimization Flash Action Script 3
AS3 - Working with Sound.
2010/3/25 追記
私もロードされたデータを開放できるSoundクラスを書いてみました。ご自由に利用してください。むむむ、余計な部分があって長過ぎですね。。。
2010/3/13 追記
Flash Playerのガーベッジコレクションについてテストしてみました。
Duke Software: ActionScript 3.0 Garbage Collectionのテスト
2012年7月15日追記:Flash自体、徐々にフェードアウトしていますので、もう改めて購入する必要はないかもしれません。ただ、以下の書籍のうち、ActionScript 3.0 アニメーションとAdvanced ActionScript 3.0 Animationは、言語に依存しない話になっていますので、アニメーションに興味がある方は買って損はないと思います。
ActionScript 3.0 逆引きクイックリファレンス
すでに購入困難ですが、網羅的にサンプルが解説されており、非常に便利です。素晴らしい書籍です!何で絶版にしてしまったんでしょうか。。。このSoundのメモリーリークを解決するための記事を書くのに非常に参考になりました。
ActionScript 3.0 アニメーション
アニメーションを勉強するなら、最強の本。ActionScript 3.0以外の言語でも役立ちそうです。懇切丁寧に解説されているので、数学が苦手な人でも十分に理解できると思います。ここから本の中で使われているプログラムをダウンロードできます。筆者のKeith PetersさんのブログはFlashやActionScript 3を使った作品やアイデアが数多く公開されています。必見です!(しかしこれもお値段が高いです。。。)
Advanced ActionScript 3.0 Animation
Keith Petersさんが2008年に執筆された書籍です。内容はゲーム開発の一般知識として必須なものが満載です。邦訳はO'reillyから詳解 ActionScript 3.0アニメーション――衝突判定・AI・3DからピクセルシェーダまでFlash上級テクニックとして出版されています。A*アルゴリズムやらキャラクタの行動方法の実装などがコード付で丁寧に解説されています。これは買いです!
Arrayの要素としてSoundオブジェクトを生成、deleteおよびnull代入によって開放を行うようです。
Memory Optimization Flash Action Script 3
AS3 - Working with Sound.
2010/3/25 追記
私もロードされたデータを開放できるSoundクラスを書いてみました。ご自由に利用してください。むむむ、余計な部分があって長過ぎですね。。。
package utils.sound
{
import flash.errors.IOError;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.media.ID3Info;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundTransform;
import flash.net.URLRequest;
public class SoundCacheCore
{
public static const LOADING:int = 0;
public static const LOAD_COMPLETE:int = 1;
public static const NO_LOAD:int = 2;
private var _url:String;
private var sound:Array;
private var sndChannel:SoundChannel;
private var _duration:Number;
private var _loadStatus:int = NO_LOAD;
private var _isPlaying:Boolean;
private var _pauseTime:Number;
private var _initialSoundVolume:Number;
public function SoundCacheCore(initialSoundVolume:Number=0.5)
{
this._initialSoundVolume = initialSoundVolume;
}
public function get resourceURL():String {
return _url;
}
protected function playBody():void {
sndChannel = sound[0].play(_pauseTime);
if (sndChannel == null) {
soundVolume = _initialSoundVolume;
}
sndChannel.addEventListener(Event.SOUND_COMPLETE, sndComplete);
_isPlaying = true;
}
public function loadAndPlay(url:String):void {
if (this._url == url) {
if (loadCompleted) {
if (_isPlaying) {
return;
}
else {
playBody();
}
}
}
else {
loadBody(url, completeHandlerForPlay);
}
}
public function play():void {
if (loadCompleted && !_isPlaying) {
playBody();
}
}
protected function loadBody(url:String, completeHandler:Function):void {
if (_loadStatus != NO_LOAD ) {
unload();
}
this._url = url;
this._loadStatus = LOADING;
sound = new Array(1);
sound[0] = new Sound();
sound[0].load(new URLRequest(url));
sound[0].addEventListener(Event.OPEN, sndOpenHandler);
sound[0].addEventListener(IOErrorEvent.IO_ERROR, sndIOErrorHandler);
sound[0].addEventListener(Event.COMPLETE, completeHandler);
}
public function load(url:String):void {
if (this._url == url) {
if (loadCompleted) {
return;
}
}
else {
loadBody(url, completeHandler);
}
}
public function stop():void {
if (sndChannel != null) {
sndChannel.stop();
}
_pauseTime = 0;
_isPlaying = false;
}
// !!KEY PART!!
public function unload():void {
if (_loadStatus == LOADING) {
try{ sound[0].close(); } catch (err:IOError) {}
return;
}
stop();
sndChannel = null;
sound[0].removeEventListener(Event.OPEN, sndOpenHandler);
sound[0].removeEventListener(IOErrorEvent.IO_ERROR, sndIOErrorHandler);
sound[0].removeEventListener(Event.COMPLETE, completeHandler);
delete sound[0];
sound.length = 0;
_loadStatus = NO_LOAD;
this._url = null;
}
protected function sndOpenHandler(evt:Event):void {
_pauseTime = 0;
}
protected function sndIOErrorHandler(evt:IOErrorEvent):void {
this._loadStatus = NO_LOAD;
sound[0].removeEventListener(Event.OPEN, sndOpenHandler);
sound[0].removeEventListener(IOErrorEvent.IO_ERROR, sndIOErrorHandler);
sound[0].removeEventListener(Event.COMPLETE, completeHandler);
}
protected function completeHandler(evt:Event):void {
updateToComplete();
}
protected function completeHandlerForPlay(evt:Event):void {
updateToComplete();
playBody();
}
protected function updateToComplete():void {
_loadStatus = LOAD_COMPLETE;
_duration = sound[0].length;
_pauseTime = 0;
_isPlaying = false;
}
private function get loadCompleted():Boolean {
return _loadStatus == LOAD_COMPLETE;
}
protected function sndComplete(evt:Event):void {
_isPlaying = false;
}
public function get duration():Number {
if (!loadCompleted) {
return 0;
}
return _duration;
}
public function seek(value:Number):void {
_pauseTime = value;
}
public function pause():void {
if(loadCompleted && sndChannel != null){
_pauseTime = sndChannel.position;
sndChannel.stop();
_isPlaying = false;
}
}
public function togglePause():void {
if(loadCompleted){
if (_isPlaying) {
pause();
}
else {
playBody();
}
}
}
public function get time():Number {
if (sndChannel == null) return 0;
return sndChannel.position;
}
public function get loadedBytesPercentage():Number {
if (sound[0] != null) {
return sound[0].bytesLoaded / sound[0].bytesTotal;
}
else {
return 0;
}
}
public function get soundVolume():Number {
if (sndChannel == null) {
return _initialSoundVolume;
}
return sndChannel.soundTransform.volume;
}
public function set soundVolume(value:Number):void {
if (sndChannel == null) return;
var stf:SoundTransform = sndChannel.soundTransform;
stf.volume = value;
sndChannel.soundTransform = stf;
}
public function get id3():ID3Info {
if ( sound[0] == null ) {
return null;
}
return sound[0].id3;
}
public function get isBuffering():Boolean {
if ( sound[0] == null ) {
return false;
}
return sound[0] .isBuffering;
}
public function get loadStatus():int { return _loadStatus; }
public function get isPlaying():Boolean { return _isPlaying; }
}
}
2010/3/13 追記
Flash Playerのガーベッジコレクションについてテストしてみました。
Duke Software: ActionScript 3.0 Garbage Collectionのテスト
2012年7月15日追記:Flash自体、徐々にフェードアウトしていますので、もう改めて購入する必要はないかもしれません。ただ、以下の書籍のうち、ActionScript 3.0 アニメーションとAdvanced ActionScript 3.0 Animationは、言語に依存しない話になっていますので、アニメーションに興味がある方は買って損はないと思います。
ActionScript 3.0 逆引きクイックリファレンス
すでに購入困難ですが、網羅的にサンプルが解説されており、非常に便利です。素晴らしい書籍です!何で絶版にしてしまったんでしょうか。。。このSoundのメモリーリークを解決するための記事を書くのに非常に参考になりました。
ActionScript 3.0 アニメーション
アニメーションを勉強するなら、最強の本。ActionScript 3.0以外の言語でも役立ちそうです。懇切丁寧に解説されているので、数学が苦手な人でも十分に理解できると思います。ここから本の中で使われているプログラムをダウンロードできます。筆者のKeith PetersさんのブログはFlashやActionScript 3を使った作品やアイデアが数多く公開されています。必見です!(しかしこれもお値段が高いです。。。)
Advanced ActionScript 3.0 Animation
Keith Petersさんが2008年に執筆された書籍です。内容はゲーム開発の一般知識として必須なものが満載です。邦訳はO'reillyから詳解 ActionScript 3.0アニメーション――衝突判定・AI・3DからピクセルシェーダまでFlash上級テクニックとして出版されています。A*アルゴリズムやらキャラクタの行動方法の実装などがコード付で丁寧に解説されています。これは買いです!
コメント