Actionscript 3 : :Improving Slow Performance Of Drawing Application Using BitmapData.draw()?
May 27, 2011
I am using a custom Flex skin to create an active blur/frosted glass effect on the background of floating Panels, TitleWindows, and other containers (similar to http:url....). There is a background image in the Application skin, and potentially any number of other components above and below the active blur component. Here's some relevant code within the skin:
public static const BLUR_FILTER :BlurFilter = new BlurFilter(16, 16, BitmapFilterQuality.HIGH);
private var _bitmapFill :BitmapFill = new BitmapFill;
private var _matrix :Matrix = new Matrix;[code]....
Unfortunately, the performance of this when the component is being resized, and especially when moved, is poor. There is noticeable drag delay and overall slowdown, and this is with only one popped-up TitleWindow in the test application. There is especially poor performance when components inside the TitleWindow are changed (button hover states, etc.)I've attempted to optimized a little bit by avoiding reinstantiation of the blur filter, bitmap fill, and matrix, but this has had little or no effect. I removed the blur at one point, just drawing the Application to a bitmap, and the performance is still poor, so it's clear that it's mostly the BitmapData.draw() call.
I've read about using scrollRect and cacheAsBitmap, but I'm not sure where to apply these properties (or other optimizations I'm not aware of) within the Application or its components.
I'm devloping some library classes for flocking/steering behaviours on large numbers of objects (2000+). I'm finding that at < 500 instances, performance is reasonable. As the numbers increase, framerate bogs down.
I've seen remarkable performance with libraries such as Flint or Box2D with ridiculous #'s of particles / objects, so it should be possible to optimize / refactor my code to be a bit better.
I'm aware of the basic optimizations, such as bitwise operations and optimized for loops. Are there any more fundamental approaches I should be considering? For example, currently each instance is a vector-based MovieClip. Would working with BitmapData be more efficient?
I am having an issue with using BitmapData.draw(stage). I am getting the following error:
SecurityError: Error #2123: Security sandbox violation: BitmapData.draw: file:///C|/Documents%20and%20Settings/bla...bla...bla.swf cannot access null. No policy files granted access. Here is a portion of my code:
var bd:BitmapData = new BitmapData(2800, 2100); bd.draw(stage);//this is where the error happens All of the files referenced (.xml/.jpg/.swf) are located in the same local folder as the main .swf. How do I get around this error? The main objective is to print the stage using PrintJob(). I am using Flash Professional CS5.5 and publishing to Flash 10.0/10.1. Let me know if I need to supply any more info.
rendering performance when scrolling some content. I have a large sprite with a lot of content that I need to scroll and the problem that I am encountering is that when scrolling this big sprite, the rendering of the Flash Player seems to slow down and the movement is choppy. I wrote a custom scrollbar class that simply updates the target sprite y or x properties on an enter frame event. The large sprite that I am scrolling mainly contains other sprites that have drawn shapes, loaded bitmaps and text fields.
Considering that I am simply moving the sprite, there are no other animations happening, nor other intensive processes at the same time, I do not think that it should be that resource intensive as to slow down the Flash Player that much. What can I do to improve the performance when scrolling the sprite? (Just to give a rough approximation, the sprite that I am scrolling contains around 20-30 sprites with drawn shapes, 2-5 loaded bitmaps, 5-10 text fields.)
I'm having some performance issues in certain areas of a flash game Im making.
Here's the situation: I have big movieclip containing a map that can be scrolled and scaled. There are some pannels with a bunch of MC buttons, controls, etc. on the right side of the stage. These are seperate from the map and stay in the same place.
Everything runs fine untill the large map is zoomed in and/or scrolled such that the right side buttons and stuff are overlapping them map. Then the framerate jumps down from a nice smooth 30 fps to about 3 fps while the map is moving. There are no issues with the map moving when they don't overlap.
Now the thing is, is that's there's no real interaction between the buttons and the map. No transparency or anything, in fact I'm perfectly happy with the map dissapearing behind a side pannel. There are only about 3 pannels that the screen drawing routine would have to worry about, as all the buttons rest on top of the pannels, so why is my performance taking such a hit?
(Hmmm. Actually I do have a lot of transparency, but each is on top of a solid background, and none interact with the map.)
I am working on a large project and I would like some advices about improving the rendering performance when scrolling some content.I have a large sprite with a lot of content that I need to scroll and the problem that I am encountering is that when scrolling this big sprite, the rendering of the Flash Player seems to slow down and the movement is choppy.
I wrote a custom scrollbar class that simply updates the target sprite y or x properties on an enter frame event.The large sprite that I am scrolling mainly contains other sprites that have drawn shapes, loaded bitmaps and text fields.
Considering that I am simply moving the sprite, there are no other animations happening, nor other intensive processes at the same time, I do not think that it should be that resource intensive as to slow down the Flash Player that much. What can I do to improve the performance when scrolling the sprite ?(Just to give a rough approximation, the sprite that I am scrolling contains around 20-30 sprites with drawn shapes, 2-5 loaded bitmaps, 5-10 text fields.)
I'm used to the drawing tools within CS3/CS4, but i tend to draw from with AS3 using the drawing API, this is because I tend to want to programmatically animate the drawing parameters.Is there some solution whereby you can use the drawing tools within flash CS3/4 but then 'capture' the drawing information so you could then draw the same line/curve/ shape from within AS3?So a pentool could then give a code output like:
I've been using BitmapData.copyPixels() to draw graphics onto a canvas (Bitmap).I need to rotate the resulting graphics without the use of draw() because it's vastly slower.How can I rotate the target graphic? I'm assuming that there might be a formula or library that I can use which will first reorganize the pixels that make up a graphic based on an origin (point) and radians.I'm pretty certain that I'm not capable of creating such logic, so if there are any known libraries that do this, that would be awesome.I'd like to achieve something similar to XNA's SpriteBatch.Draw() method, which accepts rotation as its 5th argument.
I'm currently working on a flash game and I need to know how to addChild a BitmapData or draw a BitmapData to screen. If I can't than how can I give a DisplayObject my BitmapData?
I am using the draw() method of the BitmapData to encode a jpeg of part of the image. Now this should be easy enough given the object I want to draw to the bitmap is on the stage at design time so I know its location and dimetions exactly! Heres the code I have in place.
Code: var myBitmapSource:BitmapData = new BitmapData ( street.width, street.height, false, 0x333333); myBitmapSource.draw(street, null, null, null, new Rectangle( 96, 5, 571, 450 ), true );
I know for a FACT that no part of the street clip I am drawing out is in negative space, and it's registration is (0,0). However, it cuts off A lot of the top of my image. y=5 in the above rectangle is where I need the top to be, but it cuts the top off of the image... even if I change it to 0, it has no effect.
I'm trying to do some lean blitting for an object that rotates by rotating it once at startup and capturing a BitmapData snapshot of each 5 degrees. The problem I'm having is that the draw() method of the BitmapData object is only picking up pixels in the MovieClip that are below and to the right of the registration point. If I change the MC so that the registration point is in the top left corner, I sometimes get what looks like most of the pixels, but the entire object rotates into and out of the frame, since it's rotating around the corner and not the center.
I have created an app in CS5.5 for Android and iOS. I have tested on two Android devices and everyingthing works fine. However, on an iPad and iPhone the animations are really slow. Here are some more facts:
1) My project has many scenes and in the problems scene there are upwards of 1,200 frames. But even simple animations run slowly.
2) The frame rate is set for 24 fps.
3) I have created a universal app (iphone and ipad), publish resolution is standard at full screen.
4) Ironically, I have already tried caching as bitmap. That actually slowed my animations even more. I am truely at the end of the line here and don't have any possible solutions.
I have a DataProvider object which loads an XML object during instantiation. I set my datagrid.dataProvider to the DataProvider object. There are 13 columns, and approximately 40 rows.
Scrolling the datagrid, and resizing columns has alot of lag. Is this to be expected when using the DataGrid component with larger datasets?
for the past couple of weeks I've been learning AS3, and for a school project I'm doing a remake of the popular DOS game Liero. Everything is working fine, I got a layer of dirt that I am shooting away, but the problem is that after a few hundred bullets, the game starts to lag heavily whenever a shot is fired.I'm using a simple bitmap and a brush to erase the parts where the bullets hit.
// Drawing stage bmap = new BitmapData(1100,800, true, 0); dispBmp = new Bitmap(bmap);
I have 500 small objects, I would like for them each to rotate (spin) constantly, I have seen a few methods for doing this, but what would be the best way to do this so performance doesn't slow down?
when I create a medium or large text block, Flash (cs4) starts to work very slow, only a objet move or a click on stage takes a lot of time to process. My computer features should be ok... 4gb ram, intel 2 core duo 2.4 hz... The only thing that I think can be a problem is that I'm using Windows Vista 64 bit.
I'm curious when Adobe are going to repair the performance issues inside component inspector panel in CS5? Scrolling through the properties of some components is ridiculously slow, 486 like slow...
I have a Flash movie that runs full screen, but with StageScaleMode.NO_SCALE so that the actual movie size is the same as it would be if I ran it not full screen.
There is a huge difference in performance between full screen and no full screen. This is despite the movie taking up the same screen space.
My scene has a video background which scales to the stage size. Then, each section has another video when transitioning in. The problem is that the videos play really slow than they should, very low fps. When there are 2 videos on the stage, it goes even slower. I've tried with embedding videos, using FLVPlayback, wrapping in movieclips, but still the same result. The videos are exported at 30 fps, same rate than the flash movie.
i have a class thats create a class with bitmapData that merge 2 IBitmapDrawable. one of them is 24*20 while the other is 16*16.i want to draw the smaller first in a bitmapData object which its width and height are 24*20 but i want to draw it in the center of the big bounds.
In a SWF file, when I am using the following code to move backwards to a previous frame, it is incredibly slow -- Taking around 2 seconds. Where as moving forward to next frame takes 30-40 milli seconds.
In terms of performance, does loading .swfs into a flash movie have any implications. I've been experimenting with loading complex swfs into a simple movie and the complex .swf seems to perform a lot slower within the .swf than as a standalone. The host movie has no other funcitonality other than as a simple container. Is it in general terms better not to load .swfs into a movie but to code everything inside 1 movie ?
I am looking for the most efficient way to create a circle mask on a BitmapData, so that everything inside the circle is visible and everything outside the circle is black. Here is my current code:
[Code]...
As the radius of this circle is going to be changing rapidly, storing the mask would be useless. how to make this more efficient, preferably keeping to methods that can use GPU accleration?
Been going crazy the last two days trying to figure this out. Can't get my head around it, so I thought I would ask here. I've programmed a fairly simple site in AS 2.0, using a couple of old functions like mx.transitions (still learning myself AS 3.0). The site is outlined like this:
- A main MovieClip on _root called mc_scene containing four different movieclips (doing this because I need to be able to run the Flash fullscreen and center the content). - This main MovieClip contains a simple header movieclip, a footer movieclip, a MovieClip holder (for loading images) and a Meny for controlling the different sections and loading.- Inside the main MovieClip there's four frames each containing a holder and buttons according to each section. - Each section movieclip contains some manual tweens and 1-7 (differs from each clip) buttons. - On the main _root scene I'm using BitMapData to fill a patterened background and centering mc_scene.
Am currently working on a tool created by a colleague of mine and would like to improve performance. Basically, it's a tool for drawing on screen and uses a combination of Sprites and the Graphics class to draw a line segment every time the mouse is moved when the mouse button is down. Here is the drawing bit:
// on MouseMove protected function drawLine(e:MouseEvent):void { if (currentTool.thickness > 0){ //pen var line:Sprite = new Sprite(); line.graphics.lineStyle(currentTool.thickness, currentColour); [Code] .....
As you can see, it checks if the line 'thickness' property and draws if it is and erases if it isn't. I did think of using a technique similar to blotting here where it'd draw to a bitmap but I'm not sure this'd give the performance boost I want or if, indeed, there would be any way to have an eraser function. The drawing itself works nicely - this isn't the problem, it's the performance of the subsequent 'drawn' sprites.
Liked Ilyas's tutorial on generating fractal branches, etc. with the drawing API Is there a way to slow this down, so it looks like time-lapse photography of plants growing, without separating the code into individual frames?
Im writing an IOS game using AS3. Here's the problem- I have an image on the screen that moves around. When the image's y value goes negative (the image is partly off the screen), the frame rates bottom out. I've gone over my code pretty thoroughly, even threw together a few test projects just to experiment. In all the test I do, whenever there is an object that is off screen, even partially, the frame rates drop. It's making scrolling backgrounds impossible. BTW, I'm using Packager for iPhone and a 3G (not 3GS). Frame rates are normally 24 with no problems
It seems the drawing API can quickly slow down a movie, just by drawing a bunch of static (unanimated) lines on the screen. In contrast to movieclips, of which it can handle thousands without slowdown. Makes me wonder why it doesn't just handle drawn lines as movieclips? Why does the linedrawing become slow so quickly, and is there any way to prevent this from happening?I written a quick test, and it appears to slow down, while drawing, after just 300 lines, while only after 2000 mc's the fps start to dip slghtly, while placing them. I also tried drawing every line in it's own layer but it remains much the same.