Is this still usable for modern work and does it lag?
Does this module also use the new parallel library features? that may be given a boost in this module of yours
Uh, nevermind, this module seems to be very tedious anyway.
Lag: no.
Usable for Modern Experiences: yes
The only real lag you might notice is the initialization, which is where most of the âworkâ is done. Although indirectly alluded to in the thread, the module works by essentially chopping up 3D space and using the segmentation to efficiently sort relevant instances. This optimizes things significantly.
If youâre interested in a benchmark on efficiency, CullingService is able to fully initialize my experience with the following stats:
Game Volume: ~ 150 billion studs (true number is 149,698,256,400) [it is a very big map]
Region Length: 250
Approximate number of initialization calculations: ~10-10.5k (wrote this down a while ago, but didnât save the exact amount)
Initialization Time: ~16ms seconds (true number is 15.976020006928593)
This will obviously be affected by your own configuration, instances, etc. but it blazes pretty fast.
Does it use the new parallel library?: no.
The source code is viewable here (can also be found in the OP). This was developed before the parallel library and from my understanding, the parallel library is really intended to let your experience run in parallel, not just individual modules. If you want to run this in parallel, it shouldnât be difficult. If thatâs incorrect, let me know - Iâm not super read up on it.
Tedious: aight
I would highly recommend re-reading the OP and checking the source code to see if this fits your projectâs needs, because I think a lot of your questions are already answered there.
To quickly sum it up, this is designed as an alternative to StreamingEnabled primarily geared towards programmers (allows control over which assets are specifically streamed) and high-intensity builders (i.e., those whose builds require sufficient optimization, but want more precise control of what is streamed and at what range it is streamed). Iâm sure people have found other creative uses for it, but thatâs the primary idea behind it.
Its very boring to go through a lot of steps to apply this service in games with alot of assets and if you ever think to update it then hopefully use the new parallel feature since it may give another advantage to this module but more importantly hope you can make it more clear and easier to setup your module more quickly As I see more ways to improve this moduleâs setup procedure.
(TL;DR, becasue the response got long: configurable code unavoidably requires configuration, if this is a serious barrier to you + this is relevant to your experience - Iâve added some console code to help you out)
I think thereâs some kind of miscommunication. CullingService is not designed or intended to be some kind of automatically initialized/self-determining system. Thatâs very much in the vein of StreamingEnabled, which indiscriminately streams everything in and out (more or less).
CullingService is designed to be configurable. This lets you reap the benefits of streaming objects in and out while still maintaining very precise (at least relative to the default engine options) control over your experience.
However, the clear downside of a configurable system is that it requires configuration! Like most things (ex: redoing a UI framework, shifting data/replication handling, etc.), converting an existing experience over is going to be more time-consuming than starting at the onset. It can be necessary, but itâs definitely not flashy development - we can agree on this, Iâm sure.
With that said (and assuming you have good naming conventions in your experience, i.e., not âModelâ everywhere). You can expedite the process with some simple console work.
Run this in your console
for _, Model in ipairs (workspace:GetChildren()) do
if not Model:IsA("Model") then
continue
end
local MediumFolder = Instance.new("Folder")
MediumFolder.Name = "Medium"
for _, Child in pairs (Model:GetChildren()) do
Child.Parent = MediumFolder
end
MediumFolder.Parent = Model
end
Wrote without testing - should work, but itâs possible there is a typo
Add the 5-6 necessary folders (per instructions)
Open the plugin, initialize it, click the auto button.
And, your place should be set up.
With that said still, if youâre averse to steps, then itâs very possible this is simply not necessary for your experience. If your experience from a programming perspective isnât detrimentally affected by StreamingEnabled, that might be better for you - itâs definitely easier (because itâs a toggle setting). If youâre not overly concerned about performance controls, then this simply might not be relevant to you.
I was just saying, good luck tho.
Hey! This is a awesome module so far, it is really something I wish Roblox could support natively already for larger more open and detailed worlds.
I was just curious if this supports models with varied rotation, scaling, and colors?
For example, can I use this module to cull in and out a field of flowers that are randomly larger or smaller than one another, or rotated to grow with the direction of a hill?
Iâm not sure, but I have tested around a bit, and found that it doesnât seem to work, unless I have done something wrong.
Anyways, thank you for the amazing free module so far!
Heyo!
Right now CS doesnât support that, but thatâs a really interesting suggestion. This is definitely something thatâs possible to implement, the only drawback(?) would be that each time you would generate an experience it would be somewhat different. Maybe thatâs a positive in some ways, though. Definitely possible to add, and Iâm looking into it.
Could you explain a little more what you mean by this? Is it that the model isnât properly rotating when you rotate the anchor point, that generating the anchor point doesnât respect rotated models, or is this in the line of randomization?
Update
- Fixed a bug that prevented large regions from being effectively created
- Added GoodSignal compatibility and API calls (this should now make it easier to easily create client-sided events utilizing motion)
New API Functions
module:CreateSignalForModelCullIn(ModelName: string)
Returns a Signal which is fired every time a model with the name provided is culled in. Signal provides the model as a first argument
module:CreateSignalForModelCullOut(ModelName: string)
Returns a Signal which is fired every time a model with the name provided is culled out. Signal provides the model (in this case, nil) as a first argument
module:CreateSignalForModelCullInAtRange(ModelName: string, RangeName: string)
Returns a Signal which is fired every time a model with the name provided is culled in. When the Signal is fired, it provides the model (in this case nil) as the first parameter
module:CreateSignalForModelCullOutAtRange(ModelName: string, RangeName: string)
Returns a Signal which is fired every time a model with the name provided is culled out. When the Signal is fired, it provides the model as the first parameter
Example API usage (direct from my project, which makes a boat sway with the waves when culled in)
local function ListenForShips()
for _, ShipName in pairs (AllShipNames) do
local ShipAdded = CullingService:CreateSignalForModelCullIn(ShipName)
ShipAdded:Connect(function(Ship: Model)
HandleShip(Ship)
end)
end
end
Two things,
One I think you should add a setting to use an objects Pivot Points keeps it up to date with modern day roblox technology plus Iâm pretty sure the current positioning function your using is deprecated.
Two, It seems like not all the objects in a region load and its random at that. Iâd suggest looking into it as it doesnât seem like its a guaranteed your objects will get loaded
CullingService Testing.rbxl (224.6 KB)
Thanks for the bug report! I found the issue - it was an attempted optimization that affected that way that anchor points were initially sorted. The issue should be fixed now (fixes applied to your repro file attached). Fixes are also live on GitHub, test place, and Roblox Library.
Thanks for the suggestion about pivot points, itâs not something I was familiar with before, but it looks to be a handy feature. Iâll look towards migrating to that soon, appreciate the heads up!
CullingService Testing Fixed.rbxl (224.2 KB)
I swear this doesnt work for me. It just doesnât seem to spawn in when I test the game
Hi, if you send me a repro file, DM, or add me on Discord, Iâd be happy to check it out and see if thereâs an issue with set-up or a bug.
I got it to work on a new baseplate; Iâm guessing something in the old Roblox place is bugging it out. Thank you for replying tho
CullingService V2
Download
GitHub Repository
Roblox Library Model
Roblox Library Plugin
Example Place
Key New Features
- Added animation framework for developers to control streaming aesthetics
- Added five animation presets: Rise, CartoonRise, SpaceShuttle, Transparency, and Blink
- Fully modular (previously involved some hard coding related to the default âShort,â âMedium,â and âLongâ distance folders)
- Significantly more reliable (now employs back-up checking)
Animations?!?!?
Yup, developers can now add animations to CullingService as a way of controlling the aesthetics within their project. Perhaps you want to make culled objects subtly load into the background by fading their transparency in? Maybe, you want a very obvious cartoony load-in: rather than hiding the streaming process youâd like to embrace it! Who knows! CullingService includes a very easy to use animation system that essentially lets you freely tailor the callback animation directly. This handler contains a Template module and 5 presets to serve as examples.
Previews of 3 Presets
Transparency
Rise (for that subtle feel)
CartoonRise (for that cartoony simulator-y feel)
To activate an animation package (or your own), go to Settings â Animation Package and change that value to the package name. If it is nil, no animation package will be provided.
Ex:
local module = {
["Animation Package"] = "CartoonRise", --// Defaults to nil for backwards compatability
--// The rest of the settings....
Create your own animation package, just modify the clone the Template in CullingService â AnimationPackages and modify from there. It should be pretty self-explanatory and the 5 presets are intended to be used as references.
Note: these have not been benchmarked, but all presets ran in Studio at a comfortable 240-270 FPS (which is my average FPS anyways). FPS may be affected based on the complexity of your animations and the numbers of instances being animated at any one moment
Full Modularization
CullingService previously had a few points in the code that were hard-coded to the moduleâs base (range folders of âShortâ, âMediumâ, and âLongâ). This has been removed, so that developers can add as many range folders as they want. This allows developers to better specify the ranges for certain instances (ex: giving terrain elements, landmarks, or particular instance types their own ranges). Hopefully, this lets developers take even more control of their experience.
Bug Fixes and Other Random Stuff
Check the GitHub commit if youâd like more details (as well as the side-by-side comparison of code changes)
How to Upgrade to V2
Just replace the old CullingService modules with the new one. There are a few small changes to the Settings, so I would recommend loading in the new Settings module and then just manually setting them again (if you arenât using the out-of-the-box configuration). Because there are a couple new settings, CullingService V2 is not completely backwards compatible with V1.
Donât fret though, the conversion is minimal. Your models are also fine. The plugin was not updated and does not need a redownload or update.
Legacy Downloads
CullingService V1 Legacy Model.rbxm (25.2 KB)
CullingService V1 Legacy Testing Place.rbxl (113.3 KB)
Because CullingService V2 is not backwards compatible, the latest V1 variant has been included for your convenience. This should function perfectly fine, however, I highly recommend using CullingService V2 for more control.
Enjoy!
Small V2.1 update
- Added âReset Anchor Pointsâ to the plugin, which allows you to select anchor points, cull them back in, and then delete the anchor points in one fell swoop. Perfect for that âwhoops, didnât want that to be culled out⌠crap how do I reset this??â moment. Realistically, this new button + auto add selection are probably the only two buttons that you need.
- String formatting fixes to the plugin
V2.2 update
- Added Setting âIgnore Y Dimensionâ. This performs magnitude calculations ignoring the Y dimension (because anchor points tend to be higher than the actual player position when applied to large models). For any experience utilizing large structures (ex: buildings, tall trees, etc.) this will make things calculate more logically.
This change is backwards compatible, you only need to update the CullingService script. You can update your settings module by manually adding the entry [âIgnore Y Dimensionâ] = true (or false) to your module.
V2.3 update
- Added ManualCulling with
CullingSerivce:ManualCull(Position: Vector3)
. This allows you to manually cull around a specific point on the map and will halt culling around the player. This will be ended when callingCullingService:Resume()
. Useful if you want to manipulate the camera in a custom manner and then cull around the camera vice the player (ex: intro screens) - Added manual refreshing, essentially calling the functions that cull around the player with
CullingService:Refresh()
- Added AutoStart Setting (backwards compatible with previous Settings). Setting this to âfalseâ will mean that CullingService does not start once initialized. You will have to then call
CullingService:Resume()
for CullingService to begin cull objects in/out. For backwards compatibility, if the setting does not exist, it will default to enabling AutoStart (previously normal behavior) - Removed Settings[âPausedâ] (for consistency - use the methods
CullingService:Pause()
andCullingService:Resume()
for future work) - Bug fixes and improvements
Hi, I canât seem to be able to set up this, I made a model with the 3 folders in it, and i placed a part in the easy one. However, On step 9, i select the model and then click generate anchor points and the primary part is created, but there are no anchor points on the workspace AnchorPoints folder. I think this is the main problem, but then when i click the Add Selection to Model Storage button, it gives an error on the output:
cloud_7064741679.PluginCode.CullingPlugin.Culling:136: attempt to index nil with âFindFirstChildâ
Can anyone help me please?