#archived-dots

1 messages ยท Page 174 of 1

trail burrow
#

@minor sluice it's like they are TRYING to mess this up

dusky wind
#

But it's not that far off from just installing packages via git url

trail burrow
#

they keep going from bad to worse

dusky wind
#

Their solution for listing it though seems headass as fuck

#

And makes discovery impossible

minor sluice
#

until yesterday when timboc told me, I had no idea that the full package name is a valid git url you can add

#

because git url isn't indicative that it means this notation (too) imo

trail burrow
#

@solid flume also, for completenss sake... calling the high bit a "sign" bit is... technically wrong

dusky wind
#

Idk, I was using custom packages via git url

#

Before they added scoped registries

minor sluice
#

scoped registries?

dusky wind
#

So this isn't too big of a departure for me

trail burrow
#

if you really want to get to splitting hairs and being technically correct level, yes the highest bit being set to 1 in signed numbers means the number is negative... but its not a sign bit... it's actually needed for calculations for sub/add/etc.

solid flume
#

Yeah true

dusky wind
#

Errr, you can add your own custom UPM packages if you set up your own NPM registries

#

I've been using it for some of my own shared libraries

trail burrow
#

@solid flume compared to floats, which have a proper sign bit - it's evne called that

dusky wind
#

Before that I just either git submoduled it

solid flume
#

I don't know floats

trail burrow
#

@solid flume floats is just base-2 scientific notation, with a sign bit in the front

dusky wind
#

Or subsequently used git urls in manifest.json

solid flume
#

Ah

trail burrow
#

and double is the same, with just more bits

#

so has higher accuracy

dusky wind
#

I forget if it allows higher exponents or not

solid flume
#

Does Physics.OverlapSphere or something exist for ECS?

dusky wind
#

I haven't checked the standard in a while

trail burrow
#

@solid flume it does 11 bits

solid flume
#

So I can check vision radius

dusky wind
#

@solid flume nope, overlap queries only support AABB testing

#

I would wager a zero distance collider cast would work though

solid flume
#

I'm questioning why I'm even trying to use ECS for abm but it's not like I have anything better to do

dusky wind
#

It seems to work in my use case

#

@solid flume vision radius might be easier with CalculateDistsnces

trail burrow
#

checking radius is easy

solid flume
#

No idea what that is

trail burrow
#

take sqr distance and compare to sqr radi

#

quick and easy

dusky wind
#

@solid flume provided a collider geometry

#

It finds the closest point on nearby colliders

minor sluice
#

so the scoped registries are essentially the qualified names like com.unity.dots.... etc?

solid flume
#

I don't see how I would use that. I give it a sphere collider, it finds the closest point on every nearby collider?

dusky wind
#

@minor sluice for example, my GGPO port has the qualified name of "com.houraiteahouse.backroll"

#

And my manifest.json says to fetch all packages starting with "com.houraiteahouse" from that registry

#

@solid flume yep

solid flume
#

But how do I find If there exists a plant in my vision radius?

dusky wind
#

You then filter it down to those that are under a maximum distance

#

The max vision radius you set

#

And that's the set of visible objects

#

Since we are operating in euclidian space, that distance automatically forms a sphere

solid flume
#

I'll have to try this and see

#

But thanks

#

I can do stuff like use a script to generate a bunch of cubes with the convert to entity component, and then run my game right? That'll work?

dusky wind
#

Yes, but if you are doing it at runtime

#

GameObjectConversionUtility might be helpful

solid flume
#

Nah, this isn't a game just a simulation I'm doing for fun, so I can (probably) avoid (most of) the fancy stuff

dusky wind
#

Or make one cube, convert it

#

And use EntityManager.Instanstiate to duplicate it

solid flume
#

Hmmm

#

I like that idea

dusky wind
#

Make sure to update the Translation component so they're not all stacked up on each other

solid flume
#

Or just don't and watch physics blow it apart?

dusky wind
#

If you are using Physics, sure

minor sluice
#

ah I see, thx,
at the moment, for my own projects at least, I'm more a fan of using git submodules than upm packages (maybe also because I haven't given the later an earnest try yet)

dusky wind
#

@minor sluice do actually try it, it's a lot less of a headache when working with people unfamiliar with source control

#

It also makes dependency management a much simpler problem

minor sluice
#

can imagine that, luckily (for this specific case at least) I work alone on my current projects. My main reason for the submodules was that I could edit the module in any project that uses it and push the changes then. Not sure if or how easy that works with packages

dusky wind
#

You generally need to republish it

#

But the intention is to have more than just you working with it remotely

minor sluice
#

but you as owner of the repository can treat the repo the package comes from as just any other git repo right? so that would mean you could have multiple local repositories of the package for multiple projects on your disk and just republish the package from whatever project you currently work in?

I think that would be an approach I'd like

dusky wind
#

Not in the same way submodules work

#

You will need to separately make changes to the repo, publish the package and update your package manifest.

#

It's not ideal for a single developer

#

But for a community or a large team, this separation is critical

minor sluice
#

ah, alright!

#

don't have much experience with working in large teams or for communities

trail burrow
amber flicker
#

haha wasn't that you who posted that @trail burrow ?

trail burrow
#

no

#

i have same name as here on forums

#

he's right tho

amber flicker
trail burrow
#

@amber flicker yeah that quote has been circulated in a lot of places now apparently

#

someone sent a pic of it to me in PM, etc lol

amber flicker
#

haha

#

I'm very anti them abandoning it but ยฏ_(ใƒ„)_/ยฏ

trail burrow
#

ditch ecs, keep jobs/burst, switch to .net 5, improve GO/MB workflow, etc.

#

stop trying to re-write the entire engine sigh

frosty siren
#

Have we today built-in system for sync data between LocalToWorld DOTS component and Transform mono component?

minor sluice
#

wow, that thread gained quite some traction

rancid geode
#

well, HPC# allows more than just burst itself, it also allows then to do their safety checks to allow multi-threading in a safe way (the one thing that no game engine solved so far AFAIK)

trail burrow
#

@rancid geode no HPC# is only for burst compatibilty

#

HPC# is just crock of shit

#

it's just that they cant burst compile more than that

#

HPC# doesn't "allow" anything, it just allows burst to work

#

by restricting the feature set of the language

rancid geode
#

personally, I really like ECS-way of doing things (not the half-baked current hybrid workflow, but the way to structure the code ifself), so I prefer to wait until 1.0 to made my judgement about if it was worth their investment or not

trail burrow
#

to basically C

#

.NET 5 JIT performs basically as well as burst, and doesn't give up 85% of the language features...

rancid geode
#

HPC# doesn't "allow" anything, it just allows burst to work
@trail burrow if you dont do things the "Burstable" way, then the safety checks won't work and they can't prevent race conditions

#

they are actually linked

safe lintel
#

Given he paraphrases you without attribution I kinda wonder if he's just spewing other peoples gripes without any real experience in using it for himself ๐Ÿ™‚

rancid geode
#

it is just that dealing with classes in c# is a mess without having an option to manually control the memory the way we can in C++

solid flume
#

How do I store a target of something I want to move to?

trail burrow
#

@rancid geode HPC# exists for burst, no other reason. You can't burst code that isn't HPC#. The safety check system has nothing to do with HPC#, it could've been built without HPC# subset.

solid flume
#

In a component

rancid geode
#

so they need to rely on a constrained version of the language for that (while still allowing entire C# stuff out of Burst context)

trail burrow
#

@safe lintel I can assure you he doesn't, i know the guy, he knows what he's talking about

rancid geode
#

@rancid geode HPC# exists for burst, no other reason. You can't burst code that isn't HPC#. The safety check system has nothing to do with HPC#, it could've been built without HPC# subset.
@trail burrow I don't see how they could guarantee the thread-safety without the HPC#

solid flume
#

Like if I want to move to something, I check if my target isn't null and move toward it's transform.position

#

How does that work out in ECS language?

rancid geode
#

How do I store a target of something I want to move to?
@solid flume you can expose an Entity field and use GetComponent<Translation>(thatEntity)

solid flume
#

Ah

#

Can I do null checks on it?

safe lintel
#

@trail burrow thats not vblanco is it?

trail burrow
#

no

solid flume
#

I guess I could just add a bool to see if the target is valid and set that to false instead of nulling

rancid geode
#

Can I do null checks on it?
@solid flume if (thatEntity != Entity.Null)

violet cosmos
#

I really need to write on that thread... But, I'm tempted to just be lazy and say "DOTS is driving me to drink" ๐Ÿ˜†

solid flume
#

Oh that's nice

deft stump
#

I'm still wondering when will they support .NET 5, I know it won't be on release...

minor sluice
#

if your target is another entity and you have it stored in a component, I think the equivalent of checking if that entity target exist is by using EntityManager.Exists or if you pass a ComponentDataFromEntity group to a job, you also have an ComponentDataFromEntity.Exists method

trail burrow
#

@rancid geode the safety system can be in place without HPC#, you can still fuck it up despite their 'safety' system even now... all the safety system does is check for read/write conflicts... that system can be in place no matter HPC# or not.

minor sluice
#

for example, the ComponentDataFromEntity<Translation> group and you check if a the target exists with a translation component with doing the .Exists(targetEntity) method

rancid geode
#

@trail burrow by the way, Joachim (I believe) replied once about why the don't have ref return on the data access arrays of chunks, and he said that it was because they didn't have how to do their safety checks with a reference value

trail burrow
#

okey?

minor sluice
#

entity is a struct, did they include a null check? otherwise you probably have to check for if (entity == default) (for structs),

but it is better if you check if the entity actually exists in your world with entityManager.Exists

rancid geode
#

if you have reference values (class) you can't guarantee that it won't be modified in another place and create race conditions

minor sluice
#

oh but also, didn't know about Entity.Null (so please ignore what I said about default)

trail burrow
#

@rancid geode no sure.. but you can already do that with the "safety system" today in place, you can fuck up the thread safety and have it blow up despite all of their safety checks

#

it's very easy

#

so despite HPC#/Safety/Burst, you can still blow your leg off easy

rancid geode
#

well, yeah, but with the safety system you at least know what and how to fix

trail burrow
#

So whats the argument - that you COULD do something wrong that wasnt safe if the restriction wasn't there?

#

No...

rancid geode
#

multi-threading is easy this way

#

in any case, HPC# / Burst / Jobs are all opt-in features

trail burrow
#

then you're not doing complex enough multi-threading

rancid geode
#

you can still do everything single-threaded with C# and/or multi-threaded with C# Tasks

trail burrow
#

if multi-threading means: batch processing of arrays of data, sure it stops the absolute noobs from fucking stuff up

#

that's kind of a moot point tho

rancid geode
#

you just have now an option to do thread-safe code without much more headache than limit yourself to a subset of the language

deft stump
#

multi-threaded with C# Tasks
that kinda defeats the purpose of writing safe multi threaded code tho

trail burrow
#

problem with using regular C# threads in unity is that the mono threading primitives are shit

#

and are basically unusable

#

for high frequency or low timing scenarios

rancid geode
#

@deft stump which brings back why HPC# and the Safety System are useful for us

solid flume
#

Can I find all entities inside a certain radius?

#

I can't seem to figure out how spherecasts work

rancid geode
#

if multi-threading means: batch processing of arrays of data, sure it stops the absolute noobs from fucking stuff up
@trail burrow well, yeah, but if you combine that with the ECS structure it becomes way damn powerful

solid flume
#

In ECS

rancid geode
#

which is way I am giving a shot on Unity's ECS and hoping that they will do that right

#

the current issue with Unity's ECS is not even the API itself, but the hybrid workflow that just doesn't work properly/the way we expected

trail burrow
#

@rancid geode batch processing of data is usually not needed when dealing with game logic outside of a few game types, actually the architecture they have picked hurts performance when you're implementing fine grained game logic which lots of conditions and checks and combinations of various operations

rancid geode
#

but it is not production-ready yet, so this can be something that is being worked on (but we don't now because they aren't clear about their roadmap)

trail burrow
#

it was supposed to be production ready

#

already

deft stump
#

it was suppoed to be released in 2020.1

trail burrow
#

@deft stump ecs itself sure, which it wasn't

#

but then the rest of the packages?

rancid geode
#

yes, but we are all developers and we know that timeline changes

trail burrow
#

the stuff you need to build an actual game

#

meanwhile people that need to build actual games on unity are left by the wayside, working with tech from 2016, because nothing is being done to fix old problems, bugs, etc.

rancid geode
#

this is a big change, I prefer it to take longer and right, and be released earlier and be useless

trail burrow
#

@rancid geode so far it's taking longer and wrong

rancid geode
#

don't see why wrong ๐Ÿค” but this could be personal taste

trail burrow
#

i mean they had 3 years so far, and it's still basically as useless as it was 3 years ago

deft stump
#

yes, but we are all developers and we know that timeline changes
@rancid geode true. however, they're a tool maker.
if a tool maker takes so long to make the tools, then it's better to just move on.

pliant pike
#

Unity better not give up on DOTS ๐Ÿ˜ 

deft stump
#

we've got game schedules to keep

trail burrow
#

i was, for the record, super excited about dots when it was announced

minor sluice
#

it would be kinda neat if unity focused on a system to better distribute the load of regular threads, based on the end system the app runs on, if that was possible

trail burrow
#

and then they just... did what they always do

#

fumbled it

pliant pike
#

we wouldn't have half the tools we do have if people gave up half way through making them just because they took to long

trail burrow
#

@pliant pike yeah sure if it was developed in a vacum that'd work

rancid geode
#

@deft stump I must disagree on that, they just showcased too early, most tool makers doesn't showcase their new tools until it is almost finished, even if it took 3-5 years to reach that state

tiny ore
#

The point is:

  • a few experienced guys are feeling (at this point) that there are fundamental problems with Unity's specific approach...:)
#
  • so the whole path is wrong (it's not only timing)...
low tangle
#

It's not that it was taking to long that I have the issue with, it's that they didn't tell us anything

rancid geode
#

the issue is that ECS shouldn't be showcased before late 2019 (which is when the API got barely usable)

low tangle
#

They just told us to wait till next unite for the next big update to entities or physics being released

rancid geode
#

we've got game schedules to keep
@deft stump for that reason they advertise that it is not production-ready

low tangle
#

Yeah, that was a recent change

minor sluice
#

I really like that they offer dots for us, even if I only have little experience with it,
think the main issue is transparency, communication and probably documentation too

trail burrow
#

@rancid geode and that would be FINE if they hadn't left the rest of the engine to die by the wayside lol.

#

while they working on their ivory tower dots thing

#

which is still, useless

low tangle
#

They didn't throw it in your face as much before, and they gave the impression it was only going to take one to two years for most of it to be ready for games

minor sluice
#

like james brought up really well, most of the time users go on forums or on here to find out about stuff that is sometimes basic but just not well documented and the ecs sample package isn't that accessible for beginners either

low tangle
#

They were showing off full demos (nordus RTS demo) in 2018

tiny ore
#

While that happens, we can live with 2015-ish renderer and (contested) animation tech for production-ready MB.

pliant pike
#

yeah they do need to properly document it

trail burrow
#

@minor sluice it's not even that, it's that it's buggy and incomplete. You can't actually build anything serious with it. I don't need a documentation or manual to do stuff unless it's really complex stuff... yeah sure docs suck, but you cant document shit that doesn't exist yet or is fully broken.

rancid geode
#

@rancid geode and that would be FINE if they hadn't left the rest of the engine to die by the wayside lol.
@trail burrow not sure why you feel that way, sure they haven't added anything BIG to GO world in the last years (beside some cool acquisitions like Cinemachine, ProBuilder and the new Bolt)
but we did have some cool progress like Addressables and InputSystem

low tangle
#

The documentation is the source code

pliant pike
#

only neo can read the source code

trail burrow
#

@rancid geode those are all new tools... and they both are in 'preview' stage... im talking about core bugs in the existing physics/animation/rendering/audio/etc. stuff, which goes unfixed for YEARS while they fiddle on dots

rancid geode
#

we could have more if there wasn't any DOTS to care about? maybe, or maybe the team size would be smaller because there won't be any DOTS stuff

trail burrow
#

things that actually block progress for real products

low tangle
#

There's a lot of standard comment (not XML autodoc) at the header of most files I've looked at in entities

minor sluice
#

I guess the few people that actually have a dots project in production spent tons of hours on the forums, and rolling a lot of custom systems that users would expect that unity offers itself?

for the documentation part, I think that is generally an issue with the new packages. I really liked that they pointed out that they work on documentation for how to convert shaders from standard to srp pipelines for example but... at the moment it's really pretty bad

trail burrow
#

@rancid geode oh and ProBuilder/Bolt? let's see, pro builder integration is still shit and its buggy af. Bolt 2.0 that was worked on for ages was scrapped and ditched, and they went back to Bolt 1.0 (unitys decision)

#

I'll give you cine machine is decent

#

adressables are still buggy, at least last time we tried to use them

minor sluice
#

another issue I see is that they market things as out of preview at times when a lot of users still seem to have problems with those packages that would indicate that they are still in alpha or beta state.

trail burrow
#

i dont know what kinds of companies you work for, but i prefer solid tools that do what says on the tin so we can schedule time and count on them, not have shit change under our feets 3 times per year.

low tangle
#

Cinemachine, ProBuilder and the new Bolt)
but we did have some cool progress like Addressables and InputSystem
Being honest, why were these not built in house, the engine feels like it's made of duct tape.

trail burrow
#

or have to drag 5-6 year old bugs around

minor sluice
#

I don't use bolt but some people said bolt 2 would have really been great and one even said that could have been a decent competitor solution to unreal's blueprints even

trail burrow
#

@minor sluice yeah i dont use it ither but they ditched all of it

#

lol

#

and if youre just a hobby user fiddling at home with unity personal edition, what you think of this... doesn't really matter, because you can take as long as you want, you have no budget, you can play with shit beause it's fun, etc.

#

but the people that have companies, staff and money on the line

#

need dependable shit

#

not ivory tower dreams

minor sluice
#

yeah, would prefer more stable features too, so I'm glad that they stated they want to work on stability and workflow improvement,

I still use all the old things, standard renderpipleine, monobehaviours etc. (and had few to no issues with them)
just that I played a few times with jobs/ecs

deft stump
#

i dont know what kinds of companies you work for, but i prefer solid tools that do what says on the tin so we can schedule time and count on them, not have shit change under our feets 3 times per year.
totally agree on this.
Like I said before, Unity is a tool maker. We can't have tools that doesn't work out of the box.
they break dev scheduling

trail burrow
#

@minor sluice same, we use: Old Input, Old Renderer, Go/Mb system, "Old" UI system (not ui elements), etc.

minor sluice
#

or rather, there are always small issues somewhere, but they never felt like a pain point really

trail burrow
#

and they are still plauged by the bugs that were during during 5.x release cycle

#

because LITERALLY everything else they have made since 2016

#

is USELESS for a real project

#

because it's unstable, incompatible, incomplete

deft stump
#

Or atleast, I just want Unity to be honest with themselves.
Just make a giant public announcement and say "we fucked up, here's the ACTUAL state of things"

and my faith in them might get restored.

trail burrow
#

yeah i have zero faith anymore

low tangle
#

Honestly, with the whole hpc# and .net 5 stuff, I'm actually just heading back to cpp myself @trail burrow

trail burrow
#

@low tangle i have so much of my company/career tied to unity, i would jump ship if i could

#

in a fucking split second

minor sluice
#

the idea and the direction of the new features is really impressive I think,
dots, and also the problems that the new input solution would solve for example,
but I agree with your statement on production ready projects.

for inputs, I'll just use ReWired and let them handle whatever abstraction or interfacing they choose with the unity input

low tangle
#

Yep

trail burrow
#

and yeah ReWired is good

minor sluice
#

I haven't checked it for a few months, but they should still be on the old input system too

trail burrow
#

solid asset, been around for ages

minor sluice
#

ReWired seems like the goto input solution many unity studios choose for their games

trail burrow
#

yeah for good reason

low tangle
#

My prototype core in unity is using the native plugin interface right now, in cpp, and I honestly forgot why I hated it before. My 2yo unity game takes a long ass time to compile, and 20 min with il2cpp, which generates a gig of source

trail burrow
#

Yeah we just use unity for rendering, rest of game is pure standalone C#

low tangle
#

I can't stand il2cpp, really wish direct cpp was a option

trail burrow
#

I just really dont want to go back to C++ lol

#

I'm so happy in C# land

#

espc with .NET 5

low tangle
#

I am, but also tired of not being able to directly compile. .net native stuff has been killed off by Microsoft so many times

trail burrow
#

yeah its still up in the air for .net 5 afaik

#

not sure where .net 5 AOT will land

rancid geode
#

@rancid geode oh and ProBuilder/Bolt? let's see, pro builder integration is still shit and its buggy af. Bolt 2.0 that was worked on for ages was scrapped and ditched, and they went back to Bolt 1.0 (unitys decision)
@trail burrow Bolt 1 is fully functional as it was, also ProBuilder, it just didn't improved much since the acquisition, but I understand you as I was furious when they acquired Anima2D just to abandon it

low tangle
#

Yeah I dislike the hell out of those aquisitions

#

The plugin just freezes and dies

trail burrow
#

@rancid geode I don't use any of those tools. I just know that when unity acquires something = over for it.

low tangle
#

Esp when you had just bought it full price recently

trail burrow
#

And bolt2 was VASTLY better than bolt1 from what i heard from ppl that actually use it

rancid geode
#

I tried bolt 2 (when was still with ludiq, right before the acquisition) and it was barely functional

tiny ore
#

What is the reason for abandoning Bolt2? Probably have them work on a DOTS 2.5 version that will never see light of day?

rancid geode
#

was at least 1-2 years away from being usable

trail burrow
#

@tiny ore they are 'consolidating' all their visual scripting tools, that is the official reasoning at least

rancid geode
#

but I think we are going a little offtopic here haha

tiny ore
#

I don't remember that they had an official visual scripting before

#

I mean, people use either Bolt or Playmaker

deft stump
#

here's the thread for it

tiny ore
#

"consolidating" sounds like merging an internal team, probably

rancid geode
#

they are 'consolidating' all their visual scripting tools, that is the official reasoning at least
(this is actually a little funny, because they don't have a consolidated vs tool yet, but want to consolidated them all together already)

trail burrow
#

yes thats what i meant

#

w/e i dont really care about any of those tools

deft stump
#

god just reading through the thread and their response just makes me hurl

tiny ore
#

I read a bit, yeah, my expectations for the "consolidated" version are not high

low tangle
minor sluice
#

oh no, but unity recently acquired plasticSCM blobsweat

deft stump
#

expect that to be thrown in the bin

#

Or get rebranded as collab 2.0

amber flicker
#

^consolidated

trail burrow
#

@minor sluice one of my fav products about to get 'reckt by unity

#

absolutely love plastic

low tangle
#

God are they becoming Google

trail burrow
#

best version control for projects with lots of binary data

#

i ever used

minor sluice
#

someone told me it was perfectly fine to be used for unity before the acquisition too,
I speculate on some collab 2 rebrand or something too

north bay
#

Ye plastic is awesome, I'm a bit worried ๐Ÿ˜ฆ

solid flume
#
[BurstCompile]
public struct RaycastJob : IJobParallelFor
{
    [ReadOnly] public CollisionWorld world;
    [ReadOnly] public NativeArray<RaycastInput> inputs;
    public NativeArray<RaycastHit> results;

    public unsafe void Execute(int index)
    {
        RaycastHit hit;
        world.CastRay(inputs[index], out hit);
        results[index] = hit;
    }
}
``` What's the use of unsafe here?
#

Got this directly from Unity.Physics documentation

#

Also, can I schedule a job (The above one) inside an entities.foreach?

trail burrow
#

@solid flume might be a mistake

low tangle
#

When you schedule it, results needs to be marked as disable

trail burrow
#

remove unsafe se if it compiles

#

๐Ÿ˜„

solid flume
#

@low tangle marked as disable?

low tangle
#

Yeah the uh, disable parallel for restriction

solid flume
#

Basically, I want to spherecast around entities that have a particular value of a specific component and then do something with the result

low tangle
#

The job is picking up on the inputs being safe, where only one touches one

solid flume
#

Ah, that might be why the unsafe was there

#

As an alternative to disable parallel for

low tangle
#

But it doesn't know that on the read write to the results

#

No

#

Unsafe is there because the physics code tends to use pointers often

#

Pointers to colliders and such

tiny ore
#

Do they change the semantics of what c# unsafe means?

low tangle
#

No

tiny ore
#

Because you only ened to mark the method as unsafe is there is pointer logic DIRECTLY in that method/class/struct

solid flume
#

Also, I realised spherecast will only hit one thing. I want to implement vision radius. Any way I can get entities within a radius?

outer swift
tiny ore
#

If a method you call uses it, the calling one does not need to be marked as unssafe

low tangle
#

It just allows pointers, the person who wrote that likely copied or modified from another job that was using pointers

outer swift
#

7.72ms spent in float3x3 constructor looks wrong to me

low tangle
#

The joke is that you can almost decorate any method anywhere as unsafe

#

It's harmless

tiny ore
#

It's a deep profiler... could be a slow machine (331 calls to the constructor)

outer swift
#

@tiny ore Nah, the reason I started profiling in the first place is because I was seeing slowdowns

#

So the performance is bad independently of the deep profiler

low tangle
#

It's also a fat struct to copy

outer swift
#

Plus it's running on a Ryzen 2600, so not that slow

low tangle
#

Is that in burst code or main thread

outer swift
#

Main thread.

#

I guess I could just avoid using TRS

#

Still, it's odd

low tangle
#

Hm, it's only the constructors and matrix multiplys

outer swift
#

The weird thing is that all the other operations look fast, just the 3x3 construction is dog slow

low tangle
#

It's a 4x4 by the way

outer swift
#

I know, but the slow part appears to be a 3x3 ctor?

low tangle
#

Yeah

outer swift
#

While the 4x4 ctor a bit down is fast

#

Could be a cache hit speedup but eh

tiny ore
#

Testing here our own TRS

low tangle
#

If you expand the hiearchy a bit what's the rest of the call stack look like

amber flicker
#

have you checked in the timeline? it's not hiding a wait or smth?

outer swift
#

Let's see

#

It's spending a lot of time casting

#

I guess that "explains" it

low tangle
#

Eck

#

That's a ton of casts for what reason

outer swift
#

Well, it might be SIMD optimized

#

But it sure as heck ain't optimized

tiny ore
#

Well

low tangle
#

Throw it into a job and burst it, then complete it

tiny ore
#

Deep Profiler in Editor/mono is shit

low tangle
#

If it isn't too much trouble

#

Regular ijob

tiny ore
#

Just try a proper burst + il2cpp build

outer swift
#

Not a bad idea.

#

This is a good candidate for burstification

low tangle
#

Tossing stuff into a single job is a nice way to test if burst is going to help the code much

#

Has a lot less restrictions due to only bring one thread

outer swift
#

Thanks for the advice!

dusky wind
#

@outer swift IIRC TRS involves constructing 3 4x4s and multiplies them together

#

A good portion of the multiplies isn't vectorized due to their memory layout

#

If you know one or two of the components it might be easier to hand craft the matrix yourself

outer swift
#

Duly noted.

low tangle
#

Unity intends to list its common stock on the New York Stock Exchange under the ticker symbol โ€œUโ€.

#

wew

safe lintel
#

kind of a weird time to do it? where a lot of development on it seems in a weird state of flux with a somewhat grumbly userbase?

amber flicker
#

well.. someone else pointed out... "As the only game engine available on Apple products" ๐Ÿคฃ

safe lintel
#

frytakemymoney.gif

low tangle
#

because it started on apple

#

:^)

safe lintel
#

would be kinda hilarious(and tragic) if epic lost their lawsuit against apple and were barred from it completely

amber flicker
#

it's been in the works for a long time - probably were going to do it just as covid happened.. might have decided it's worse to keep putting it off and now with Unreal maybe it's as good a time as any... 100% speculation ๐Ÿ™‚

safe lintel
#

yeah true, just how the timing worked out doesnt seem to be on their side.

manic aurora
#

yep afaik itโ€™s been planned, pretty sure I saw talk about it a while back

amber flicker
#

this is a slightly dumb question as I've been using lambdas & IJobChunks almost exclusively. Say I have a e.g. NativeArray<Entity> myEntities and I want to iterate over all of them and set their translations. What's the "best" way to do this? The two methods that spring to mind are either e.g. for() { EntityManager.SetComponentData} etc or for(Entity e, Translation t) { if(myEntities.contains(entity)) then... )} - neither of these feel very optimal? Feels like I'm missing a third way?

low tangle
#

do you have a set of entites, or do you have a archtype you can iterate?

amber flicker
#

set of entities - their archetype isn't unique

low tangle
#

for { if HasComponent<T>() -> GetComponent<T>(e) }

#

HasComponent compares off the archtype of the entity, and is pretty dang fast

amber flicker
#

duh... yea that makes total sense.. thanks @low tangle - I somehow thought I had to be in a lambda to do that

low tangle
#

if you have a set, theres no way to filter it with a query, which sucks because you could just ask the query for a set of the components in a array, or to set all of them with a array of components<T>

amber flicker
#

yea

low tangle
#

If your not within a system base, then you just need to do what its doing for you. If within a job, get a GetComponentDataFromEntity<T>() and use the Exist function on that, or maybe it has a Has function now, forget. otherwise if your main thread, just use EntityManager.HasComponent<T>() and EntityManager.GetComponentData<T>() etc

amber flicker
#

yea so if I'm in SystemBase and I do for(.. myEntities.Length){ GetComponent, SetComponent} etc, do I need to do anything to make it burstable I wonder

low tangle
#

nope

#

just toss it into a Job.WithReadOnly(entArray).WithCode(ฮป)

amber flicker
#

but if I didn't do that, it wouldn't be right?

low tangle
#

it wont be bursted yeah, burst can only run on methods, like the ones within lambdas

solid flume
#

Any way I can get all entities in X unit radius? Maybe within a job

low tangle
#

how many entities

solid flume
#

I'm trying to implement vision radius

#

For this simulation

low tangle
#

how many subjects will you be looking at

#

if the set is small, say less than 10k protentional, then just burst a foreach and radius check each.

solid flume
#

Oh less than 10k is small I like that

low tangle
#

if its more than that, try the boids hashmap bucket approach and quantize each position into a grid point hash, and then brute force a smaller set

tiny ore
#

You are telling guys to do an O(n^2) loop on 10k entities? Or a single O(n)?

low tangle
#

still the same process, just making a coarse refinement of the set

#

its just a O(n)

tiny ore
#

I'd go for the buckets approach if you need to check that from different places

#

If it's just a single run per update, then should be fine

low tangle
#

store the location your checking from and use one point within the job for all protentional, its not as slow as you think

#

you should always start with the naive / brute force approach. you can and will likely optimize it later if it was ever a problem

tiny ore
#

I mean, I few.months ago I wrote a sample for a game with 10k zombies and 6 cars

#

For switch (the demo)

low tangle
#

very nice

tiny ore
#

So in the end, the best solution (that scaled) was more.the inverted idea:

low tangle
#

hows the switch hardware feel using ecs/burst?

tiny ore
#

Instead.of the cars checking for the zombies closeby, I made the main zombie updates to look for the close cars

#

hows the switch hardware feel using ecs/burst?
Photon Quantum's own ECS

low tangle
#

yeah, inversion of logic is usually a good way to structure things with ECS

tiny ore
#

But the general principles are similar

low tangle
#

yeah same thing honestly, just assumed you were referring to it

tiny ore
#

Ye... I mean, same idea would work perfectly with unity's, that's why I'm saying

#

And I agree you don't need to add the whole kitchen sync (like a broadphase) for this every time

#

I needed to update the zombies anyway for their movement, so I scheduled the car proximity checks to happen in subsequent ticks)

low tangle
#

oh it for sure does, but I get the feeling crypticax hasn't learned a ton of ecs patterns yet, so I didn't want to give them a complex solution when a simple and easy to understand one will at least get them onto the next phase of their game

solid flume
#

I've literally just picked up ECS because I wanted to do agent based modeling and this seemed like a great application

tiny ore
#

In the end it's 6 X 10k checks (over the scheduling tick rate) anyway, but it felt better from the gameplay with the invertion

low tangle
#

its great for that yeah, anything simulation heavy really

dusky wind
#

Or to generalize

#

Anything CPU bound

tiny ore
#

In the end I did not add a broadphase (even for the cars, that would be fast to add) because it worked well already

dusky wind
#

Though there are some unfortunate game types that require strictly sequential processing

low tangle
#

yeah and there a real pain to decompose into jobs

tiny ore
#

I did NOT used our parallel tasks for this case, lol

#

I wanted to measure the limits within the main thread

solid flume
#

I still don't know how to do the iteration since I need all entities with a component of type X to look for the nearest component of type Y and move randomly if it can't find it

dusky wind
#

@solid flume you can do bucketing

#

Its a common parallelization technique that puts common components in small buckets based on some function

tiny ore
#

Ye,.with X Vs Y you need some bucketing broad phase

#

To scale

dusky wind
#

It's not perfect but it splits up your objects roughly by their base location

#

You then run the actual distance check only in the buckets

#

Or the bucket and all nearby buckets

tiny ore
#

Is that documented as a pattern in unity ECS samples?

solid flume
#

Still no idea how to do that. ECS is confusing

tiny ore
#

I mean a couple of bucketing implementations

dusky wind
#

Using a bucket size roughly equal to the average vision radius is probably going to be sufficient

#

@tiny ore unfortunately not

solid flume
#

Bucketing would involve some sort of hashmap from coordinate to list?

dusky wind
#

I only know this because I do big data analysis for my day job

low tangle
#

yeah its what the boids demo does, its simple in practice once you understand it

tiny ore
#

Ye, any voids demo must probably do that

dusky wind
#

Which is just DOTS but scaled up to millions of data points and thousands of machines

tiny ore
#

Boids

low tangle
#

sucks it hasn't been turned into a proper documentation anywhere

dusky wind
#

Actually

#

Is there generic interest in this kind of stuff?

#

I can probably write up some common techniques I have been using

low tangle
#

eventually ecs and dots needs some proper patterns written up to direct people to

tiny ore
#

Definitely

low tangle
#

theres a lot of useful tools/patterns out there

tiny ore
#

I can say that's one of the things we do more

#

It's to recognize patterns (including when customers ask questions), document and point

dusky wind
#

I've done a lot of systems programming

#

And think very much in terms of share nothing parallelization

solid flume
dusky wind
#

And pure functional programming

low tangle
solid flume
#

Ah thanks

low tangle
#

theres a comment above that line I linked as well explaining whats going on

tiny ore
#

Yep, that does it

low tangle
#

thats the exact position hash at that line

#

yeah. the unifiy wiki has the old recomendation on it

#

Unity currently recommends only using the new ECS package for experimentation or if you're just starting your project and plan to release towards the end of 2019 or later. Since the package should be quite stable by then.

#

I've been saying two years, but I knew they said it was only going to take a year

#

might be able to find the form post as well

solid flume
#

I don't get how that hashmap works. Different boids could have the same hash?

trail burrow
#

not if the entity index + version is used as a key, that's a 'perfect' 8 byte hash

dusky wind
#

@solid flume yes

low tangle
#

the position is being hashed, into a axis aligned grid, of whole (integer) numbers

trail burrow
#

oh

dusky wind
#

I'm not entirely sure either but it would put multiple in the same bucket (hash)

low tangle
#

if a boid is 'close' to another, its position will hash to the same cell and be in the same bucket

trail burrow
#

oh this is just standard spatial hashing then

#

nothing fancy

solid flume
#

So how do I get entities in a bucket?

low tangle
#

yeah

#

you hash them into a multihashmap

solid flume
#

Aren't hashmaps basically dictionaries?

low tangle
#

which is that line I linked

dusky wind
#

Yes @solid flume

#

And think of multihashmap

#

As a dictionary of hashsets

solid flume
#

Oh it's a multihashmap

#

How did I miss that

dusky wind
#

Probably the misleading name

solid flume
#

Ugh ECS ain't easy

dusky wind
#

Haha anything involving multiple threads isn't easy

#

But that what also makes it interesting/fun

solid flume
#

So every update loop basically I calculate this hashmap? And it's only available to this system, so anything that needs it should run in this system?

low tangle
#

yes, but you can do it on change and expose it

solid flume
#

English please

low tangle
#

alloc it as permeant instead of tempjob

#

you can expose it as a field

solid flume
#

Static?

low tangle
#

then other systems can grab it from that system

#

doesn't have to be static, as you can always World.GetExistingSystem<hashmapsystem>().TheHashMap

solid flume
#

Ah

low tangle
#

but static is fine yeah

solid flume
#

No static bad

#

Thank god its not necessary

dusky wind
#

This is fine assuming you don't have multiple Worlds with the sam system

low tangle
#

hashing every frame is fine if there isn't too many boids, I think that demo handled 50k or so? on some macbook

solid flume
#

Yeah I'm way under 50k

dusky wind
#

Yeah it's not particularly heavy of an operation

solid flume
#

So how do I ensure that this will run before any system that needs the hashmap?

low tangle
#

ideal is if you can do whatever work you need with the hashmap, within the same system thats going to use it. So if your hashing your npcs to avoid them, then doing a movement operation, you would want to place these within the same system. if that doesn't work for you then it gets a bit more complicated or slow if you want to keep it simple

solid flume
#

Ah

#

Hmmm

amber flicker
#

I have a System that I want to Update manually... from an extension method... It doesn't seem to be possible as I can't e.g. get the default World from a static method so then I can't get the System to run. Is this crazy talk?

low tangle
#

World.DefaultGameobject blah blah doesnt work?

amber flicker
#

yea - Burst error BC1016: The managed function Unity.Entities.World.get_DefaultGameObjectInjectionWorld() is not supported

#

I guess maybe I should be using IJobFor or something

#

instead of trying to do this with a system

low tangle
#

burst compiling your static method?

amber flicker
#

I think it's trying - but adding [BurstDiscard] to the extension method it errors about not being able to do that as the method takes ref NativeArray<>

low tangle
#

yeah it needs to be a job struct if your going to compile it, otherwise you need to look at the documentation for burst function pointer stuff, I haven't had to use them yet

#

can't link to a section due to a lack of anchors

solid flume
#

What's the entity in query index?

#

Why is that what we add to each hash

#

Also, if I don't do .Schedule does the entities.foreach actually happen?

low tangle
#

it does not yeah, you have to .Schedule .Run or .ScheduleParalell

coarse turtle
#

I believe if you don't specify a run or schedule, Unity will throw a compilation error in the console stating it must end with a Run or Schedule

low tangle
#

have you dug though the ecs samples packages yet? and got the hang of systems?

solid flume
#

Uhm no

#

Just dived right into it and thought I'd learn on the fly

amber flicker
#

So I'm trying to use a job struct but I don't know how to set a CDFE without running into the same issues :/

low tangle
#

you have to get CDFE's from a system

#

there a 'object' ||struct|| that you need to get from a entity manager

amber flicker
#

to get a system or an entity manager I guess it has to be passed in to the extension method?

low tangle
#

I think you might be approaching your problem in a way that isn't compatible with burst/jobs

#

can you explain a bit more what your trying to do

amber flicker
#

I think I want to be able to say:
public myStruct: IComponentData { int id = 100; }

myStruct.FindEntities(ref resultList);```
Then the FindEntities extension method runs the FindSystem, passing the list to be written to. The system finds all entities with that struct and returns all entities with a matching id for example.
low tangle
#

wait so

#

you want to be able to run a filter, for a id=100 on that struct type?

#

storing the result into a nativelist?

amber flicker
#

Essentially - but there's blobassetrefs involved etc

low tangle
#

how are the blob assets involved

#

are they the thing being checked in the filter?

amber flicker
#

the id is a blobassetref rather than int, which contains a BlobArray<Hash128>

low tangle
#

alright

#

I can't remember all the sytax for blobs offhand so this will be wrong

amber flicker
#

yea I'm cool with that, no worries

solid flume
#

So this is how I iterate over a multihashmap? foreach (int ind in buckets.GetValuesForKey(hash))

low tangle
#

manually yeah, but theres a job for iterating it

#

these are also useful jobs for filtering

solid flume
#

What's the filter mean? I know the normal parallelfor

low tangle
#

been awhile since I used it, let me find a test case for it

solid flume
#

Also, can I get a random value from a multihashmap?

#

Like, a random value from the hashset corresponding to a specific key

coarse turtle
#

oh the Filtering is quite nice - you can either append indices of some collection to a native list

low tangle
#

ah yeah, the filter job is a filter you run on the native array

#

    struct FilterMod7Job : IJobParallelForFilter
    {
        public bool Execute(int index)
        {
            return index % 7 == 0;
        }
    }

    struct FilterAllJob : IJobParallelForFilter
    {
        public bool Execute(int index)
        {
            return true;
        }
    }
coarse turtle
#

or prune out elements from some collection

low tangle
#

yep, used to fill up a list

#

which you can then run a fordefered on that list, and get a index per job elem as well

solid flume
#

So my solution for a random value is generate a random number from 0 to number of values mapped to hash -1, go over it in a foreach and break out at that value

#

Horrible solution I know

low tangle
#
struct GetArrayValuesJobParallel : IJobParallelForDefer
    {
        [ReadOnly]
        public NativeArray<int> array;

        public void Execute(int index)
        {
        }
    }
  {
var list = new NativeList<int>(Allocator.TempJob);
        list.Resize(42, NativeArrayOptions.UninitializedMemory);

        var setValuesJob = new GetArrayValuesJobParallel { array = list.AsDeferredJobArray() };
        var jobHandle = setValuesJob.Schedule(list, 3);
}

solid flume
#

So. Many. Jobs.

low tangle
#

allowing you to run a filter on the input to a filter job, then the list your appending to, into a defered job

#

you're meant to chain jobs

#

if you want speed that is

solid flume
#

Actually working first, speed later is usually how I do things

#

First make it do something, then see why its slow and fix it

low tangle
#

then just do it within a systembase, use entitymanager, use .run on your foreach lambdas

#

everythings allowed there

#

.withstructurechanges on the foreach lambda if you need to entitymanager.add remove destroy within

solid flume
#

I don't think I'll actually need too many of the big performance things apart from the occasional bursted job, since the number of entities that actually do something will not be too many in the grand scheme of things

#

Also does ECS have a way of logging values to a file? Can I just use standard c# filestreams? Because that's basically a requirement in what I'm doing

low tangle
#

yes, just use a filestream

#

can't use those within burst, so put .withoutburst if its a foreach

solid flume
#

Aight, thanks. Can I use an Entity.Index value to get the actual entity?

#

Sorry for spamming questions xD

rancid geode
#

What do you mean with actual entity? for logging purpose?

solid flume
#

I have the entity index. How do I get the entity?

#

I've basically hashed some entities to buckets

#

So I get a value from a bucket

#

Which is the index of an entity in that bucket

rancid geode
#

The usual recommendation is to not store an Entity reference outside IComponentData and/or IBufferElementData

solid flume
#

Hmm

trail burrow
#

there is no actual entity

#

it's just a index into a lookup data structure

#

Entity is all there is

solid flume
#

Then I can get the Entity struct somehow?

trail burrow
#

didnt u have that?

#

just store Entity itself

solid flume
#

I can have a hashmap to entities?

trail burrow
#

yes

solid flume
#

Well that simplifies things

trail burrow
#

it sure does

solid flume
#

Thonks

#

Modifying LocalToWorld.Position moves my entity right?

hollow sorrel
#

@low tangle btw i tried to use JobsUtility.JobWorkerCount = 0 in build and it just crashes on startup lmao, dunno if that's because i'm doing something weird or unity, log just says invalid address
yet JobWorkerCount = 1 does work in build
so seems like even though they added 0 in 2020 it still doesn't work properly so yer not missing anything

coarse turtle
#

Modifying LocalToWorld.Position moves my entity right?
@solid flume No LocalToWorld.Position is a readonly property

low tangle
hollow sorrel
#

also fun fact my sim loop takes 0,15ms with 1 jobworkerthread, and 0,50ms with default
aaa

trail burrow
#

@hollow sorrel their job system is kinda meh ๐Ÿ˜„

#

it has so much inter-job overhead

#

its an absolute PITA to get consistent perf out of

solid flume
#

So I use Translation to move?

#

What is LocalToWorld for then?

tiny ore
#

also fun fact my sim loop takes 0,15ms with 1 jobworkerthread, and 0,50ms with default
aaa
Sure, let's take the pain out of parallelism and replace with overhead... Sorry,.could not resist

rancid geode
#

LocalToWorld is to store the transformation matrix for the given entity, if you have a Translation component attached too it will get overriden every frame inside the TransformSystemGroup

solid flume
#

Apparently Position is a component. Who would've guessed

#

(not me)

rancid geode
#

so you can either:

  • Use the Translation component (recommended approach)
  • Modify directly the LocalToWorld (which is a float4x4 and involves some math work)
#

if doing the second option, ensure to remove the Translation component, or else the LocalToWorld will get overriden again on the following frame

solid flume
#

So I just feed translation what I want to move by and it does it?

rancid geode
#

you feed it with the actual position you want it to have

solid flume
#

Oh

#

So I use the localtoworld to get the position, add whatever I want and assign it to translation.value

#

Man things are weird with ECS

rancid geode
#

example:

Entities.ForEach((ref Translation t) => t.Value += math.float3(1, 0, 0)).Schedule();
solid flume
#

Ah

#

That makes sense

#

Thanks

rancid geode
#

you will only use LocalToWorld directly if you are doing something very special to it or if you have a parented Entity which you want to get the actual world position (as Translation is always the "local position")

#

you can see LocalToWorld.Position as transform.position and Translation.Value as transform.localPosition

solid flume
#

I just saw the boids demo use it and I was like sure okay I guess this is how this works

#

Makes sense now though

#

So I just wrote my first system and if this works Ima be very surprised

#

Ayyyy it works

#

Not as intended, but I know why

mint iron
#

also fun fact my sim loop takes 0,15ms with 1 jobworkerthread, and 0,50ms with default
i pretty much just use Run() for everything, its generally faster unless you're doing 5K+ operations.

dusky wind
#

@mint iron does that still support Burst for enabled jobs?

#

I sort of wish there was an adaptive performance check

safe lintel
#

yeah you can burst .Run stuff, same limitations regarding no managed things

solid flume
#

A collider cast says it can return all intersections for a given shape

#

Does that mean everything inside it too, or just the stuff the shape surface actually intersects with?

tiny ore
#

I have not checked the source code of the dots physics package, but I assume they have both sphere-cast and sphere-overlap

#

the overlap test should definitely consider things "inside"

#

A cast I'm not sure, would have to check the code (but I have not done so)

solid flume
#

I actually need vision radius, so an aabb is not what I'm going for

#

Although I guess it could work out if I approximate a sphere as a cube

#

Could it work if I have a trigger on everything that needs a vision radius, and implement on enter and on exit callbacks?

tiny ore
#

I think we all explained you should use a spatial hash yesterday

#

Do not try to place this in a complete physics engine (overkill) if the only thing you need is a distance (radius) check

#

BTW, a distance/radius check is cheaper than the AABB

#

You just compare the Sqr radius with the Sqr distance

solid flume
#

The spatial hash isn't working

tiny ore
#

Well, fix it then.,..

#

That will be the correct and faster method for what you need

solid flume
#

I mean theoretically. Anything moving randomly will only end up staying inside it's own hashed area

tiny ore
#

That implementation is just one example, you can do however you want

solid flume
#

And it only detects something inside it's own hashed area

#

So anything even on the border doesn't work

tiny ore
#

That's the bread and butter of distance checks in a stateless system:

  • broadphase pass: inject objects into the spatial hash data structure (whatever you chose to use)
  • queries: test only stuff inserted in cells close enough to the desired origin
#

And it only detects something inside it's own hashed area
That'ร„s easy to solve

#

You need to also get the hashes for anything in the right/left/forward/backward (maybe also up/down) direction from the desired point, using the radius

#

If you make the hash cells big ENOUGH, you only need to check 2 extra ones

#

if the cell size is Radius * 2, you only need to check 3 cells (not 2, sorry) besides the one you're in

#

assuming a 2D hashing... So 4 cells in total

#

If your radius varies (and you do not have a reasonable maximum), you need to procedurally find all cells/hashes that your position+radius reach...

#

That's it

solid flume
#

Huh

#

Also, how would interactions work? Like if entity A needs to consume a resource in entity B

amber flicker
#

Just my 2 cents - Erick is correct... but I'd probably go with the physics approach unless performance is your concern right now - I suspect Unity.Physics is fast enough not to be your bottleneck unless you're doing 1000s of collider casts a frame or something

#

(but I may be missing context from earlier convos)

solid flume
#

Context: I need a vision radius. I see the approach Erick is talking about, and I want to explore different approaches as well and see what works how

#

Also, yeah performance is not really a concern for me

#

Its a simulation

#

So if everything isn't 60fps isn't a big deal

amber flicker
#

imo using physics (at least for now) means you can quickly experiment with different casts and reduce the code you have to write right now - it's also supposedly very well optimised code (though I haven't used it myself)

#

but obviously, it's good to try out these different options and learn / see for yourself

#

depending on how much time and appetite you have for such things ๐Ÿ™‚

solid flume
#

Quick questions: Do collider casts return what's inside it, if it doesn't intersect with the surface. And is there anything for on trigger exit? I can only find stuff that works on trigger enter

#

Also apparently there's visual scripting for entities? Do my eyes deceive me?

#

com.unity.visualscripting.entities

amber flicker
#

I haven't tried it, but yea it exists. I would be mildly surprised if it supported raycasts, collecting results and processing them in a way you want already but if it does, ๐Ÿ‘

solid flume
#

I won't use it

#

Because its hardly scalable

tiny ore
#

I agree with Timboc

#

My perspective should always be taken with a grain of salt (I'm a performance freak)

amber flicker
#

My expectation (untested) is the collider cast would return what's inside - though easy to test

tiny ore
#

Go for the physics engine to have a quick result

solid flume
#

Ookay, thanks

tiny ore
#

But @amber flicker this is one of the points that make Tim Sweeney and many other experienced developer look at ECSs with a grain of salt.

#

We also deliver a ECS-only gameplay engine (Photon Quantum), and I know the struggles of developers to "think" in ECS ways, and to develop gameplay, etc

#

It enables a lot of cool stuff, but it does have an impact in teams... It all boils down (IMHO) to what is your target audience... ECSs are great, but they are not really easy for the vast majority of devs... We REQUIRE an ECS approach due to performance reasons for multiplayer, but we try to EASE a bit to the regular developer with:

  • lots of samples
  • docs
  • flexibility in the APIs (you can even use a semi OO approach to help you organize ideas).
#

It's worked well for the past 3 years... But I understand the criticism of the overall approach

amber flicker
#

Is this in reference to the post on the forums @tiny ore ? Or something I said here to Cryptic?

tiny ore
#

To the post, but in reference to the questions...

#

It's not only about the ECS libs being "incomplete". Doing things with ECSs is many times a bit more convoluted

amber flicker
#

Completely agree

tiny ore
#

And you only get the real benefits if:

  • you have enough complexity to begin with
  • you rely on well designed data parallelism
#

For most cases of "small" single player mobile games (the VAST majority of the Unity market share), ECSs are not really really necessary... And alienates most of the developer community they built.

#

And this is probably the reason why they will NEED to keep supporting 2 engines (Dots vs MB)

#

They just can not afford to "deprecate" MBs... Maybe never.

#

So we only hope they can fully support both engine flavors going forward.

#

We're all part of the unity community.

#

We all want it to succeed... And I in particular (I think my colleagues agree with me on this) would love to move to a pure ECS rendering + animation to fit Quantum even tighter (we will jump to it as soon as it's stable and complete).

#

But I just can't guarantee at all they (Unity) will be able to do both things well... Lets see... We're in this for the long run.

amber flicker
#

Sounds like we're in agreement basically? I wonder if something I said made you think otherwise.
For additional context, I'm most of the way through making an animation package for Unity (tween library with a Timeline for authoring). It was complex and a lot of work but the authoring workflow in editor is consistent if working with GameObjects or entities. It is all ecs under the hood, meaning decent performance but from a user perspective they can choose the paradigm they want to use the API in. It isn't perfect but the reason I bring it up is I see that as part of the solution to the problem of ecs being sometimes overly complex and not a great fit for many teams, is better tooling and to just keep working on getting features over to ecs land.

tiny ore
#

No no... nothing you said...

#

Sorry if it sounded like it.

amber flicker
#

Not at all - just don't want to come across as though I'm evangelical haha

tiny ore
#

Interesting

#

Is there anything public about your animation tool?

solid flume
#

So casts do return everything inside

tiny ore
#

nice then

solid flume
#

Also, any way I can have a nativearray of native lists?

#

I can burst all the collider casts I need to do inside of a job, but every collider cast needs to output a list

amber flicker
#

@tiny ore 1 sec, posted in here before.. finding a link

stone osprey
#

How do we realise the following in a ecs -> "Player should work to entity, once collided a timer should start a countdown" ? We already have a "MoveTo", "Position", "Collider" e.g. component... we simply have no clue how we should chain them in order to spawn a timer once collided... any ideas ?

solid flume
#

I guess I can have a work around with native multihashmaps instead of nested lists

tiny ore
#

Create a Timer component... Add it to entity on collision callback

#

Create a system to run timer

#

Thanks... will take a look now

#

Oh, it's for tweening...

#

You have no interest/opinion on character animation timeline editors?

#

It's a hot topic given Unity's dead state in MB-land (mecanim and playables are "abandoned"), and no sign of maturity status for everything DOTS

solid flume
#

If a native collection is created and disposed inside a job, I should use the temp allocator right?

amber flicker
#

Yea... well.. I know Unity have their dots timeline.. I don't want to get into rigging and state machines etc.. I trust Unity will do it fairly well in the end

tiny ore
#

I do not...:)

amber flicker
#

haha fair

tiny ore
#

Given what Mecanim was

amber flicker
#

notice I said.. in the end

tiny ore
#

and Playables (promising API-wise) is implemented as a Mecanim instance underneath,

#

In the end, possibly... I hope so

#

But what I've seen for (studios with enough resources) is a lot of custom tools (mostly around Playables)

#

If the new tooling has an API similar to Playables (with a good implementation underneath), I bet custom tooling will still be a thing

#

Hence opportunities for tool developers

amber flicker
#

Most likely.

#

On a smaller scale, atm I'm close to releasing a very modest asset (https://www.boxofclicks.com/btagged - half finished web page) that also attempts to bridge the workflow gaps a little. I think there's an opportunity for tool develops here to help pull the quality of the ecs experience up.. but of course, it still relies on Unity making a lot more progress.

solid flume
#

For the same entity, does the entityInQueryIndex stay the same across all identical queries?

amber flicker
#

Not if you have any structural changes in between the jobs running. Generally you shouldn't rely on it.

solid flume
#

Gotit. I'll rely on the entity.index then

amber flicker
#

that's the same thing ๐Ÿ™‚ - well, not the same thing but the same issue

#

just rely on entity

solid flume
#

Oh

#

I can hash entities right?

tiny ore
#

I guess the struct/type Entity is the thing... That's the unique identifier

#

I assume Unity never reuses the entity unique "instance" (with a versioned property)

solid flume
#

So my solution is queuing up collider casts in one foreach, doing it in a bursted parallel for job, then going through the results in the next foreach

solid flume
#

Does a nativemultihashmap need to be preallocated if I want to write to it in a parallel bursted job?

amber flicker
#

you don't need to give it a size but you need to allocate it - in your case probably Allocator.TempJob.

solid flume
#

So I don't need to use a parallel writer, I can just use a nativedisableparallelfor?

amber flicker
#

you should use the parallel writer version of it

#

I'm not sure if you need the nativedisable... if you're only writing to it

#

I have a feeling you don't

spark glade
#

Argh, shit updated Burst to 1.4.0.preview4 and getting like a million warnings Burst warning BC1370: An exception was thrown from a function without the correct [Conditional("ENABLE_UNITY_COLLECTIONS_CHECKS")] guard. which appear to come from within the Entities package itself 0.11.0-preview.7.

#

Anyone knows starting which entities version (or Unity version 2020 maybe?) those will disappear?

amber flicker
#

I guess with burst 1.4 you probably want entities 0.14 in Unity 2020.1.0f1 or later?

spark glade
#

Everything seems to run (on Android at least) so far...

#

It didn't complain otherwise

#

I feel backed into a corner... ๐Ÿ˜“
Can't upgrade to 2020 due to apparent Hybrid Renderer issues ๐Ÿ˜ข
Want to upgrade to 2020 because entities beyond 0.11 is only 2020 and higher ๐Ÿ˜ข

#

<sacrasm> I heard that Dots is secretly fully complete and they'll unleash it with a BANG right before the IPO ๐Ÿ˜„ </sarcasm>

amber flicker
#

sooner or later, trying to stick to 0.11 is going to be a headache. What are the apparent render issues you mention?

stone osprey
#

I simply cant find a nice solution for this scenario : Event occurs ( Button click e.g. ), Player moves to Entity, on collision spawn another entity. Only once... how would you implement this ?

#

The difficult part is the "once" here... Only execute that action once

amber flicker
#

one option is to create an event entity that is destroyed/consumed by the spawner?

stone osprey
#

@amber flicker How do you mean this ? The problem here is... how do we tell the ecs "If that player collides, only spawn stuff once... next time he collides, ignore it"

dense storm
#

Hello, anyone know if we can use Kinematica with dots project?

#

Since there is no animation system

dusky wind
#

@stone osprey alternatively

#

Use singletons

#

And just edit the target instead of spawning a new one

amber flicker
#

@stone osprey So.. the answer imo depends on the data. Why should it only spawn stuff once? If it's because the player doesn't have a sword yet and the spawner makes a sword, that might mean the spawn system checks if the player already has one for example.

stone osprey
#

@dusky wind @amber flicker Thanks for your answers. Lets use the following example to describe my problem more detailed. When we press on the "Chop tree" button a event gets spawned... our player listens to that event and should move to a tree. Once he collides with that tree we wanna spawn a "progress entity" which takes care about the chopping part. Thats what i need to realise inside the ecs. With monobehaviours i could simply chain actions/functions/delegates to realise this easily ( onCollision += spawnProgressAndRemoveFromCollisionLaterOn )... But this a ecs, so i have no idea how i could tell the ecs that it should only execute a certain task one single time on collision and next time we collide it ignores that

amber flicker
#

I guess there are many directions to approach this from. One way would be to add a 'ReadyToChop' tag to the player. The tree system sees a player with that tag has collided and sends another event or manipulates things directly. Or the player could check for trees and do a similar thing. The key is around the player having that tag and when the action is performed, the tag is removed.

#

A variation on that is to have a ReadyToChop tag that has a .Enabled bool that you set (instead of adding and removing the component).

stone osprey
#

@amber flicker Thanks a lot ! Now we are talking ๐Ÿ˜„ That makes sense... never thought its that easy.

amber flicker
#

ok awesome ๐Ÿ‘ - I wouldn't say making all these systems is going to be easy but I'm glad that helps. One thing to keep in mind is if a player is told to 'chop' many times, only one tag is added until he chops and the tag is removed. This is great if it's what you want. If it's not, you can put a counter inside which you increment or you can look into using Buffer elements instead.

#

For the more general case you could make an array (dynamic buffer) of actions you want the player to perform and remove them as they're performed.

stone osprey
#

@amber flicker Most of the systems are already implemented ^^ another thing im struggling with is how i fire the collisions... my current approach is that i check all entities each frame and once a collision occurs i fire a "event-entity", that includes the data of entities collided... but instead we could also mark those both entities as "collided" directly ( which would involve a structural change )... What would you go with ?

amber flicker
#

these decisions (structural changes vs bools vs entities) are so dependent on the scales and systems involved - there's no general answer in terms of speed other than to profile with your use-case. As for style, I don't think it matters too much. Either way you have to deal with what if something collides multiple times in quick succession or what happens if both things collide with each other and both try to tag each other etc.

stone osprey
#

@amber flicker Alright, thanks ^^ than im gonna go with my approach till i really need to change it... because there so many ways of ecs-architectures im mostly not that sure what is considered clean and what not ๐Ÿ˜„

amber flicker
#

I don't think there's really any authority on the subject - still working it out ourselves. Stick with what you have until you find a reason to change sounds like a good strategy ๐Ÿ‘

solid flume
#

The spherecast needs a sphere collider. As far as I know, I add colliders through PhysicsShape components. How do I get the collider through a entities.foreach?

solid flume
#

Do I have to dispose of native collections I create in OnUpdate?

#

There's something wrong with my code. Every time I press play, unity starts using 4GB RAM and stops responding

#

Apparently disposing of collections I create in onupdate was doing this

zinc plinth
#

I see the entities/hybrid renderer with addressables bug still isn't fixed, nice ๐Ÿ˜

#

did I just lose a whole ms of cpu time by updating hdrp Wat

solid flume
#

Is 10k cubes too many?

#

The cubes do nothing

#

They just are rendered

zinc plinth
#

depends, are you on built in render pipeline ?

solid flume
#

Yep

#

SRP

#

Not SRP

#

Whatever you get by pressing 3D

zinc plinth
#

then should be a breeze

solid flume
zinc plinth
#

be careful that you don't have accidently added physics colliders to your cubes

solid flume
#

That's probably it

zinc plinth
#

it's waiting 11.4ms for jobs from other systems, not the rendering itself

solid flume
#

Ah

#

Why doesn't it tell me those systems

zinc plinth
#

check the jobs running in the jobs tab

#

100% it's physics

solid flume
#

Nope it wasnt that. I removed all colliders bar one, and it's still showing the same thing

#

Worse, if anything

zinc plinth
#

then show. the. jobs. running.

solid flume
#

Could it be that I'm doing a collider cast every frame?

#

How?

zinc plinth
#

there's a jobs tab in the frame debugger

solid flume
zinc plinth
#

profiler not frame debugger sorry

#

it shouldn't choke on culling Wat

solid flume
#

Dunno what to tell you

#

It is

zinc plinth
#

show me the components you have on your cube entities

solid flume
#

Land authoring has no data, it's just a flag of sorts

zinc plinth
#

show me the components you have on your cube entities

solid flume
#

How?

zinc plinth
#

in the entity debugger

solid flume
zinc plinth
solid flume
#

Nope, I'm sorry if I'm being dumb but this is legit my first time using ECS

zinc plinth
#

that's alot of chunks, do you have alot of types of entity in your world or just the renderer ones ?

solid flume
#

The green is one type of entity, blue is one, and theres a tiny little sphere

#

The only difference between the green and the blue is a material and a component

#

Also what is meant by chunks

#

There are 10k total cubes, so maybe that's why so many chunks?

amber flicker
#

is your material set to be instanced?

#

also, the hybrid renderer does take quite a long time for 10k dynamic cubes - probably around 4-5ms at a guess depending on machine

coarse turtle
#

Think of a chunk as a span of memory defined for an archetype (if you have an archetype of xyz, then memory gets allocated to store xyz)

solid flume
amber flicker
#

don't think that shader's supported

deft stump
#

Shadergraph?

#

They're supported

#

In hr v2

solid flume
#

It's not shader graph. I noticed removing the light from my scene improved frame time, so I just made all the materials unlit

#

I dont know if ECS works with 2D or else I would've used that. I have no practical use for 3 dimensions

zinc plinth
#

isn't project tiny for 2d ?

deft stump
#

Oh it works alright.
Save for... Animating

solid flume
#

I don't need animating

#

Does it have physics?

deft stump
#

Curios. What game or poc are you trying to do?

solid flume
#

I'm trying agent based modeling

#

I figured it out

#

I generate maps in edit mode. Turns out old cubes weren't getting disposed

#

Its better, but that culling job is still taking like 10ms

zinc plinth
#

it's somehow not doing culling per chunk but per entity, which shouldn't happen

amber flicker
#

switch to standard shader and enable material instancing to see if that helps

zinc plinth
#

and btw if you're going for what I think it is, you can use vertex colors instead of materials

#

you could also merge your meshes but thats a bit more advanced to get right

solid flume
#

I'm creating the landscape in editor, so I could do it. It's basically just a big mesh with however many quads I need and vertex coloured

tiny ore
#

@solid flume I'll play devil's advocate here. I have some experience with simulation (and other stuff you with a PhD in CS).

solid flume
#

@amber flicker no difference

tiny ore
#

It looks like you want to simulate something grid based, like finite elements, discrete integrations, etc

solid flume
#

Yes

tiny ore
#

Why the heck are you using entities then?

#

This makes no sense IMHO...:)

#

You should just use a native array

solid flume
#

It looked like a good way to learn

zinc plinth
#

@tiny ore ??????

solid flume
#

I see your point though

tiny ore
#

You have a Nail, and you are trying to use a screwdriver, honestly

solid flume
#

Store state in a struct array, update it in a bursted job?

tiny ore
#

You have several super efficient algorithms to deal with grid-based data

#

Yes

solid flume
#

I don't

tiny ore
#

OR even better run this in CUDA or similar

solid flume
#

You do

#

Dunno what cuda is

tiny ore
#

By you I mean, there are

#

??

#

GPGPU?

solid flume
#

Never heard of this

tiny ore
#

You definitely using the wrong tools for the problem

#

Wow

solid flume
#

I know

#

I know what a GPU is. What is GPGPU

tiny ore
#

Do you have any idea that pretty much all the fastest super computers actually run processing data on GPUs?

solid flume
#

Yes

tiny ore
#

Well, that's GPGPU (general processing on GPUs)

solid flume
#

I should do this through compute shaders?

tiny ore
#

CUDA is the most prevalent of the programming libraries for this (NVidia specific)

zinc plinth
#

@tiny ore and you're throwing a way too complicated answer and omega overkill at someone who just want to try stuff out

tiny ore
#

ECS is NOT the answer to a grid based simulation,

#

Much much much worse than GPGPU...

solid flume
#

I see that it would be way better for what I want to do, but I want small scale and learn ECS and try stuff out

zinc plinth
rancid geode
#

well, it is not, in an very optimized scenario

tiny ore
#

Yes, I'm throwing the industry standard...

rancid geode
#

for learning purposes I don't see why not

solid flume
#

And don't want to learn an entirely new tool just for a project I'm doing to stop me from being bored

tiny ore
#

DOTS is not ECS only

#

A burst compiled parallel job on top of native arrays of structs is nice

#

Sorry, but I'm not wrong

solid flume
#

I know you aren't. I'm not denying it

rancid geode
#

yes, but you surely can do that with ECS too if that is what you are trying to learn

tiny ore
#

I'm not a fanboy of any particular tech... I just pointed to the right options...:)

solid flume
#

I know I'm not using the right tool for the job

tiny ore
#

The problems you are facing are mostly because you are going around and using the wrong tool

solid flume
#

I just thought that trying to simulate a couple hundred agents might be a decent use case to learn ECS

#

I mean, it taking ages to cull is not my fault

tiny ore
#

You are designing stuff for entities semantics, where entity semantics are not a good way to express this problem

#

Specially archetype ECS (Unity's memory model)

#

You are neither benefiting much from data locality (not nearly as close as you'd be with a spatial buffer) neither making your life easier (in terms of expressive power/semantics)

solid flume
#

I'm not trying to offend anyone here, or try say anything is wrong. I'm not in a position to do that, but can we get back to the topic?

tiny ore
#

Sorry, I had to say this...

#

You can.

#

Won't comment.

#

You can always go the wrong way...:)

solid flume
#

I understand what I'm doing makes no sense, but I want to do it anyway

zinc plinth
#

kindly fuck off now, you're getting omega annoying

he wants to use dots and ecs, let him be @tiny ore

solid flume
#

I mean, there are nicer ways to say that

tiny ore
#

kindly fuck off now, you're getting omega annoying
Sorry... You can do whatever you want... Including call annoying someone telling you the right way to do stuff...:)

rancid geode
#

people, lets calm down please and go back to the topic

deft stump
#

kindly fuck off now, you're getting omega annoying
there's a proper way to say that

rancid geode
#

@solid flume is just trying to get some help to learn ECS, lets help him

#

this is what this server is for

solid flume
#

I'm storing data in native collections, and using it in a bursted job to do a bunch of collider casts. If I don't dispose of the collections in on update, memory leak. If I do, nothing happens

rancid geode
#

@solid flume how is your code?

tiny ore
#

I honestly just started with a proper DOTS way (name of the channel).

solid flume
#
make collections
fill collections in entities.foreach
burstedParallelFor.Schedule.Complete
use bursted results in entities.foreach (different one)
dispose collections
#

Basically my code^

#

Burst is turned off, so there's that

deft stump
#

this make collection part...
I'm guessing it's a nativeArray of sorts.

and you're filling it with stuff from components right?

solid flume
#

Yep

#

two native lists and a nativemultihashmap

#

the hashmap is filled in the job

zinc plinth
#

wait, why do you have burst turned off Wat

solid flume
#

Because I'm using foreach loops and burst doesn't like that

rancid geode
#

dispose collections you are passing the Dependency as the parameter?

zinc plinth
#

just [BurstDiscard] it then no ?

solid flume
#

What dependency?

#

In effect, I want to run an entities.foreach, then a bursted job, then an entities.foreach, then dispose in that order

rancid geode
#
Dependency = MyJob.Schedule(Dependency);
MyNativeStuff.Dispose(Dependency);
solid flume
#

I'm passing the same dependency as parameter that I'm assigning?

#

First line

rancid geode
#

yes, the Dependency property

#

I mean, if you Entitiess.ForEach is Run it doesn't make difference, but if you are using Schedule it does

#

thus why seeing the actual code would make easier to help

solid flume
#

So,```cs

var dep = new JobHandle;
dep = Entities.ForEach(...).Schedule(dep);
dep = burstedJob.Schedule(dep);
dep = Entities.ForEach(...).Schedule(dep);
dispose passing dep as parameter

(return dep/complete dep?)

#

Why does onupdate require me to return a jobHandle

rancid geode
#

you are using JobComponentSystem, use SystemBase instead

#

ComponentSystem and JobComponentSystem shouldn't be used anymore

#

but yes, your logic is right now

#

(return dep in your case if you want multithreading, complete if you want to finish everything right away on main thread)

solid flume
#

I can't use a GetComponentDataFromEntity inside an entities.foreach?

#

I want a component on an entity that I got from a component

coarse turtle
#

You can,

var someData = GetComponentDataFromEntity<SomeType>(true); // True for read only data, false if you need to write back

Entities.ForEach((Entity e) => {
  var data = someData[e]; // Do w/e you need with data
}).Schedule();
amber flicker
#

you can even skip the GetComponentDataFroEntity altogether and just use GetComponent , HasComponent or SetComponent inside the ForEach

solid flume
#

Oh. That's much better

#

The GetComponentData thing throws an error when I play

#

The has component throws an error

amber flicker
#

literally GetComponent not GetComponentData if you want to replace the functionality of a CDFE

solid flume
#

Figured it out. Apparently I can't use those if the Foreach takes the same component as a ref parameter

amber flicker
#

yes, correct ๐Ÿ‘

tiny ore
#

Honest question: is this from the same entity, or for example from another referenced entity?

#

In the loop iteration. The limitation of not being possible to Get the component

solid flume
#

Okay, now when I did the dependency thing, it's throwing an error that I need to call complete on the job that writes to the native collection before using said native collection, which is what I want to happen anyway but i guess isn't happening

#

@tiny ore another referenced entity

tiny ore
#

hmm

#

trying to understand the reasons why, that's it (has to do with the memory model). Thanks

solid flume
#

You're welcome

amber flicker
#

@tiny ore I think it's not strictly necessary but probably very verbose to define what you're trying to do is safe (if it is). When you do ForEach..(Entity e, ref Thing thing), the thing is in the chunk (as I guess you know). When you do GetComponent<Thing>(..) it's random access. By ensuring you remove the ref Thing from foreach, it means they can easily detect if you try to write to thing in parallel and if it's safe to do so. What would be nice in some future version is to have the expressivity to say something like "I want to write to all the Thing's in the iterated chunk and only ever read using CDFE". I didn't explain that well but I guess you're smart enough to work out what I mean haha

tiny ore
#

I assumed it is to protect concurrent modification, yes.

#

I just thought you could retrieve a copy of the original data, and modifications could be done with copy-on-write semantics under the hood...

#

But maybe I assumed wrong

#

Then it makes sense to not give access, because the loop may run in parallel, so you can guarantee no concurrent modifications happen to the same instance of the component

amber flicker
#

yea - plus, if you're sure anyway you can just disable the safety check

tiny ore
#

got it. ty

#

kind of obvious, ye, sorry... REF means you do want to write to it (at least the copy from the looped entity)

#

Say I do want to modify in parallel, but I want to use data (read) from the same component of other entities... What is the existing approach for it?
a) I manually create a copy of these so I can read the original data
b) any proper safe way to do it from the ECS API as it is now?

#

variation of a) could also mean I do one iteration with read only saving the data I want to modify in a buffer, then do a second parallel loop to apply modifications.

coarse turtle
#

the variation of a - exists to a degree - you can read the data initially - do some modification as a copy, and then apply the changes later through their command buffer

#

the changes aren't applied in parallel though, it's played back on the main thread

tiny ore
#

ok, so there's an exposed command buffer (that's one of the common solutions for this)

amber flicker
#

yea - there are existing ones (e.g. at start and end of frame) that are sync points you can use for this - you can also create your own

#

or yea, you could write to a queue or a nativearray in parallel then process

#

one technique I kinda use is to attach a SharedComponentData to a group of entities - then I can easily filter the entities at the chunk level and process them in order - useful if there's a hierarchical relationship with many entities

tiny ore
#

makes sense.

tardy spoke
amber flicker
#

I still think everyone should be forced to write an IJobChunk before using the lambdas

tardy spoke
#

They abstract a lot away

#

I wonder if many people just use IJobChunks instead of the SystemBases so it's more explicit

amber flicker
#

yea - it's awesome.. but I can only imagine how magical it feels not knowing what is being abstracted

#

I don't think many people do (IJC instead of SB for explicitness) - it's just a horrible amount of code.

tardy spoke
amber flicker
#

fyi your WithNone can be written WithNone<A, B>()

tardy spoke
#

Now it's clean. ๐Ÿ˜Ž

#

lol

amber flicker
#

haha

#

that looks pretty clean to me - it'd be at least double the length as an IJC

tardy spoke
#

I just find with the level of abstraction all the variables got named virtually the same thing which makes it fairly confusing

#

Also I'm not really sure exactly what "GetComponentTypeHandle" and "GetEntityTypeHandle" are doing

#

Well, kind of more how it's doing or why it's required

amber flicker
#

It's not what you're talking about but does VS's autocomplete/intellisense drive anyone else mad? I have a lot of Translation translation type of things and I swear 90% of the time it thinks I want Translation which is the exact inverse relationship of how often I do haha

#

GetComponentTypeHandle etc is all to do with HPC limitations I had assumed

tardy spoke
#

HPC?

rancid geode
#

I wonder if many people just use IJobChunks instead of the SystemBases so it's more explicit
well, I am one of those people haha

amber flicker
#

(High Performance C# ๐Ÿคฎ ๐Ÿ˜ฌ ) the subset of C# that Unity support burst etc for - structs n stuff

tardy spoke
#

interesting

amber flicker
#

Gaaah I'm spending dayzzzz making examples, documentation, videos and tutorials for something that might sell zero copies. Much work, no fun. Bleh.

tardy spoke
#

MVP it. Throw it out there. Document later.

#

lol

#

DOTS people are used to no docs, it'll be fine

#

Besides, most the people that buy it are probably in this channel and will just ask you how to use it, hahaha

amber flicker
#

I actually hope it has a substantial non-dots audience ๐Ÿคž

tardy spoke
#

That's where the money is. ๐Ÿ˜Ž

#

Unity figured that out too.

#

That's why they have left us here to die.

#

It's on the roadmap. "Leave DOTS users to die est complete 2021"