While it may be true that Roblox uses 8 byte numbers in Luau, you can get 4 byte numbers through buffers
I take issue with the new storage limits.
This change benefits only Roblox while harming developers. There are no positives whatsoever for the developer. The future storage limits for anyone that doesn’t know, is a base 100MB for the game with an extra 1MB per unique player that has played the game. Personally, if these changes are final, I’d end up losing a project I’ve worked on for 2+ whole years! More on that at the end.
The real problem here.
Roblox needs to look into how a game increases or gets its limits. Going from unlimited storage to a literal megabyte per player is too sudden and large a difference. Technically the difference is infinite but we don’t talk about that.
There are millions of games where probably nothing even happens, the base 100MB allocation not even being required. Then there’s the few thousand that actually do things! The way allocation is being handled right now is simply terrible.
This should be public information.
During development of my own project, I have not saved any world data into Roblox’s servers during testing because the values I am working with will change as I work on it. Now I’m being punished further, because Roblox’s automation wouldn’t even be able to figure out that I will be going to be over the limit since I did them the favor of not saving anything yet! This means I will never even receive said inbox message in question until I finish my game! Aka, far too late. This shouldn’t even be an inbox message for a few users. It should be visible to absolutely everyone in the off chance it actually has something useful!
There’s no way the acclaimed “0.0000054%” of experieneces that go over the limit by a good margin aren’t going to have some sort of special treatment. We should all be made privy to what will happen in the off chance another developer happens or will happen to fall into that group. There are already developers cancelling their projects due to the uncertainty raised by Roblox and that is absolutely terrible. Could be me too!
To the developers who are not hitting this limit.
I see a lot of developers claiming things like:
- “The storage allocation is enough”
- “You’re not the 30 in 55 million”
- “It’s unrealistic to go over”
I don’t agree with these stances, while for most games this may be true. This stops creators both now and future from potentially making something truly great. To see their ambitions realized. Or to you know, not have their efforts wasted. There’s a limit to how much you can crunch your data and it’s not fair for the people that are affected.
Bonus
How this affects me.
I have spent nearly 2 years slowly working on a project, dealing with all of Roblox’s issues and new features coming out. Countless hours of rewrites, planning and learning. Now all of that time spent would come to waste immediately with these new limits. It was annoying enough having Roblox bugs stop me at every step, new features superceding custom implementations and more. This change would be the equivalent to slapping me and pointing the middle finger at me for all my hard, and unpaid work!
I’ve been working on a 2D grid based sandbox game where a world is generated within a given size. But every cell in the world can be changed by the player. Of course, due to gameplay reasons there may be extra data required per cell. And I don’t think I can even allocate 1 world for a player anymore.
I need to plan for the absolute worse case scenario, and the worst case scenario is the player has changed every single cell in the grid with unique values. My game requires 54 bits (7 bytes rounded up) per cell. My game requires all 54 bits, this is not up for discussion, you do not know what my game entails. I am not here to be told how to optimize my game, I’ve had plenty of time in those two years to learn lots of things and decide on how I should structure my game based on it’s needs. I am not so ignorant as to ignore further optimization, but I know what my game needs and really, do not wish to have to go there again.
Roblox does some compression on their end, but I am not 100% sure as to exactly how it works so I can only assume the worst case scenario is worse than it really is.
How little 1MB can be.
Let’s create a hypothetical where miraculously I only required 24 bits (3 bytes), the same amount of bits required to store a color value (I am not doing this).
I would only be able to fit a grand total of 333k cells with this! Now, 333k sounds like a lot. But remember, not only are we playing for the worst case scenario, but 24 bits isn’t much. It wouldn’t even be enough for a 600x600 image! If a minecraft chunk in the worst case scenario took up 3 bytes per block, you wouldn’t even have 2 chunks!
The worst case scenario for your information, is completely random values. Absolutely zero repeating patterns that can be compressed. It is impossibly likely that would ever happen, but the importance of planning for the worst case cannot be underestimated. Imagine your game blew up, and then loses all momentum because you hit a limit!
It is very rare that any game that isn’t just a baseplate is gonna have a cap of 1 MB, if you have any amount of visits at all you’re not gonna have any problems
Honestly this is the only reasonable take ive seen here for why this update is bad… however, I do have some tips to help you out
Stop assuming for the worst case scenario, start assuming for the current case scenario.
Let’s say the player only edits like 5000 grid cells, that means you only need to store 5000 grid cells, and the rest can all be stored in a single number; the seed.
It is highly, HIGHLY unlikely a player is gonna edit every single cell, so your best bet is to do this
Also, if a player, say, sets a cell back to the value which the seed determined, do not store it any longer, and just consider it a part of the seed again.
7 bytes is already pretty good for 1 cell atleast imo, you just need to make more assumptions
You’d be surprised at what people are willing to do, really. But there are several problems. For one, you need to know if a cell was changed or not, that takes data as well. Knowing where to skip to… it’s a mess. The world in my project will change on it’s own as the game is played, there’s a lot going on. It wouldn’t be feasible, there’s a reason why I’ve taken so long!
You don’t need to store more data to know if a cell was changed… you just store all changed cells in an array, When regenerating the world, if a cell exists in the array, that means it was changed. Else, just use the cell provided by the seed
This could probably be stored as a seed/some data structure like an array of numbers as well… honestly im sorry for making you do more work but this is da way
I am storing data in a buffer, not an array. Tables would take up significantly more data as I cannot manipulate bits and bytes to crunch everything as small as possible. This approach wouldn’t exactly work with buffers.
Not accounting for worst scenario can lead to UNRECOVERABLE issues. Some are truly unreachable - like player reaching 2^64 money and then getting more, while others, like 600x600 world full changing is worst case here and is easilly reachable.
A buffer is basically an array lol, you already know the size of your cells in bytes so just store them side by side
This doesn’t work, I’m not the best at explaining but I know it’s not possible to follow that approach. Let’s say you have 3 blocks in a 3x1 grid and each block takes 5 bytes, A, B and C respectively.
“AAAAABBBBBCCCCC”
With your approach, if the grid is untouched there will be no value and it will look like this: “”
But say, we change A and C. Now we have “AAAAACCCCC”.
How will we know that BBBBB is missing? I’m saving several bytes per cell by not saving it’s positional value at the scale I am working at. If I were to do so, the size skyrockets due to how many cells I will have in the first place.
Ok… but let’s consider the fact that your games basically never have a 1mb limit… here is the limit for one of my games with 300 visits:
It is very unlikely you’ll reach the limit…
You don’t need to know BBBBB is missing… if it’s not present that means the value should be given by the seed
But there’s no positional value for you to tell that CCCCC isn’t actually BBBBB. Which we can’t include because it saves so much space.
What? How are you storing your cells bro…
Lets say i store my cells as 2 f32s for pos, and 1 u8 for type (9 bytes for 1 cell)
Lets say i have 3 cells, like this, in the buffer:
[C1 | C2 | C3] (C contains the 2 f32s and 1 u8)
I go through the buffer and place the cells into the world, and put the positions the cell occupies into some hashmap so I can check which ones have already been generated
Then, I generate the map thru seed, and if i find the position is within the hashmap, I don’t generate it.
The point is to store only changed cells, not every cell
But you’d have a set of bytes in each cell that indicate what type of cell it is, right? so when there are unmodified cells in-between the modified ones simply assign a special cell type that indicates it is unmodified and use that to represent an unmodified BBBBB.
Yes, I have this information, and I understand your approach. But again, among other reasons. The worst case scenario must be taken into account. To clarify, I expect my world sizes to be well over the amounts I had used as examples.
Let’s consider that fact that you don’t want understand the point of why this bad and trying to protect that this’s for the good.
More real case that touches my game:
My building game allows players to build their own islands.
Player can place 5k parts max. They can select material, color, CFrame, size, level.
Material is id - 2 bytes
Color is Color3 - 3 bytes
CFrame is quaternion - 28 bytes
Size is Vector3 - 12 bytes
Level is number - 2 bytes
Total per part is 47 bytes
15*5000=235000 bytes = 229.5 KB
Player can build lobby island and round island = 229.5 KB * 2 = 459 KB
And I have save files which can be created with max being 10. Now max 2 save files can be created. And I won’t allow even 2, cuz of chance that I’ll need make more islands, like for event.
Now more - I have more complex things, like smelters, chests, boxes, crushers, presses, boosters and ton more. They have additional stats saved.
And that’s 10000 parts per player only. And only basic properties change - no CanCollides, MaterialVariants and such.
Building games like Wubby, Oaklands, and even maybe LT2 are ruined now. I saw that bases having thousands of items from players. Tens thousands of parts. What now?
1 mb is 1000kb, 100mb is 100_000kb
You are far from the limit…
And considering this limit increases by 1 mb per new player, the amount of data you can use will only increase as you get more visits
have you read what I typed…
At least personally, I think it’s very reasonable to worry that your game may not be able to handle these ‘worst case scenarios’, especially given the impact that hitting this limit could bring (no player being able to save anything and potentially significant data loss / corruption)
This may not apply to their game since I don’t know the specifics but at least many other building games don’t provide strict storage limits of 1MB. Theoretically, one user could use up multiple more megabytes than they should, hitting the limit; even if some players don’t use their full allotted 1MB.
While it is very unlikely for most games, there are quite a few game genres which use up a significant amount of datastore space; for example building games and datastore-based tech-demos. The consequences of hitting these limits aren’t small either; your whole game essentially becomes unplayable if you hit this limit since you can’t save anything. Even if its unlikely to hit this limit, everyone has a different data structure and expecting significant changes to that preexisting structure is unfortunately a bit much, even for over half a year’s notice given that there isn’t any easy way to migrate to a new structure for live experiences and some of potential data structures to be affected (at least from my view) are already pretty optimised anyway, it just happens to be a lot of data being stored in them.
Many experiences are likely also unreleased but can be projected to use more than 1MB per-player through some analysis. At least personally, I think it’s reasonable to raise these concerns even without live data to back it up because the effects of hitting this limit could be detrimental; even if it is just a hypothetical as of now. As a Roblox developer I don’t want to have to bet on my limit not being exceeded randomly, which is unfortunately how this feels like, as of currently.