so I'm working on a game for mobile using AirForAndroid as3. In the game I need to have a lot of enemies at once on the screen (up to 15 would do I assume). These enemies are atm movieclips and contain various movieclips within, such as shapes that work as hitareas which are vital to the games functionality. The enemy-movieclip also contains a png sequence (a walk loop). Right now this seems to be veeeery unefficient for mobile devices, since 4 or 5 enemies at once already makes the game extremely slow on my galaxyS3.
So the question is, is there a diffrent approach to "render" the enemies, to make the display process less "expensive" ... I can't really get around the png sequence itself, which will span to maybe 200 pics combined, walk, run, fight animations and so on. If anybody has an idea or knows a trick or can put me towards a better solution, that would be awesome.
thanks for reading,
ANB_Seth
The MovieClip is very expensive (memory consumption and CPU/GPU performance) object. Especially on mobile devices. I recommend you to give up using MovieClips at all.
There is standard game-dev technique to make animation: Spritesheet animation.
Some links: Tutorial, Performance comparison: MovieClip vs Spritesheet, Descriptions of the main idea and implementation
Related
I currently need some advice about a "simple" issue.
I'm building a game helper, where users may roll dices (6 faced dice, 20 faced dice, etc). Actually, I displaying only the number to the user.
But, to make that much better to use, i want to display THE dice on the screen (on an alert dialog with custom layout for example).
My problem is here, and I don't really know how achieve that. I can't believe that the only way is to create each face of the dice to display it.
For your information, I need theses dices : 6 faced, 8 faced, 12, 20 and special 6 faced. :) That will be a very long task if I have to create all dices :(
The best i can dream, is to have the dice animation, but i guess is a bit too complex for me at this time.
Anyone as some advice about it ?
Best Quality / Highest Effort:
If you want to show a 3-D tumbling die, you probably want to look into the free 3D modeling/rendering/simulation packages. Blender is the first that comes to mind, although there are probably easier free alternatives. They take some time to learn, but you can model a photo-realistic 3D solid and then animate them in real physical simulations.
Going that route, you'd render short (GIF?) animations for each. Then you just have to look up how to display an animated GIF in a dialog (there's plenty of examples available).
Lower Quality / Less Effort
You could just display a single, 2D face of the die being rolled on your dialog, with a number (or pattern of dots) in the center. Depending upon the type of die, the 2D outline of the face could be a square, triangle, pentagon, etc.
The drawing logic for this would be fairly trivial (again, many examples available online). You could even do a crude animation, by having it cycle through several values before stopping on one. Have the cycling rapid at the start and slow at the end, and add a little 'click' sound for each, and you'd have something users would probably like.
I have a "simple" shooting game where I have a cannon in the center bottom that can shoot bitmaps to enemies (sprites).
Now I don't know if its the collision detection or the sprite itself but if I "spawn" more than one enemy it starts to lagg, after 15 its completly unplayable.
The only thing the sprite does is moves itself in a direction and changes the picture from a spritesheet and holds some variables, nothing much.
Collision detection is by going through an array of enemies and within that I go through a second array of bullets and for each enemy I check if a bullet has hit it by making a Rect by them both and check for overlaps.
Its a bit of code so I don't know if I should post some of it or not but you can ask me to post it if you need.
Might I suggest that you will save yourself a lot of hassle and boilerplate code if you use a game library such as libGDX? It's free, open-source, and will take care of sprites, collision detection, object pooling (to avoid GC kicking in and dragging your game to a grinding halt), input, and more. Also, if you use it right, you can develop your app on your PC with a rapid redeployment cycle (and I'm not talking about an android emulator) and push it to your phone less frequently. Believe it or not, I'm not affiliated with the creators in any way - I just think it's a pretty awesome library, it's amazing that it's free, and you will otherwise experience a lot of pain building everything from the ground up.
Of course if you really insist on doing it all from scratch, then yeah, you're going to have to provide some code.
I'm trying to put a particle system together in Android, using OpenGL. I want a few thousand particles, most of which will probably be offscreen at any given time. They're fairly simple particles visually, and my world is 2D, but they will be moving, changing colour (not size - they're 2x2), and I need to be able to add and remove then.
I currently have an array which I iterate through, handling velocity changes, managing lifecyling (killing old ones, adding new ones), and plotting them, using glDrawArrays. What OpenGl is pointing at, though, for this call, is a single vertex; I glTranslatex it to the relevant co-ords for each particle I want to plot, one at a time, set the colour with glColor4x then glDrawArrays it. It works, but it's a bit slow and only works for a few hundred particles. I'm handling the clipping myself.
I've written a system to support static particles which I have loaded into a vertex/colourarray and plot using glDrawArrays, but this approach only seems suitable for particles which will never change relative location (ie I move all of them using glTranslate), colour and where I don't need to add/remove particles. A few tests on my phone (HTC Desire) suggest that trying to alter the contents of those arrays (which are ByteBuffers, pointed to by OpenGL) is extremely slow.
Perhaps there's some way of manually writing the screen myself with the CPU. If I'm just plotting 1x1/2x2 dots on the screen, and I'm purely interested in writing and not doing any blending/antialiasing, is this an option? Would it be quicker than whatever OpenGl is doing?
(200 or so particles on a 1ghz machine with megs of ram. This is way slower than I was getting 20 years ago on a 7mhz machine with <500k of ram! I appreciate I'm using Java here, but surely there must be a better solution. Do I have to use the NDK to get the power of C++, or is what I'm after possible)
I've been hoping somebody might answer this definitively, as I'll be needing particles on Android myself. (I'm working in C++, though -- Currently using glDrawArrays(), but haven't pushed particles to the limit yet.)
I found this thread on gamedev.stackexchange.com (not Android-specific), and nobody can agree on the best approach there, but you might want to try a few things out and see for yourself.
I was going to suggest glDrawArrays(GL_POINTS, ...) with glPointSize(), but the guy asking the question there seemed unhappy with it.
Let us know if you find a good solution!
I'm in the process of writing an Android game and I seem to be having performance issues with drawing to the Canvas. My game has multiple levels, and each has (obviously) a different number of objects in it.
The strange thing is that in one level, which contains 45 images, runs flawlessly (almost 60 fps). However, another level, which contains 81 images, barely runs at all (11 fps); it is pretty much unplayable. Does this seem odd to anybody besides me?
All of the images that I use are .png's and the only difference between the aforementioned levels is the number of images.
What's going on here? Can the Canvas simply not draw this many images each game loop? How would you guys recommend that I improve this performance?
Thanks in advance.
Seems strange to me as well. I am also developing a game, lots of levels, I can easily have a 100 game objects on screen, have not seen a similar problem.
Used properly, drawbitmap should be very fast indeed; it is little more than a copy command. I don't even draw circles natively; I have Bitmaps of pre-rendered circles.
However, the performance of Bitmaps in Android is very sensitive to how you do it. Creating Bitmaps can be very expensive, as Android can by default auto-scale the pngs which is CPU intensive. All this stuff needs to be done exactly once, outside of your rendering loop.
I suspect that you are looking in the wrong place. If you create and use the same sorts of images in the same sorts of ways, then doubling the number of screen images should not reduce performance by a a factor of over 4. At most it should be linear (a factor of 2).
My first suspicion would be that most of your CPU time is spent in collision detection. Unlike drawing bitmaps, this usually goes up as the square of the number of interacting objects, because every object has to be tested for collision against every other object. You doubled the number of game objects but your performance went down to a quarter, ie according to the square of the number of objects. If this is the case, don't despair; there are ways of doing collision detection which do not grow as the square of the number of objects.
In the mean time, I would do basic testing. What happens if you don't actually draw half the objects? Does the game run much faster? If not, its nothing to do with drawing.
I think this lecture will help you. Go to the 45 minute . There is a graph comparing the Canvas method and the OpenGl method. I think it is the answer.
I encountered a similar problem with performance - ie, level 1 ran great and level 2 didn't
Turned it wasn't the rendering that was a fault (at least not specifically). It was something else specific to the level logic that was causing a bottleneck.
Point is ... Traceview is your best friend.
The method profiling showed where the CPU was spending its time and why the glitch in the framerate was happening. (incidentally, the rendering cost was also higher in Level 2 but wasn't the bottleneck)
I'm working on a 2D game for android using OpenGL ES 1.1 and I would like to know if this idea is good/bad/useless.
I have a screen divided in 3 sections, so I used scissors to avoid object overlapping from one view to the other.
I roughly understand the low level implementation of scissor and since my draws take a big part of the computation, I'm looking for ideas to speed it up.
My current idea is as follows:
If I put a glscissor around each object before I draw it, would I increase the speed of my application.
The idea is if I put a GLScissor, (center+/-sizetexture), then the OpenGL pipeline will have less tests to do (since it can discard 90~99% of the surface thanks to the glscissors.
So to all opengl experts, is this good, bad or will have no impact ? And why?
It shouldn't have any impact, IMHO. I'm not an expert, but my thinking is as follows:
Scissor test saves on your GPU's fill rate (the amount of fragments/pixels a hardware can put in the framebuffer per second),
if you put a glScissor around each object, the test won't actually cut off anything - the same number of pixels will be rendered, so no fill rate will be saved.
If you want to have your rendering optimized, a good place to start is to make sure you're doing optimal batching and reduce the number of draw calls or complex state switches (texture switches).
Of course the correct approach to optimizations is to try to diagnose why is your rendering slow, so the above is just my guess which may or may not help in your particular situation.