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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 12.05.2013, 19:53
Koopa вне форума Посмотреть профиль Найти все сообщения от Koopa
  № 1  
Ответить с цитированием
Koopa
Banned
[+1 30.08.14]
[+1 26.02.14]

Регистрация: Apr 2012
Сообщений: 162
По умолчанию Класс грузит память, есть другие решения?

Просто жутко грузит флешку! Есть идеи как уменьшить объём занимаемой памяти?
P.S. earth1.jpeg - цилиндрическая карта.


Код AS3:
package GameObjects {
	import flash.display.Graphics;
	import flash.display.Shape;
	import flash.geom.Matrix;
	import flash.display.Loader;
	import flash.net.URLRequest;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.events.Event;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import flash.events.MouseEvent;
	import flash.system.System;
	import flash.filters.DropShadowFilter;
	public class _3D extends Shape{
		public var radius:Number;
		public var sectorsPerQuarter:uint;
		public var vertices:Vector.<Number>=new Vector.<Number>();
		public var indices:Vector.<int>=new Vector.<int>();
		public var uvtData:Vector.<Number>=new Vector.<Number>();
		public var matrix:Matrix=new Matrix();
		public var image:BitmapData;
		public function _3D():void {
 
		}
		public function drawSphere3(radius:Number=10,sectorsPerQuarter:uint=10):_3D{
			this.radius=radius;
			this.sectorsPerQuarter=sectorsPerQuarter;
			var loader:Loader=new Loader();
			var request1:URLRequest=new URLRequest("earth1.jpeg");
			loader.load(request1);
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loadComplete);
			return this;
		}
		private function loadComplete(e:Event):void{
			graphics.beginBitmapFill(e.target.content.bitmapData);
			image=e.target.content.bitmapData;
			var simpleAngle:Number=((180/(2*sectorsPerQuarter))*(Math.PI/180));
			var currentRadius:Number;
			radius*=20;
			var angle:Number;
			var line:Number=0;
			var point:Point=new Point();
			var yCount:uint=0;
			e.target.removeEventListener(Event.COMPLETE,loadComplete);
			for(var i:Number=-(simpleAngle*sectorsPerQuarter);i<=(simpleAngle*sectorsPerQuarter);i+=simpleAngle){
				line=Math.sin(i)*radius;
				currentRadius=Math.cos(i)*radius;
				var xCount:uint=0;
				for (var j:Number=-(simpleAngle*sectorsPerQuarter);j<=(simpleAngle*sectorsPerQuarter);j+=simpleAngle){
					point.x=Math.sin(j)*currentRadius;
					point.y=line;
					vertices.push(point.x,point.y);
					uvtData.push(xCount/(4*sectorsPerQuarter),yCount/(2*radius)-.05,1);
					xCount++;
					yCount++;
				}
			}
			for (i=0;i<(vertices.length-(sectorsPerQuarter*2+1));i++){
				if(i%(sectorsPerQuarter*2+1)!=20 && (i+1)%(sectorsPerQuarter*2+1)!=0){
					indices.push(i,i+1,i+(sectorsPerQuarter*2+1), i+1,i+(sectorsPerQuarter*2+1),i+(sectorsPerQuarter*2+2));
				}
			}
			graphics.drawTriangles(vertices,indices,uvtData);
			this.shadowPlanet();
			addEventListener(Event.ENTER_FRAME,rotate);
		}
		public function shadowPlanet(image:BitmapData=null):void{
			var filter:DropShadowFilter=new DropShadowFilter();
			var filter2:DropShadowFilter=new DropShadowFilter();
			filter.distance=50;
			filter2.distance=100;
			filter.angle=0;
			filter2.angle=180;
			filter.alpha=.7;
			filter2.alpha=.4;
			filter.color=0x000000;
			filter2.color=0xffffff;
			filter.blurX=50;
			filter2.blurX=100;
			filter.inner=true;
			filter2.inner=true;
			this.filters=[filter,filter2];
		}
		private function rotate(e:Event):void{
			graphics.clear();
			graphics.beginBitmapFill(image/*,matrix*/);
 
			for(var i:uint=0;i<uvtData.length;i+=3){
				uvtData[i]+=.01;
			}
			graphics.drawTriangles(vertices,indices,uvtData);
			graphics.endFill();
		}
	}
}
P.S.S. Вызов:
Код AS3:
var planet:_3D=new _3D();
			planet.drawSphere3();
			var k=addChild(planet);


Последний раз редактировалось Koopa; 12.05.2013 в 20:17.
Старый 12.05.2013, 21:47
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 2  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
А размеры текстуры какие?
Память монотонно растёт/пилообразно/не растёт, находится на максимуме?

Старый 12.05.2013, 21:52
Koopa вне форума Посмотреть профиль Найти все сообщения от Koopa
  № 3  
Ответить с цитированием
Koopa
Banned
[+1 30.08.14]
[+1 26.02.14]

Регистрация: Apr 2012
Сообщений: 162
при любом размере текстуры, грузит почти до максимума.(память стабильна-не растет)При добавлении нескольких экземпляров все становится жутко.

Старый 12.05.2013, 22:53
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 4  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Цитата:
Сообщение от Koopa Посмотреть сообщение
При любом размере текстуры, грузит почти до максимума
Такое несущественное влияние развернутой битмапдаты на занимаемую приложением память навевает подозрение, что проблема перерасхода (если он и есть) не здесь.
Цитата:
Сообщение от Koopa Посмотреть сообщение
При добавлении нескольких экземпляров все становится жутко
Это потому, что каждый экземпляр неизвестно зачем хранит свою копию битмапдаты загруженной текстуры земли (image).

Следовало бы снять с класса _3D (мои глаза!) ответственность за загрузку текстуры — зачем это вообще сделано? Загрузить "землю" отдельно, взять BitmapData и просто давать ссылку на нее каждому новому экземпляру класса, например так: var planet:_3D = new _3D(earthBitmapData); (мои глаза!)
__________________
Поймай яблоко 2!

Старый 12.05.2013, 23:17
Koopa вне форума Посмотреть профиль Найти все сообщения от Koopa
  № 5  
Ответить с цитированием
Koopa
Banned
[+1 30.08.14]
[+1 26.02.14]

Регистрация: Apr 2012
Сообщений: 162
Цитата:
Это потому, что каждый экземпляр неизвестно зачем хранит свою копию битмапдаты загруженной текстуры земли (image).
Цитата:
зачем это вообще сделано?
затем, чтоб в входной параметр класса передать image.

Цитата:
_3D (мои глаза!)
Что не нравится? 3D есть?

Старый 12.05.2013, 23:21
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 6  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
А какой размер у vertices? Вообще можно было бы самому посмотреть, что как. Текстуру 2х2 попробовать, фильтры снять, число вершин уменьшить радикально.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 12.05.2013, 23:30
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 7  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
>>Просто жутко грузит флешку! Есть идеи как уменьшить объём занимаемой памяти?

тут не совсем понятны надежды уменьшить нагрузку за счет оптимизации памяти
имхо нормально приведенный код пользует память, а то что грузит, так от graphics.drawTriangles чудес давно никто не ждет

как вариант: уходить на движки, использующие Stage3D
ради интереса глянул в away3d примерно такой же расклад и с такой же картой, так он памяти берет в два с лишним раза больше, но тормозов нет даже и в намеке
Код AS3:
package
{
	import away3d.cameras.*;
	import away3d.containers.*;
	import away3d.controllers.*;
	import away3d.entities.*;
	import away3d.materials.*;
	import away3d.primitives.*;
	import away3d.textures.*;
	import away3d.utils.*;
	import flash.display.*;
	import flash.events.*;
 
	[SWF(backgroundColor="#000000",frameRate="30")]
 
	public class TestGlobe extends Sprite
	{
 
		[Embed(source="map.jpg")]
		public static var map_jpg:Class;
 
		private var scene:Scene3D;
		private var camera:Camera3D;
		private var view:View3D;
		private var cameraController:HoverController;
 
		private var earthMaterial:TextureMaterial;
		private var earth:Mesh;
 
		private var сontainer:ObjectContainer3D;
 
		public function TestGlobe()
		{
 
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;
 
			scene = new Scene3D();
			camera = new Camera3D();
			view = new View3D();
			view.scene = scene;
			view.camera = camera;
			cameraController = new HoverController(camera, null, 0, 0, 600, -90, 90);
			cameraController.yFactor = 1;
			addChild(view);
 
			earthMaterial = new TextureMaterial(Cast.bitmapTexture(map_jpg));
 
			earth = new Mesh(new SphereGeometry(200, 200, 100), earthMaterial);
			сontainer = new ObjectContainer3D();
			сontainer.rotationX = -23;
			сontainer.addChild(earth);
			scene.addChild(сontainer);
			cameraController.lookAtObject = сontainer;
 
			addEventListener(Event.ENTER_FRAME, render);
 
		}
 
		private function render(e:Event):void
		{
			earth.rotationY += 0.2;
			view.render();
		}
 
	}
}

Старый 13.05.2013, 01:59
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 8  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Цитата:
Сообщение от Koopa Посмотреть сообщение
Что не нравится? 3D есть?
Ну т.е. подчеркивание в начале имени класса — это по-твоему единственный выход? Не надо так делать, не привыкай.
Цитата:
Сообщение от Koopa Посмотреть сообщение
затем, чтоб в входной параметр класса передать image
Это ты так ответил на вопрос, зачем у тебя внутри класса текстура грузится каждый раз заново?
__________________
Поймай яблоко 2!

Старый 13.05.2013, 14:01
Koopa вне форума Посмотреть профиль Найти все сообщения от Koopa
  № 9  
Ответить с цитированием
Koopa
Banned
[+1 30.08.14]
[+1 26.02.14]

Регистрация: Apr 2012
Сообщений: 162
Цитата:
Ну т.е. подчеркивание в начале имени класса — это по-твоему единственный выход? Не надо так делать, не привыкай.
ради интереса покопайся в классах АС.
Цитата:
Это ты так ответил на вопрос, зачем у тебя внутри класса текстура грузится каждый раз заново
Она грузится для каждого экземпляра.Нагляднее:
Код AS3:
public function drawSphere3(im:String="earth1.jpeg",radius:Number=10,sectorsPerQuarter:uint=10):_3D...
...
var request1:URLRequest=new URLRequest(im);

Старый 13.05.2013, 14:15
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 10  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
>> Она грузится для каждого экземпляра
дык об этом и речь: если потребуется две одинаковые планеты, будем иметь две загрузки и два экземпляра bitmapData, вторые очевидно избыточны
ну и просто из удобства: не должен класс, предназначенный для рендеринга\отображения заниматься загрузкой, впрочем дело хозяйское, канеш

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

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

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


 


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


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