PDA

Просмотр полной версии : Класс грузит память, есть другие решения?


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


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. Вызов:var planet:_3D=new _3D();
planet.drawSphere3();
var k=addChild(planet);

expl
12.05.2013, 21:47
А размеры текстуры какие?
Память монотонно растёт/пилообразно/не растёт, находится на максимуме?

Koopa
12.05.2013, 21:52
при любом размере текстуры, грузит почти до максимума.(память стабильна-не растет)При добавлении нескольких экземпляров все становится жутко.

Zebestov
12.05.2013, 22:53
При любом размере текстуры, грузит почти до максимума
Такое несущественное влияние развернутой битмапдаты на занимаемую приложением память навевает подозрение, что проблема перерасхода (если он и есть) не здесь.
При добавлении нескольких экземпляров все становится жутко
Это потому, что каждый экземпляр неизвестно зачем хранит свою копию битмапдаты загруженной текстуры земли (image).

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

Koopa
12.05.2013, 23:17
Это потому, что каждый экземпляр неизвестно зачем хранит свою копию битмапдаты загруженной текстуры земли (image).зачем это вообще сделано?
затем, чтоб в входной параметр класса передать image.

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

-De-
12.05.2013, 23:21
А какой размер у vertices? Вообще можно было бы самому посмотреть, что как. Текстуру 2х2 попробовать, фильтры снять, число вершин уменьшить радикально.

silin
12.05.2013, 23:30
>>Просто жутко грузит флешку! Есть идеи как уменьшить объём занимаемой памяти?

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

как вариант: уходить на движки, использующие Stage3D
ради интереса глянул в away3d примерно такой же расклад и с такой же картой, так он памяти берет в два с лишним раза больше, но тормозов нет даже и в намеке
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();
}

}
}

Zebestov
13.05.2013, 01:59
Что не нравится? 3D есть?
Ну т.е. подчеркивание в начале имени класса — это по-твоему единственный выход? Не надо так делать, не привыкай.
затем, чтоб в входной параметр класса передать image
Это ты так ответил на вопрос, зачем у тебя внутри класса текстура грузится каждый раз заново? :away:

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

silin
13.05.2013, 14:15
>> Она грузится для каждого экземпляра
дык об этом и речь: если потребуется две одинаковые планеты, будем иметь две загрузки и два экземпляра bitmapData, вторые очевидно избыточны
ну и просто из удобства: не должен класс, предназначенный для рендеринга\отображения заниматься загрузкой, впрочем дело хозяйское, канеш

Zebestov
13.05.2013, 14:48
ради интереса покопайся в классах АС
На вот, почитай (http://techwiki.openstructs.org/index.php/AS3_Coding_Standards), принеси себе пользу.

dark256
13.05.2013, 16:15
Коллеги. Это не код. Это трэш. Оно по дефолту никогда и не будет.

Koopa
15.05.2013, 23:20
На вот, почитай, принеси себе пользу.
"-" является Letter(String)?
"_" является uppercase от "-"?
Коллеги. Это не код. Это трэш. Оно по дефолту никогда и не будет.
Что такое оно? И что оно не будет?

P.S.Кстати, спасибо silin (http://www.flasher.ru/forum/member.php?u=19335), про Stage3D.

gloomyBrain
16.05.2013, 01:07
"-" - Letter(String)? "_" - uppercase?

О господи. Вы производите впечатление первого разумного обфускатора на этом формуе, добро пожаловать =)

По теме: рекомендую воспользоваться Adobe Scout, вероятне всего Вам быстро станет ясно на что приложение тратит ресурсы.