Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by Slight0 · Mar 16, 2019 at 10:54 PM · c#voxelthreadsthreading

How to periodically pull output from an IJobParrallel or is there a better way to do this?

I've built a voxel engine prototype that generates voxel data into chunks and turns those chunks into visual meshes. My current implementation uses regular C# threads, but I'd like to try porting it over to Unity's Job system given how optimized it is.
 

The way it works
 

The map is a 2D array of Chunk structs which itself contains a 3D array of Voxel structs to form the geometry of the world. There's 2 threads that work with the map and each works on a queue of Chunks. The world builder thread pulls a Chunk from it's input queue and procedurally generated each voxel before passing the Chunk to the mesh builder queue. The mesh builder thread pulls a Chunk from its input queue and builds vertexes and UV array before passing it to the output queue. Finally, at the end of the frame during LateUpdate, the main thread pops everything from the output queue (technically it takes as many as it can without going over the frame time) and turns the vertex arrays into GameObjects with meshes.
 

My attempt at Jobifiction
 

I would think that I'd combine thw threads into a single IJobParrallel to do both the world building and subsequently build the mesh data and then output said data via a NativeArray to be used by the main thread. The issue being that this "Builder Job" would have a potentially multi-frame workload that I would like to basically "stream" the output of to my main thread (ie make a GameObject for each Chunk as its built). From what I see, Jobs are kind of "all or nothing" in that you cannot access the NativeArray output until you call Job.Complete() on the main thread. During LastUpdate for a given frame I'd like to pull everything the Job has done so far, but I'm not sure how to accomplish that.
 

Is there a way to achieve what I'm looking for?

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

1 Reply

· Add your reply
  • Sort: 
avatar image
0

Answer by troien · Mar 17, 2019 at 11:34 AM

I believe that what you want is not possible by design. The whole idea of a job is that you tell it to start doing something, do something else and call complete when you are able to process it's result.

Below a few ideas. None of my ideas are tested for your scenario, but they might be worth a shot or point you in the right direction ;)


If you could access the result while it is still modifying that result (On a different thread), you can get into a lot of problems :p You might be able to acces your nativearray outside of your job by using the NativeDisableContainerSafetyRestrictionAttribute or NativeDisableParallelForRestriction. But note that those safety checks are done for a reason, so make sure you know what you are doing before disabling them. Bugs can happen and Unity can crash if you make mistakes here :p


Another option maybe (haven't tested this) you can split up your work into multiple jobs (i.e. if you have a for loop, job#1 does index 0-99, job#2 100-200, etc.). schedule all those jobs so that they depend on each other (meaning job2 waits for job1 to finish before starting). But store intermediate job handles to each of them. If that last part is possible and works the way I expect it to, you can schedule a lot of jobs at once. And then in each frame, call complete on the first x scheduled jobs.


If you don't mind using stuff that is still in beta (Not production ready) and requires (possibly a lot) of rewrite of existing code. Did you consider using the ecs approach? Because in that way, you never have to create GameObjects to start with. Which at the same time means it is way more performant. And I believe it is also possible to use the EntityCommandBuffer to create Enities inside a job, which is possibly similar to what you want to do with gameobjects.

If you want to use ecs, I would advise watching the tutorial videos (Note however that the setup is different now, videos are outdated on that part, use the 'Entities' package from the packagemanager in unity). Unity has some examples on their github aswell.


There might be other (better) options aswell, which is why I posted this initially as a comment ;)

Comment
Add comment · Show 2 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Slight0 · Mar 17, 2019 at 09:52 PM 0
Share

@troien Interesting suggestions. I particularly like the disable safety restrictions attribute allowing access to a NativeArray before calling Complete. I've dealt with threads extensively so I'm vigilant when it comes to thread safety. I really like the concept of the new ECS paradigm, but I feel like I'll lose many hours to learning a vastly different system with little doc just to potentially have things change under my feet, so I'll wait on that.

I came up with a variation of your "multiple jobs" approach. I could spawn a job for each chunk and, during LateUpdate, loop through them and check for Job.IsComplete == true and call Job.Complete on them (possibly breaking the loop if I'm running out of frame time).

It'd be useful if a job could signal the main thread via an event or something when its completed its work. Useful in multi-frame job scenarios.

avatar image Slight0 · Apr 10, 2019 at 07:54 PM 0
Share

@troien If you post your comment as an answer I will mark it as accepted.

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

595 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

New Unity 2020.2.6 automatically uses multiple threads? 0 Answers

Help with Optimizing Voxel Code? 1 Answer

Run return method on new thread? 2 Answers

Multiple Cars not working 1 Answer

Job System without using the main thread 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges