|
|
|||||
Утечка памяти?
Привет, Флешерам.
Вот для себя решил написать некий индикатор производительности. Выводит счетчик фпс и тотал мемори. Собственно по реализации вопросов нет, хотя предложения по улучшению с радостью приму. Вопрос то следующий, показатель тотал мемори показывает что постоянно происходит некая утечка памяти по примерно 5-10кб за 2-3 секунды, хотя эт оч не точно, на глаз говорю. package main{ import flash.display.*; import flash.events.*; import flash.text.*; import flash.system.*; import flash.utils.Timer; import flash.utils.getTimer; public class Perfomance extends Sprite { //DEFINES////////////////////////////// //Fps data private var fpsCount:uint; private var fpsStack:Array; private var fpsOut:TextField; private var fpsTimer:Timer; ///Other data private var memStack:Array; private var totalMemory:String; private var memoryTimer:Timer; private var color:uint; private var gr:Graphics; private var grafic:Sprite; private var bgrnd:Shape; private var memMax:TextField; private var memMin:TextField; //constants private const gwth:Number=100; private const ghgt:Number=25; public function Perfomance(colortemp:uint=0x00) { color=colortemp; addEventListener(Event.ADDED_TO_STAGE,OnAdded); } //EVENTS////////////////////////////////////////////// private function OnAdded(evt:Event) { fpsOut=new TextField(); fpsOut.defaultTextFormat=new TextFormat("Lucida",10); fpsOut.selectable=false; fpsOut.autoSize=TextFieldAutoSize.LEFT; fpsOut.textColor=color; fpsOut.antiAliasType=AntiAliasType.NORMAL memMin=new TextField(); with(memMin){ defaultTextFormat=new TextFormat("Lucida",8); selectable=false; autoSize=TextFieldAutoSize.LEFT; textColor=color; antiAliasType=AntiAliasType.NORMAL } memMax=new TextField(); with(memMax){ defaultTextFormat=new TextFormat("Lucida",8); selectable=false; autoSize=TextFieldAutoSize.LEFT; textColor=color; antiAliasType=AntiAliasType.NORMAL } grafic=new Sprite(); bgrnd=new Shape(); addChild(bgrnd); addChild(grafic); addChild(fpsOut); grafic.addChild(memMax); grafic.addChild(memMin); gr=grafic.graphics; memMax.x=gwth-gwth/10;; memMin.x=gwth-gwth/10;; memMin.text=memMax.text="Null"; memMax.y=-3; memMin.y=ghgt-memMin.textHeight fpsStack=new Array([0,0,0,0]); memStack=new Array([0,0,0,0,0,0,0,0,0,0]); fpsCount=0; totalMemory=""; var shag:Number=gwth/10; bgrnd.graphics.lineStyle(0,color,0.2); for(var i:uint=0;i<=5;i++){ bgrnd.graphics.moveTo(0,(ghgt/5)*i); bgrnd.graphics.lineTo(gwth-shag,(ghgt/5)*i); } for(i=0;i<10;i++){ bgrnd.graphics.moveTo((gwth/10)*i,0); bgrnd.graphics.lineTo((gwth/10)*i,ghgt); } fpsTimer = new Timer(250,0); fpsTimer.addEventListener("timer", fpsHandler); fpsTimer.start(); memoryTimer = new Timer(1000,0); memoryTimer.addEventListener("timer", memoryHandler); memoryTimer.start(); addEventListener(Event.ENTER_FRAME,onFrame); } private function onFrame(evt:Event) { fpsCount++; } private function fpsHandler(event:TimerEvent):void { for (var i:uint=0; i<3; i++) { fpsStack[i]=uint(fpsStack[i+1]); } fpsStack[3]=fpsCount; var fpsTotalInSecond:uint=fpsStack[0]+fpsStack[1]+fpsStack[2]+fpsStack[3]; fpsOut.text="Fps: "+fpsTotalInSecond+"\nMem: "+totalMemory; grafic.y=bgrnd.y=fpsOut.y+fpsOut.textHeight fpsCount=0; } private function memoryHandler(event:TimerEvent):void { var tm:uint=System.totalMemory; var tmp:String; var val:uint=1; if (tm>1000) { val=0; } if (tm>1000000) { val=1; } switch (val) { case 0 : tmp=Math.floor(tm/10)/100+"kb"; break; case 1 : tmp=Math.floor(tm/10000)/100+"mb"; break; } totalMemory=tmp; for (var i:uint=0; i<9; i++) { memStack[i]=uint(memStack[i+1]); } memStack[9]=tm; var min:uint=10e10; var max:uint=0; var len:uint=memStack.length; for(i=0;i<len;i++){ if(memStack[i]>max){ max=memStack[i] } if(memStack[i]<min){ min=memStack[i] } } memMax.text=max.toString() memMin.text=min.toString(); var del:uint=max-min; var shag:Number=gwth/10; gr.clear(); gr.lineStyle(0,color); gr.moveTo(0,ghgt*(max-memStack[0])/del); for(i=1;i<len;i++){ gr.lineTo(shag*i,ghgt*(max-memStack[i])/del); } } } } |
|
|||||
как то сталкивался с таким, дело в том что эта "утечка" присутсвует всегда, даже если код будет состоять тупо из вывода используемой памяти.
попробуй сам) создаем пустую флешку с 2-мя кадрами, и пишем в первом кадре: видим что используемая память постоянно увеличивается. проверяю в 10-ке, в 9-ке вроде бы тоже самое. |
|
|||||
да так уже сделал сразу после первого поста, теперь просто интересно в чем дело.
|
|
|||||
Регистрация: Nov 2005
Сообщений: 1,155
|
Я поковырял тут немного. При таком раскдаде
addEventListener(Event.ENTER_FRAME, enterEvent); function enterEvent(e){ trace(System.totalMemory); } Если добавить в обработчик события: прироста памяти не происходит. Вывод напрашивается - для организации циклов (а Enter_frame - это цикл) плееру необходимо использовать системную память. Может в самом плеере эта работа с памятью не оптимизирована (?) - что ведет к ее утечке, но методом gc() она решается. Поправьте если что |
|
|||||
[+1 14.08.08]
[+1 20.08.08] |
вы думаете, что код флеш плеера, написанного индусами, идеален? Наивные =)
__________________
~ Never trouble trouble till trouble troubles you! |
|
|||||
вот собственно это и было интересно, у кого руки из известно откуда ростут, а может это просто необходимость? кто знает...
|
|
|||||
4AM Games
|
Когда я запускал release версию плеера в профайлере, утечки памяти почти не было – ~150 килобайт за 24 часа, в флэшке с таймером и enterFrame'ом.
В дебаг плеере просто много чего ее понапихано.
__________________
Я перестал переписывать, начал редактировать, еще лет 15 и я стану писателем ^_^ |
Часовой пояс GMT +4, время: 12:22. |
|
« Предыдущая тема | Следующая тема » |
|
|