minulla on flash -sovelluksen runko, joka mittaa mikrofonin activityleveliä ajastetun eventlistenerin avulla ja pyörittää movieclipiä sen mukaan. Kaikki sujuu hyvin, kunnes yhtäkkiä, ilman varoitusta yleensä noin puolen tunnin jälkeen flash tökkää täysin ja ohjelman suoritinkäyttö pomppaa 100%. Mistä on kysymys? Liittyykö flash playeriin vai onko kyse käyttiksestä? En ymmärrä.
Alla sovelluksen koodi:
import flash.events.*;
import flash.display.*;
import flash.utils.*;
// ----- MUUTTUJAT ----- //
var i = "nan";
var current:Number = new Number;
var hold:Number = new Number;
var clr:Object = new Object;
clr = clr1;
cbr.monitor.text = "Monitor";
var mph:Microphone = Microphone.getMicrophone();
var t:SoundTransform = mph.soundTransform;
var maxMry:Number = new Number(); //muista, että maxMry number on numeroarvo ja cbr.maxMry on tekstikenttä
var mxrFps:Timer = new Timer(20);
var resetNum:Number = new Number;
var reseted:Number = new Number;
// Kalibrointi
cbr._system.text = "System: " + Capabilities.os;
cbr.runtimeEnv.text = "Runtime environment: " + Capabilities.playerType;
cbr._lang.text = "Language: " + Capabilities.language;
var showCbr:Number = new Number;
cbr.alpha = 0;
// ---- VIRTUAALIMIKSERI JA KALIBROINTI---- //
mph.setLoopBack(true);
mph.gain =80;
t.volume = 0;
mph.soundTransform = t;
; // rajoittamaton
mxrFps.addEventListener(TimerEvent.TIMER, visualize, false, 0, true);
mxrFps.start();
function visualize(e:TimerEvent):void {
graph.run();
e.updateAfterEvent();
resetNum++;
if (maxMry < System.totalMemory) {
maxMry = System.totalMemory;
}
if (showCbr == 1); {
cbr.gotoAndStop(mph.activityLevel);
cbr.bass.text = mph.activityLevel;
cbr.mry.text = "Memory used: " + System.totalMemory;
cbr.maxMry.text = "Memory usage peak: " + maxMry;
}
if (resetNum == 500) {
resetNum = 0;
reseted++;
cbr.monitor.text = "reseting...";
hopeThisWorks();
}
}
// ---- HAETTAVAT FUNKTIOT ---- //
function rwd() {
if (this.clr.currentFrame > 1) {
this.clr.stop();
this.clr.prevFrame();
trace(this.clr.currentFrame);
}
else {
clearInterval(i);
trace("clear");
}
}
function hopeThisWorks() {
removeEventListener(TimerEvent.TIMER, visualize);
flash.system.System.gc();
mxrFps.addEventListener(TimerEvent.TIMER, visualize, false, 0, true);
trace("reset");
cbr.monitor.text = "reseted " + reseted + " times";
}
// ---
var holdCheck = function() {
if(hold == 1) {
clearInterval(i);
this.clr.gotoAndPlay(11);
cbr.monitor.text ="hold on";
}
else {
this.clr.gotoAndStop(current);
}
}
// -------- NÄPPÄINKOMENNOT ------- //
stage.addEventListener(KeyboardEvent.KEY_DOWN, keydown);
stage.addEventListener(KeyboardEvent.KEY_UP, keyrelease);
// =======ON PRESS======== //
function keydown(event:KeyboardEvent):void {
cbr.tellKey.text = "Keycode: " + event.keyCode;
// ---- VALOKONTROLLI ---- //
if (event.keyCode == 16) { // Shift
clearInterval(i);
this.clr.gotoAndPlay(11);
hold = 0;
trace("painettu");
}
//---- NÄYTÄ KALIBROINTI ---- //
if (event.keyCode == 106) {
if (showCbr == 1) {
cbr.alpha = 0;
showCbr = 0;
}
else {
cbr.alpha = 1;
showCbr = 1;
}
}
// ---- HOLD ---- //
if (event.keyCode == 220) { // Tähti
hold = 1;
trace("holdi päällä");
cbr.monitor.text ="hold pushed";
}
// ---- VÄRIT ---- //
if (event.keyCode == 49) {
current = this.clr.currentFrame;
this.clr.gotoAndStop(1);
clr = clr1; //Valkoinen
holdCheck();
}
if (event.keyCode == 50) {
current = this.clr.currentFrame;
this.clr.gotoAndStop(1);
clr = clr2; // Turkoosi
holdCheck();
}
// ---- PÄÄKLIPIT ---- //
if (event.keyCode == 81) {
gotoAndStop(1);
trace("q pressed");
}
if (event.keyCode == 87) {
gotoAndStop(2);
trace("w pressed");
}
}
// ====== ON RELEASE ====== //
function keyrelease(event:KeyboardEvent):void {
// ----- VALOKONTROLLI ------ //
if (event.keyCode == 16) {
i = setInterval(rwd, 20);
}
}
stop();
Työtiedoston voi ladata osoitteesta http://www.karhucreations.fi/koostotesti.fla
Olen kokeillut lähinnä kaiken mieleentulevan, vaihtanut eventlistenerin tyyppiä, tutkinut artikkeleita netistä ja nyt viimeisimpänä olen yrittänyt tuota pakotettua garbage collectoria. Olen testannut standalonena, debuggerissa sekä selaimessa. Käyttöjärjestelmänä on Mac OS X 10.5.6. Lisäsin sovellukseen myös tuollaisen näytön, joka kertoo sen muistin käytöstä, ja tallentaa muisti piikit. Tällä tavoin ilmeni, että sovellus hilaa muistinkäytön ylärajaa pikkuhiljaa ylemmäs. Tämä on ilmeisesti kuitenkin tavallista Flash sovelluksille?
Toivon, että joku löytäisi aikaa ja perehtyisi tähän ongelmaani: koko projektini tarkoituksena on tehdä video jockey tyyppinen sovellus 4.4. järjestettävään tapahtumaan, ja oletin että sen kykenisin tehdä ajallaan. Tämän ongelman kanssa olen kuitenkin paininut jo yli viikon, enkä voi käsittää mistä on kysymys.
Tämän topikin lisäksi minulle voi lähettää aiheesta myös mailia osoitteeseen karhunjaakko@hotmail.com .
Kiitos jo etukäteen,
Jaakko Karhu,
Jyväskylä