Hi everyone
I have an irritating dilemma. Whenever the screen goes to sleep/locks, SOMETHING happens and then it crashes when you turn it on again.
let me clarify a bit.
My app is an opengl game. Textures are loaded on the game(logic) thread. the game thread is started by the main thread in the onCreate method.
However,
when the screen wakes up from sleep or 'unlocks' the main threads onCreate gets called again, and therefore textures are loaded again and this make the app run out of memory and crash.
and this ONLY happens when the screen locks, switching between applications works just fine.
----
my question is this:
what happens when the screen goes to sleep or locks? Why does onCreate get called multiple times, and why the hell is there like no information about this specific thing in the Android docs?
EDIT:
also, what happens to threads when the screen is off. Are they terminated or frozen or something?
THANKS!
I would assume your activity is being destroyed/torn down, threads continue to run but become eligible for GC AFAIK.
You should really plan for this in your life-cycle. Do cleanup in onPause, onStop and onDestroy. And check to see if threads/ textures exist in onCreate() onResume() and onStart()
This is actually a generally good habit to be in when writing methods. If you design them in such a way that if they get called multiple times your app will react correctly anyways.
hth
alostpacket said:
I would assume your activity is being destroyed/torn down, threads continue to run but become eligible for GC AFAIK.
You should really plan for this in your life-cycle. Do cleanup in onPause, onStop and onDestroy. And check to see if threads/ textures exist in onCreate() onResume() and onStart()
This is actually a generally good habit to be in when writing methods. If you design them in such a way that if they get called multiple times your app will react correctly anyways.
hth
Click to expand...
Click to collapse
definitely is a good practice to assume nothing and always check for pre-existing textures, values, threads and to either decide to destroy and recreate them or to use the pre-existing values. its a good way to minimize memory leakage and values without pointers, though the vm does a good job of cleanup.
Thought I would record my troubles with a game render loop and a logic engine given a particular bug has swallowed up about a week of my time. I am posting it incase anyone else happens to have the same problem/symptomns.
It originated when I wrote the LogicEngine which has an ArrayList of GameObjects and iterates through them deleting them as nessesary depending on the results of thier processStep.
The render thread would occasionally crash when something was deleted from the array while the list was being drawn but this happened quite rarely. No problem I thought, I'll just catch the out of bounds exception and it will get displayed on the next frame however many milliseconds later.
This all went well for 3 months of coding till I got to programming terrain where about 300 blocks were all displayed gradually scrolling down the screen. The blocks would flash intermittently but in sections not all at once.
At first I thought it was too many blocks for the LogicEngines collision detection so I doubled the size of the blocks. Then I thought it might be overhead allocating memory for the blocks and preloaded them in the constructor. Eventually in despair I disabled the deletion of blocks once they went offscreen and noticed the flashing stopped. This was the point I realised what was happening: The LogicEngine would delete a row of blocks because they went offscreen and the Renderer would be half way through drawing and instead of crashing it would just skip x blocks wherever it was in the for loop at the time that the LogicEngine removed them.
Wow I feel stupid, especially because of the lazy Exception catching solution I originally implemented which masked the problem for so long.
Code:
GameRender.java
//draw obstacles
theLogicEngine.objectsObstaclesLock.writeLock().lock();
for(int i=0 ; i<theLogicEngine.objectsObstacles.size();i++)
{
drawObject(theLogicEngine.objectsObstacles.get(i));
}
theLogicEngine.objectsObstaclesLock.writeLock().unlock();
LogicEngine.java
for(int i=0;i<objectsObstacles.size();i++)
if(objectsObstacles.get(i).processStep(this)) //we are to delete this object
{
objectsObstaclesLock.writeLock().lock();
//remove self if necessary
//move object returned true so delete object
GameObject toDelete = objectsObstacles.get(i);
objectsObstacles.remove(i);
toDelete.dispose();
i--;
objectsObstaclesLock.writeLock().unlock();
}
TLDR: If you have an ArrayList that can be edited by one thread, make sure you lock it rather than just catching the ArrayOutOfBoundsException
Glad you figured it out
I am still impressed that you can write Android games using these techniques. Is your game low-res or is Dalvik that powerful?
I mean, you are using Java, which is one thing, but then you use ArrayList and you delete objects as you go. I take this to mean that you do not recycle them in a pool.
Am I correct?
cyansmoker said:
Glad you figured it out
I am still impressed that you can write Android games using these techniques. Is your game low-res or is Dalvik that powerful?
I mean, you are using Java, which is one thing, but then you use ArrayList and you delete objects as you go. I take this to mean that you do not recycle them in a pool.
Am I correct?
Click to expand...
Click to collapse
ArrayList is self managing.
All of Java's garbage collection is done automatically. As a Java dev u can call System.gc but this only suggest the system attempt gc.
Dalvik is pretty good, but anything extensive I would go native...
Sent from my Galaxy Nexus using Tapatalk
jug6ernaut said:
ArrayList is self managing.
Click to expand...
Click to collapse
Right. But then there is the memory consumption issue. That's why I typically do things as described in this blog entry.
jug6ernaut said:
All of Java's garbage collection is done automatically. As a Java dev u can call System.gc but this only suggest the system attempt gc.
Click to expand...
Click to collapse
Although in System.gc()'s defense I've always observed that it was run immediately in Sun's ref. implementation. Not sure about Dalvik.
But overall I agree with your conclusion.
cyansmoker said:
I am still impressed that you can write Android games using these techniques. Is your game low-res or is Dalvik that powerful?
Click to expand...
Click to collapse
So far I have not been having any performance issues. The ArrayLists contain GameObjects which are quite lightweight memory wise as they do not contain Textures.
Textures are maintained in separate dictionary with a string key.
I did try recycling GameObjects in one location where I was spawning / destroying a lot but it didn't really seem to impact performance much.
I think my biggest area for optimisation at the moment is in collision direction. Currently there are about 5 different ArrayLists (Obstacles, Enemies, Players, Player Bullets, Enemy Bullets etc) only those that interact are tested for collision (Vector2d distance < objects collision radius). I think theres probably opportunity to split it further into quads.
I've yet to build in proper optimisation checking but it plays fine in 320x480 with ~100 enemies on screen and 4 player ships with maybe 20 bullets on screen at once with a turnover of 5/10 GameObjects a second. Even with this number though Texture memory usage is low with most enemies between 16x16 and 48x48.
I think libgdx and the behaviours library I use are pretty optimised.
Unfortunately Niantic contacted me to abort this mod. More info: http://forum.xda-developers.com/showthread.php?p=42027875#post42027875
TL;DR version: I have created an Ingress app mod, it is awesome and will make you coffee. You can download it below.
OVERVIEW
Hi,
after more than a 2 years of inactivity in the modding field I'm back with a new mod. This time it's Ingress app. I think and hope it'll be much greater and more advanced than Google Maps mod. There are a lot of things to improve and I think some of them won't be ever added by Niantic, so it's a good idea to mod this app.
First I want to clarify I will never add any kind of cheating to this mod. My goal is to make Ingress game more enjoyable, not less. Questions about location faking, items cloning, etc. are not welcome here. I'm serious. Still if you think this mod is a bad thing and/or if you're from Niantic then please read a section about my motivations below and feel free to ask, suggest or criticize. I make it for Ingress players and I'm very interested in their opinions.
DOWNLOAD
First: you do this at your own risk! I'm sure it won't brick your phone, but remember you may be banned by Niantic. My mod doesn't do any kind of cheating behavior, it doesn't do anything that original app doesn't do, but there is always the risk.
Also if you downloaded apk from different site then check sha1 of this file to make sure it's ok. Unfortunately such mods create good opportunity to inject some malware, because users search for an application in the internet and anyone can redistribute it. I sign this app with my own keys, so if you have installed my mod earlier, now you have downloaded newer version from the internet and Android says it has different certificates then don't install it!
"Mute" variant has all sounds removed, so apk is ~2.5 times smaller and most likely it uses less memory.
ingress-1.26.1-broot-0.2.0-mute.apk
SHA1: 976342081c963998f8a6e56b735fe97581ab335f
ingress-1.26.1-broot-0.2.0.apk
SHA1: dce5399802c8f11287a7cf399c1bb5265f8251e2
Older versions:
ingress-1.26.0-broot-0.1.0.apk
SHA1: ea95d8e36324c6c4a175e0cf254cd65a4797049f
If you have original Ingress app installed then you have to uninstall it first. Same if you want to install original app over a modded one.
FEATURES / TODO LIST
I know simplifying and automation of too many things may be considered cheating, so I have divided all features into several categories: from the most "innocent" ones to some smart assistants. As I stated above, if you think some of them are just too much then feel free to write about it. For me features up to 3. category are ok. Category 4. may be controversial and I'm not sure if I want to implement it. I'm glad for your opinions. Some features (e.g. 2.11., 3.7.) aren't actually related to category descriptions, but I "feel" them as category 2., 3., etc.
I don't want to force people to use every modification, I'll try to make them all opt-in, so modded app will work exactly as the original one until you change this in the mod menu. If you see e.g. "Fullscreen" feature below then read it as "An option to enable fullscreen mode".
Below is just a list of features to make it clear. Descriptions, notes, statuses, implementation proposals, etc. are here.
Legend:
green - completed
orange - not sure about it
red - rejected
black - waiting / todo
1. Changes strictly technical and/or 4fun - they don't affect gameplay at all:
UI for small screens, but this is never ending task
Disable some graphics effects to make it less GPU consuming:
portal particles
xm particles
Fullscreen.
Remove globe intro.
Change colors of factions.
Exit confirmation dialog - it's good for low memory devices.
Keep sceen on.
Disable vibrator.
2. UI changes: new screens, shortcuts, etc. - it makes things easier, but it won't do anything for you:
New screen with mod settings, credits, etc.
New inventory screen with items presented as a clear table.
Number of all items in the inventory - it's very important because of items limit.
New portal keys screen.
Remove original items screen.
Shortcuts to various actions from the main screen.
Modify chat to make it easier to read and harder to accidentally send private message to public channel.
Link to portals from system messages in the chat.
Real-time distance to portal on details and upgrade screen - its necessity is obvious to anyone who played Ingress
Additional info about the portals directly on the map screen.
Logging and statistics.
Circles around the player similar to one at 40m - just for better feeling of the distance.
Number of keys on portal info, upgrade and linking screens.
Config: update interval.
Config: maximum scanner zoom out.
Deploy button uses highest available resonator, not lowest.
3. Automation of some more complicated or repetitive tasks - it delegates multi-clicking to the squad of highly trained monkeys, but it won't think for you:
Dropping/recycling multiple items of the same type at once.
Firing multiple XMP
Picking up all items in the range - with above it's very easy to give items to other agents.
Hacking all portals in range - not very useful because of timers
Auto deploy resonators using a template.
Templates specific to a portal.
Other agents presence detector.
4. Smart assistants:
Hacking timers for each portal: both 5m and 4h ones.
Auto hacking portals in range while moving (using timers).
Smart auto-deploy.
XMP damage assistant.
Linking assistant for optimum CFs in a specific area.
Continuous linking assistant.
Bugs:
The maps are gray when submitting new portals or reporting bad ones.
NEWS
v1.26.1-broot-0.2.0 has been released!
2013.05.26
Updated Ingress to 1.26.1.
Added layouts for small screens: Eugene's 1.26.0.20130526
Added mute version - for smaller size and likely smaller memory usage.
Added fullscreen mode.
Added option to disable portal particles and xm particles.
Added restart button - it's useful for reloading UI changes (fullscreen mode, layouts, etc.).
Fixed gray maps problem.
v1.26.0-broot-0.1.0 has been released!
2013.05.22
Initial version.
New screen with mod settings, credits, etc.
New inventory screen with items presented as a clear table.
Number of all items in the inventory.
CREDITS
Eugene Kartashov - layouts for small screens.
Of course Niantic Project for this awesome game!
Thanks!
FEATURES DESCRIPTION AND NOTES
1.5. Change colors of factions.
I did this before and it's kind of cool: https://plus.google.com/u/0/106080343103638200670/posts/a9krpWApjz5
2.4. New portal keys screen.
I have some ideas, e.g.:
keys grouping/tagging
group/tag keys manually or automatically by their location, name, etc.
filters and sorting by: name, distance, level, owner, etc.
, but I think Niantic want to improve keys management, so I wait for their move.
2.5. Remove original items screen.
For now even if you prefer new items screen the original one is still needed to access portal keys. We can wait for 2.4. or at least add an option to limit original items screen to portal keys and rename it accordingly.
2.6. Shortcuts to various actions from the main screen.
I think it's one of the most important additions, so it has to be well designed. I see it as a HUD-like buttons similar to "FIRE XMP" when you long-press on a map, but much smaller, probably square with icons. Things to consider:
toolbar at the top or the bottom of the screen - I think it's better than left/right
fixed with 5-6 icons (4" screen) or scrolling horizontally
fixed icons or customize them and their positions
an option to open a full semi-transparent menu with all available actions
Actions could be:
fire last XMP
fire highest/lowest XMP
fire XMP of specific level
same for power cubes
hack portal - click button then click portal. This way you don't have to enter portal details screen which is faster and you don't lose the map.
link portal - same as above
set target? It's in a long-press menu already, but we can add it here for consistency and maybe to remove long-press menu.
actions from other mod additions
2.7. Modify chat to make it easier to read and harder to accidentally send private message to the public channel.
Current problems are:
is there anyone who has never sent a private message to the public channel? Is there anyone who did this only once or twice?
it's hard to read conversations between agents, especially public ones, because they're mixed up with system messages
I was considering adding some kind of filters to select which types of messages you want to see, but it doesn't fix first problem. Now I think of something else - 4 tabs/channels:
faction - as normal
public - public conversation only, so system messages won't disturb you and you don't accidentally respond [secure] messages
system - you can't send a message here
all - all above, so it's similar to current "All", but you can't send a message here - you have to choose proper channel intentionally. It can have additional filters to select messages to show.
This feature may be hard to do or even impossible, because most probably Ingress server doesn't have API to filter messages as above. Of course I can read "All" channel and filter it on the app side, but it may not be that good.
Also I won't be surprised if Niantic itself will redesign chat in the near future, because it's definitely wrong.
2.10. Additional info about the portals directly on the map screen.
E.g.: level, if you have a key (how many?), etc. It could be customizable and there could be a shortcut to toggle showing this info.
2.11. Logging and statistics.
I love this one I can log all kind of actions like: hacking, attacking, dropping and picking up items and XM, deploying resonators and portal mods, adding custom "snapshot points" to organize above, etc. and then create a lot of various statistics:
how many hacks did you do (faction, enemy, neutral) today, in last week or month?
how many items did you get from these hacks?
what were the levels of hacked portals and items?
how many XM did you get?
how did you spend this XM?
how many resonators did you deploy and what were their levels?
how many resonators did you destroy, how many portals did you capture?
how many links and CFs did you create/destroy, what were their MU values?
which portals do you hack/attack/build most often?
how much time you was playing?
what items did you spend to build up a farm and what items did you get from it?
Statistics could be tabular, graph, pie and very flexible. I'm also considering two things:
sending some of above statistics to my server to create global statistics for all users. It would let us do some research, e.g.: what is the probability to get L7 item from L6 portal, etc. Of course sending these statistics would be fully optional, you would have to enable it by yourself.
optional paid application to read these statistics - in addition to the free one. It could let you remove ads or just say "thank you" (i.e. it would be the same as free one), but I don't want to piss off someone in Niantic. I think it would be fair, because statistics app would be quite complicated and time consuming and there will be free version, but you never know what's the opinion of other people.
What do you guys think about above two things?
3.5. Auto deploy resonators using a template.
Agent can configure multiple templates and choose one of them when doing an auto-deploy. Template could be defined by:
its name
minimum and maximum level for each resonator
prefer lower/higher level for each resonator
Examples:
"Lowest portal" - each resonator set to L1-L8 and prefer lower for all - it's the same as clicking "deploy" 8 times.
"Highest portal" - L1-L8 and prefer higher for all
"Highest <L7" - L1-L6, prefer higher for all
"Standard L4" - L1-L6, L1-L4, L1-L5, L1-L4, L1-L6, L1-L4, L1-L5, L1-L4, prefer higher for all - it's standard 4xL4 2xL5 2xL6 and it'll use lower resonators if you don't have all of them
another "Standard L4" - same as above, but L6-L6, L5-L5 and L4-L4 - it won't automatically downgrade resonators, but warn you about the lack of resonators
Also some templates could be predefined by default.
It won't work well with existing resonators, it won't choose optimal way to upgrade them, but this is how it should be - it's just: "do it using a template", not: "Calculate optimal situation".
3.6. Templates specific to a portal.
Extension to above: sometimes you know that e.g. NE resonator of some portal is harder to destroy, so you want to place highest resonator there. You can create a template specific to a portal, so it won't mess up main list of templates and it will be auto selected when doing auto deploy for this portal.
3.7. Other agents presence detector.
It read system messages log to find the last actions and positions of other agents (actually positions of portals they've built/attacked). This information could be used to e.g.:
show last position and action of specific agent
show a list of nearby agents: allied or enemy
alert if some other agent will show up below specific distance from you
4.3. Smart auto-deploy.
E.g.:
calculate max level of a portal that you can build alone - depending on your inventory and already deployed resonators
deploy minimum number and optimum resonators to get to specific portal level
prioritize excess resonators and save scarce ones
deploy high and low resonators evenly to make attacking a little harder
if upgrading existent resonators, prefer to upgrade ones with low XM
4.4. XMP damage assistant.
E.g.:
approximate damage dealt using specific XMP in current position
calculate the best spot to fire XMP of some level
4.5. Linking assistant for optimum CFs in a specific area.
You select a group of nearby portals, assistant build links and guide you through place to get as many CFs and AP as possible.
4.6. Continuous linking assistant.
You see an icon near the portal if it's possible to create a link(s) from it to create a CF. It let you create this CF with few clicks.
It may be not possible to do, because it would have to scan big area to know if there are a link between remote portals.
MOTIVATIONS AND FEW WORDS TO NIANTIC
As I stated above my goal is to make Ingress game better and more enjoyable for people. If you think it's evil then please read my motivations and explanation below:
There aren't and never will be features for cheating: location faking, sending same action several times, automatic passcode submitter, etc.
As I said above I have divided mod features into categories of different "dirtness level". I focus on "clean" features and I'm open to suggestions or criticism from players or even from Niantic itself.
I don't share my code and I obfuscate it to not make Ingress easier to hack by other people.
A whole game and world of Ingress is about hacking and reading between lines. I think my mod fits this world perfectly. There are some people who leak Ingress app from NIA and there is some guy somewhere in the internet who tries to get even more from it. It makes perfect sense
I think there are many good features that will be never added by Niantic. I see several reasons: statistics won't be added because it doesn't make much sense for storyline. Why NIA would add such feature? Intro skipping or new items screen won't be added because these features prioritize quick access over a nice look. Niantic can't do the same because Ingress would look like a game for nerds. But there are many people who don't care about the look because... they're nerds ;-P
And finally: I won't fight Niantic, so if they don't like my mod and decide to react then there will be no mod anymore.
If you're from Niantic then please think what is the best for Ingress users. If you don't like one or two of my features then I'll remove them and keep the valuable ones. If you still think this mod isn't good and it's a matter of time before you react then please do it sooner, not later. Mod won't be very popular yet, Ingress players won't be disappointed so much and I won't lose a lot of my time
FINAL NOTES FOR USERS
Once more: feel free to suggest new features or changes to existent ones. You can also criticize a whole mod idea. I want to know what do you guys think about it.
If you get a force close then post a logcat and mod version here.
If something doesn't look ok then post a screenshot. I have a 320x480 and 480x800 devices, but I can't test it on 240x320 and >480x800 resolutions.
You can also report language faults in the app or even here. English isn't my native and I often write something that doesn't seem natural even to me. I would be happy if someone would suggest better names or descriptions for configuration options, etc.
Of course you can redistribute this mod, but please don't do that if you don't have a good reason. I just want to know how popular it is. Also if you redistribute it then please add a link to this thread to give users a full context.
If you want to make a donation then link is in my signature, but remember that this mod may be killed by Niantic at any time.
[RESERVED]
[RESERVED2]
Very amazing
I'm gonna try it out on a new account just to be safe, but I love the work and holy cow you did a lot and I can't believe it.
Niantic better sit down and learn some must needed features and options. The globe one for sure
Sent from my MI 2 using Tapatalk 2
Keep up outstanding work. I just installed this mod and I confirm that it works flawless.
I'm looking forward to future updates.
iBotPeaches: I did a lot? But you have noticed that above features list is mostly a TODO and for now there are just new items screen and intro skipping? I'm not sure if this is clear from above posts.
I wanted to release it early to get some ideas from people.... or be banned
What about a nosound version? It reduces the app size and removes the annoying sounds for people that are tired of hearing those squeaks
Please find attached a nosound version prototype.
it will be possible to have screen: "exit. are you sure?" when accidentally using back button?
Brut.all said:
iBotPeaches: I did a lot? But you have noticed that above features list is mostly a TODO and for now there are just new items screen and intro skipping? I'm not sure if this is clear from above posts.
I wanted to release it early to get some ideas from people.... or be banned
Click to expand...
Click to collapse
Ahh, I thought you did all that stuff that was bolded in the features list Guess I didn't read it well enough.
Hi, on mine HTC Desire it crash suddnly..
EDIT: Reinstalled, work like a charm..
One thing possibly worth pointing out: I think this version will not handle the new push messages, as I believe those are restricted by the certificate used to sign the app. Are you able to confirm this?
Otherwise, very cool work
phyreskull said:
One thing possibly worth pointing out: I think this version will not handle the new push messages, as I believe those are restricted by the certificate used to sign the app. Are you able to confirm this?
Otherwise, very cool work
Click to expand...
Click to collapse
They do work for me, at least the "@" notifications
Needs further testing.
Jackos said:
What about a nosound version? It reduces the app size and removes the annoying sounds for people that are tired of hearing those squeaks
Click to expand...
Click to collapse
Usually more variants = more problems, but I think mute version may be worth it. It's almost 3 times smaller and space is crucial on many devices. It might also use less RAM and start up faster, because sfx are usually preloaded into memory. I'll do some benchmarks.
ataru said:
it will be possible to have screen: "exit. are you sure?" when accidentally using back button?
Click to expand...
Click to collapse
Sure, but what for? If you accidentally exit application, you can return to it in no time.
phyreskull said:
One thing possibly worth pointing out: I think this version will not handle the new push messages, as I believe those are restricted by the certificate used to sign the app. Are you able to confirm this?
Click to expand...
Click to collapse
I'm not sure about it. I got comm notification today, but I was using Ingress just moments earlier, so it might be background service, not push. We'll see.
Brut.all said:
Usually more variants = more problems, but I think mute version may be worth it. It's almost 3 times smaller and space is crucial on many devices. It might also use less RAM and start up faster, because sfx are usually preloaded into memory. I'll do some benchmarks.
Click to expand...
Click to collapse
Exactly my point of view
However it's a pity that the app uses this same amount of RAM. It might get better if you remove corresponding baksmali lines, I just removed the sound files.
Brut.all said:
Sure, but what for? If you accidentally exit application, you can return to it in no time.
Click to expand...
Click to collapse
I guess it's because on low ram devices the app gets closed instantly. So a back fail-safe button would save him the app loading time.
Impressions and suggestions
Nice mod!
I am an addicted Ingress player and I really appreciate your work!
The new item tab is awesome!!
I only want you to know that there is a G+ user that is modding Ingress too:
Have a look here.
He did a version even for 240x320 screen.
Maybe you can have a look at his work
I hope you can keep this up to date
Works perfectly!
I'll keep an eye on that, your features list sounds extremely promising!
ingress-1.26.1-broot-dev1.apk
It's muted and should work on all screen sizes. Layouts for 240x320 and 320x480 were created by Eugene Kartashov (thanks!), but I have integrated them into single universal apk. It's just ~0.5MB larger than Eugene's separate apks. I can't test it on 240x320 because I don't have such device. Please confirm if it's ok or not. I'll add fullscreen feature before 0.2.0 release, so upgrade button won't overflow on some devices.
Also I can confirm sounds are loaded on demand, they aren't preloaded, so muted version shouldn't boot up faster. It should take less memory though.
Is there anyone who miss these sounds? As I said I would like to avoid fragmentation and I think muted version is just better.
And if you have 240x320 device then please tell me if new items screen looks ok, especially if you have 100+ items of one type. 320x480 seems to be ok.