1 registered members (SBGuy),
652
guests, and 3
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Re: Is there a way to define an array bigger than 999999?
[Re: jumpman]
#466089
05/24/17 15:24
05/24/17 15:24
|
Joined: Oct 2011
Posts: 1,082 Germany
Ch40zzC0d3r
Serious User
|
Serious User
Joined: Oct 2011
Posts: 1,082
Germany
|
This might be only true for C/C++ and not necessarily Lite-C since I didnt reverse engineer it yet: Those arrays get "allocated" depending on where you put the definition to. If its global it gets "allocated" in the .data or .rdata section of your resulting/compiled PE file. If the definition is on the stack, this data is directly allocated on the stack. Theres another way to get memory dynamicly at runtime, which is called malloc. It can allocate memory on the fly and also free it again, also you dont want the engine to save this array since you can read it yourself from a file if you need it. The engines save function is a way more complex then you might think, it has an internal structure (linked list) to keep track of all objects and there state in the game.
TL;DR: Arrays are designed for data you know the size of, if the size is by any mean dynamic you have to use malloc/free
Last edited by Ch40zzC0d3r; 05/24/17 15:26.
|
|
|
Re: Is there a way to define an array bigger than 999999?
[Re: Ezzett]
#466115
05/25/17 16:42
05/25/17 16:42
|
Joined: Apr 2002
Posts: 1,246 ny
jumpman
OP
Serious User
|
OP
Serious User
Joined: Apr 2002
Posts: 1,246
ny
|
Thank you Ezzett, That was amazing. I looked all over my script, and saw many huge Var arrays that I made "just in case i wanted 10k entities to store vars each" and didnt realize many of these huge arrays were taking up megs!! I shortened the arrays after I tried: int* nodes; nodes = sys_malloc(huge * sizeof(int) ); //needs about 470 MB and GS gave me an error on compile saying: Wrong type P_MUL:POINTER:LONG:POINTER
|
|
|
Re: Is there a way to define an array bigger than 999999?
[Re: Ezzett]
#466120
05/25/17 19:45
05/25/17 19:45
|
Joined: Apr 2002
Posts: 1,246 ny
jumpman
OP
Serious User
|
OP
Serious User
Joined: Apr 2002
Posts: 1,246
ny
|
My mistake. The below snippet doesnt give me errors. Did i do this right? I wanted to make it the maximum value:
int* mega_nodes;
mega_nodes = sys_malloc(2147483647*sizeof(int));
I did that not inside a function or anything, just where the other vars are declared. After doing this, can i do the following? mega_nodes[2147483647] = 2147483647? which is to go to the last slot and give it a value. A question: 1. 2147483647 x 4 = 8589934588 bytes, which comes out to 8.589 gigs! This is allocated in the GS Nexus, correct? I dont notice an increase in MB in the nexus statistics panel. I duplicated the sys_malloc with multiple different ints, each to the max int value, and my memory usage nexus-wise hasnt increased. Is this because nothing was actually stored in the array, and its just marking this memory area as "DO NOT TOUCH" for any other memory calls?
|
|
|
Re: Is there a way to define an array bigger than 999999?
[Re: Ch40zzC0d3r]
#466122
05/25/17 21:18
05/25/17 21:18
|
Joined: Jun 2009
Posts: 2,210 Bavaria, Germany
Kartoffel
Expert
|
Expert
Joined: Jun 2009
Posts: 2,210
Bavaria, Germany
|
What exactly do you want to do? You haven't pointed out the goal of all this but from my perspective this approach seems a bit strange. There's probably a better way of doing this.
POTATO-MAN saves the day! - Random
|
|
|
Re: Is there a way to define an array bigger than 999999?
[Re: Ezzett]
#466124
05/26/17 04:10
05/26/17 04:10
|
Joined: Apr 2002
Posts: 1,246 ny
jumpman
OP
Serious User
|
OP
Serious User
Joined: Apr 2002
Posts: 1,246
ny
|
Hey everyone! See if you can bear with me:
The reason for all this is because, I am porting an old A* code from George's AUM all the way from A6. In the script, it uses a big array to store path information, its a big array that should be big enough to hold Max_nodes*Max_nodes. So since a Var array cannot exceed 999999 slots, the maximum amount of nodes I can have in the level is roughly 999, since 999*999 = 998,001.(in a test level, I kept the max nodes to be around 980 just because). My test AI pathers can run around this huge level perfectly fine (aside from adding local avoidance). I am a little hesitant to move to a different pathfinding code just yet, because I know this one already, and I can get it working if I keep the node count under that limit, and I am perfectly fine with that. I can just increase the range at which nodes can connect to each other, as well as be stingy within reason when placing nodes in the level. (I have downloaded Superku's pathfinding, and I will be trying that in a new project when I get to that point as well.)
But I want to see how far I can potentially go with this current pathfinding, mainly in how many nodes I can push. At one point, I was able to have 1600 nodes, and have the AI's run around correctly as well! But the problems here was that:
1. Path calculation for 1600 nodes took a long time, so I was looking into ways to save paths for each level beforehand. (I have found a way to do this using game_save with SV_info, and with array names ending with _i. Using memcpy seen in another thread, I was able to copy the saved array into the working array. But this also got me thinking about how data types are stored and read)
2. I wasnt using sys_malloc, and if I wanted to save the game, I ran out of memory!
3. The code would crash randomly at the start, and at times it would crash and give me seemingly random errors in unrelated functions, which meant memory wasnt being managed right.
So thats why Im looking to see how big an array I can get, which will let me know how many nodes I could feasibly attain. If I can correctly allocate a big array, as well as be able to find any position in it using the multidimensional maths, I could then see if I can add more nodes.
It may not be feasible to have 4000 nodes in your level for a finished commercial game, because you have GUI, graphics, animation, physics, sound, music, input, collision detection, all competing. But if Im doing foundational stuff, I would like to try to see how far I can get it now, and when I have the worst case scenario running correctly, I can worry about pulling back when it comes time to make an actual level.
Last edited by jumpman; 05/26/17 04:18.
|
|
|
Re: Is there a way to define an array bigger than 999999?
[Re: jumpman]
#466138
05/26/17 15:11
05/26/17 15:11
|
Joined: Aug 2003
Posts: 118 Deutschland
Ezzett
Member
|
Member
Joined: Aug 2003
Posts: 118
Deutschland
|
Steering behaviors work by giving an entity a goal (a position in your map) an tell the entity what to do with this goal (walking over to the goal, running away, pursuing a moving goal, velocity matching and so on). You do this by giving your entity a velocity or acceleration. You can add collision avoidance so that entities run around objects while getting to their goal. Of course, this will not work for tight or complex geometry, here you need pathfinding. But you can combine entities to groups and create coordinated movements and it will look really complex and "intelligent" while being fast to compute and not so hard to implement, depending on your programming knowledge. I read about this topic in the book 'Artificial Intelligence for Games' by Ian Millington. In the book he uses high level pseudo code, but he offers source code for many (not all) techniques on www.ai4g.com. For example, if you look at the code for some steering behaviors at https://github.com/idmillington/aicore/blob/master/src/steering.cppyou'll see that each steering behaviors consist of just a few lines of code. https://www.youtube.com/watch?v=PJCSvRh9ljI
|
|
|
|