What kind of array thing?
BlitzMax Forums/BlitzMax Programming/What kind of array thing?
| ||
Hi folks. I need to store some data structures in memory, ie a sequence of `objects`. Let's say each has 10 fields/variables of different kinds/sizes. I need these to all be stored in sequence, ie 10 fields followed by 10 fields followed by 10 fields etc. I don't want any kind of additional pointers or indirect referencing. The memory used to store one object has to immediately be followed by the memory used to store the next object. I don't want a `pointer to an instance of the type` being stored anywhere. Yet, as I said, all the fields have to be different kinds - bytes, int's, floats, etc. How can I do this and then be able to reference the individual fields efficiently? If I define a custom type containing these fields, and then define an array of instances of that type, will that store a whole bunch of pointers to instances, or will it only store the instances in sequence? |
| ||
Strings, Arrays and any other types of Object in BlitzMAX are all references (ie. pointers, but with nicer syntax). I believe that array elements are stored sequentially, but if you define an array of a custom type, the array elements will be pointers to the instances. For example: Local items:Object[3] items[0]=New TList items[1]=New TList items[2]=New TList Print Int(Varptr items[0]) Print Int(Varptr items[1]) Print Int(Varptr items[2]) You can see that the array elements are stored sequentially, and occupy 4 bytes each, not the size of a TList object. |
| ||
Hmm ok. So I might have to either treat all of the fields as bytes and in an array of bytes, and `combine` them after reading them or `split` them before writing. Or maybe I can make it so all my fields are floats or something. Or have a separate array for each data type - probably a good idea. This is for a particle engine - the memory accesses need to be really fast and minimal. |
| ||
This is for a particle engine - the memory accesses need to be really fast and minimal. I really don't think you need to worry about the cost of dereferencing a pointer. It is absolutely minimal in comparison to the costs of whatever else your program might be doing. Have a look at the code for some of the BlitzMAX functions, and you'll see how much goes on for even some of the simple calls. |
| ||
Actually it does matter when you're thinking about processing several million particles. |
| ||
How many of these particles are actually going to be visible in any one frame though? |
| ||
7000-10000 in maximum until BM will break with default 2D drivers ... so I don't think you will have to fear this kind of "performance problem" if you are not going to create your own rendering engine / driver |
| ||
I will be using direct OpenGL. Not necessarily all of the particles will be drawn but all of those that are off-screen still need to continue their full physics interactions at all times. |
| ||
I think I will probably have to settle for a slightly less `realistic` simulation. I think that so long as it mostly `looks like` it is behaving correctly that would be good enough. |
| ||
I've never had any intrest in them, but you could use a bank. You'd have to keep up with how many of each data type you have, but you can store anything in a bank. I'm pretty sure it works like an array of bytes. So if you wanted the 4th short from the start of the bank you'd do bank.peekshort(7). |
| ||
Hmm. Well, the thing I don't like about using banks is that you have to either call a function or pass the number of the bank to call every time. It's faster to use array access on a real array. |
| ||
If you're using OpenGL directly, I think you'd be better off using C to do what you want. |