Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 20.12.2008, 06:49
ramshteks вне форума Посмотреть профиль Отправить личное сообщение для ramshteks Найти все сообщения от ramshteks
  № 1  
Ответить с цитированием
ramshteks
 
Аватар для ramshteks

Регистрация: Jul 2007
Сообщений: 805
Отправить сообщение для ramshteks с помощью ICQ Отправить сообщение для ramshteks с помощью Skype™
Flame Утечка памяти?

Привет, Флешерам.

Вот для себя решил написать некий индикатор производительности.
Выводит счетчик фпс и тотал мемори. Собственно по реализации вопросов нет, хотя предложения по улучшению с радостью приму.

Вопрос то следующий, показатель тотал мемори показывает что постоянно происходит некая утечка памяти по примерно 5-10кб за 2-3 секунды, хотя эт оч не точно, на глаз говорю.

Код AS3:
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);
			}
		}
	}
}
вопрос: что это? утечка ли ? или это особенность работы плеера?

Старый 20.12.2008, 11:09
neelts вне форума Посмотреть профиль Отправить личное сообщение для neelts Посетить домашнюю страницу neelts Найти все сообщения от neelts
  № 2  
Ответить с цитированием
neelts
 
Аватар для neelts

Регистрация: Mar 2004
Адрес: Kazan
Сообщений: 466
Отправить сообщение для neelts с помощью ICQ Отправить сообщение для neelts с помощью Skype™
как то сталкивался с таким, дело в том что эта "утечка" присутсвует всегда, даже если код будет состоять тупо из вывода используемой памяти.

попробуй сам)

создаем пустую флешку с 2-мя кадрами, и пишем в первом кадре:
Код AS3:
trace(System.totalMemory);
видим что используемая память постоянно увеличивается. проверяю в 10-ке, в 9-ке вроде бы тоже самое.

Старый 20.12.2008, 13:18
ramshteks вне форума Посмотреть профиль Отправить личное сообщение для ramshteks Найти все сообщения от ramshteks
  № 3  
Ответить с цитированием
ramshteks
 
Аватар для ramshteks

Регистрация: Jul 2007
Сообщений: 805
Отправить сообщение для ramshteks с помощью ICQ Отправить сообщение для ramshteks с помощью Skype™
да так уже сделал сразу после первого поста, теперь просто интересно в чем дело.

Старый 20.12.2008, 14:38
flash33 вне форума Посмотреть профиль Отправить личное сообщение для flash33 Найти все сообщения от flash33
  № 4  
Ответить с цитированием
flash33
 
Аватар для flash33

Регистрация: Nov 2005
Сообщений: 1,155
Я поковырял тут немного. При таком раскдаде
Код AS1/AS2:
addEventListener(Event.ENTER_FRAME, enterEvent);
function enterEvent(e){
trace(System.totalMemory);
}
действительно происходит постепенная утечка памяти.
Если добавить в обработчик события:
Код AS1/AS2:
addEventListener(Event.ENTER_FRAME, enterEvent);
function enterEvent(e){
System.gc();//принудительная очистка
trace(System.totalMemory);
}
прироста памяти не происходит. Вывод напрашивается - для организации циклов (а Enter_frame - это цикл) плееру необходимо использовать системную память. Может в самом плеере эта работа с памятью не оптимизирована (?) - что ведет к ее утечке, но методом gc() она решается. Поправьте если что

Старый 20.12.2008, 14:39
Chas вне форума Посмотреть профиль Отправить личное сообщение для Chas Посетить домашнюю страницу Chas Найти все сообщения от Chas
  № 5  
Ответить с цитированием
Chas
[+1 14.08.08]
[+1 20.08.08]
 
Аватар для Chas

Регистрация: Sep 2002
Адрес: simferopol
Сообщений: 981
Отправить сообщение для Chas с помощью ICQ
вы думаете, что код флеш плеера, написанного индусами, идеален? Наивные =)
__________________
~
Never trouble trouble till trouble troubles you!

Старый 20.12.2008, 15:44
ramshteks вне форума Посмотреть профиль Отправить личное сообщение для ramshteks Найти все сообщения от ramshteks
  № 6  
Ответить с цитированием
ramshteks
 
Аватар для ramshteks

Регистрация: Jul 2007
Сообщений: 805
Отправить сообщение для ramshteks с помощью ICQ Отправить сообщение для ramshteks с помощью Skype™
Цитата:
Сообщение от Chas Посмотреть сообщение
вы думаете, что код флеш плеера, написанного индусами, идеален? Наивные =)
вот собственно это и было интересно, у кого руки из известно откуда ростут, а может это просто необходимость? кто знает...

Старый 20.12.2008, 17:08
Волгоградец вне форума Посмотреть профиль Отправить личное сообщение для Волгоградец Найти все сообщения от Волгоградец
  № 7  
Ответить с цитированием
Волгоградец
 
Аватар для Волгоградец

блогер
Регистрация: Sep 2007
Адрес: Гамбург
Сообщений: 1,648
Записей в блоге: 12
При работе с Timer тоже такая же утечка...

К сожалению, System.gc() не решает проблему.

Старый 21.12.2008, 00:03
_Smirnoff вне форума Посмотреть профиль Отправить личное сообщение для _Smirnoff Найти все сообщения от _Smirnoff
  № 8  
Ответить с цитированием
_Smirnoff
 
Аватар для _Smirnoff

блогер
Регистрация: Jul 2007
Адрес: Russia
Сообщений: 292
Записей в блоге: 5
System.gc() вообще не имеет смысла, так как для дебага эта фича.
__________________
Оптимизация производительности на уровне кода

Старый 21.12.2008, 20:33
Nirth вне форума Посмотреть профиль Отправить личное сообщение для Nirth Посетить домашнюю страницу Nirth Найти все сообщения от Nirth
  № 9  
Ответить с цитированием
Nirth
4AM Games
 
Аватар для Nirth

блогер
Регистрация: Nov 2002
Адрес: Sofia
Сообщений: 6,264
Записей в блоге: 1
Отправить сообщение для Nirth с помощью ICQ Отправить сообщение для Nirth с помощью AIM Отправить сообщение для Nirth с помощью MSN Отправить сообщение для Nirth с помощью Yahoo Отправить сообщение для Nirth с помощью Skype™
Когда я запускал release версию плеера в профайлере, утечки памяти почти не было – ~150 килобайт за 24 часа, в флэшке с таймером и enterFrame'ом.

В дебаг плеере просто много чего ее понапихано.
__________________
Я перестал переписывать, начал редактировать, еще лет 15 и я стану писателем ^_^

Создать новую тему Ответ Часовой пояс GMT +4, время: 12:22.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 12:22.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.