Комментарии:
Great talk, thanks for sharing!
ОтветитьYou've always been a reference and a master, thanks sooo much for sharing all this so we can learn from the master.
Ответитьthanks jason. i understood all of that
ОтветитьAs someone who used to code in assembly on a C64 and Amiga where optimisation mattered, this talk was really great! Fascinating thanks.
ОтветитьReally cool thanks sir
ОтветитьAwesome talk, really appreciated the practical implementations of data-oriented design.
Also loved that bit of wisdom at the end of "don't practice mediocrity."
Thanks for the talk Jason! I think recruiters and SOLID principles fanatics are going to turn up the nose a lot to this - especially during an interview. But. That's where experience goes beyond every other possible academization of the design process.
I'll try to make treasure of this, whenever applicable. A sincere thank you for sharing.
@Jason Booth is the case about unity built in math library still happened on the latest unity version?
Ответитьhaha, Mike Acton's shirt got me in stitches 😂 I love these subtle jokes.
ОтветитьThank you so much for making this video and explaining the concepts super clear and simple.
ОтветитьWow what a great presentation! Thank you!
ОтветитьThis was immensely interesting and helpful! You are really good at presenting/teaching!
Is it possible that you might do another one of these and/or share a reading list? I feel like especially with optimization, one has to piece information together from a lot of different sources, which often contain outdated, partially incorrect or even completely false information. In the end it often comes down to benchmarking the code in question but that can be pretty time consuming. So getting someone like you to share his findings and insights is absolutely invaluable! i am looking forward to read the rest of your blog posts and finally experiment with branching optimization in shaders.
Great talk! And very inspiring and deep thought about "practicing mediocrity".
ОтветитьJust got to know you last month, and I realized I'll spend next few years to go over your work and consume the knowledge you have shared with us.
(actually wanted to say I felt some water in my eyes as soon as i saw you, i'm in office i should control myself)
Nice presentation Jason, well thought out.
ОтветитьI cannot thank you enough for posting this! You are a legend of this industry, I will be buying your assets from the Unity Store at full price
ОтветитьSo, in the monster example, what we actually should do in a real game would be, when initializing the monster data, to instantiate the Game Object for the engine part(rendering, audio, etc) and keep the reference inside the monster data and in the every update in the monster manager, we should convey some of rendering information back to the game object. In this case, I suspect the performance cost of the engine part would be still high and may dominate the overall performance cost, and the performance gain from the logic part by DoD would be dwarfed by it. What do you think? Of course, you showed that we can directly rendering from data using APIs without depending on Unity game objects, but in most case we have to work with artists, and I guess completely not depending on game objects are not applicable in general when it come to using Unity.
ОтветитьGreat talk, this sure vibes with me a lot more than the extreme data oriented approaches with most of the benefits.
I have a follow up question i hope you could answer.
I often do not get too much say in design decisions, besides guarding against the worst of the worst decisions from a code perspective. So if you take your monster example, our game would definitely then have like 10 types of monsters, each with different stats that are relevant and all sorts of inheritance going on. Making that whole example a lot more inefficient, or sometimes certain requirements make it downright impossible to have them all keep the same base class, and thus do a lot of the optimizations that you suggest.
How would you approach that situation?
Even more detailed, 9/10 times, my problems are not even code related, the entire game is neatly event driven and runs all it's code within 1ms of the total even on the worst of devices. But then some bright idea like "Let's add a post-process bloom, and 3 background layers causing severe overdraw" is what does the framerates in. I am not clever with shaders, and some of those problems i wouldn't even know how to adress properly even if i did know my shaders, because of the cheer incompatible effect types they are layering on the game. How do you deal with those situations? Pushing back harder, eat the consequences?
This was a really fascinating talk! I mostly work on web stuff and don't often encounter these sort of problems. Or, perhaps, I encounter them all the time but we, the web community, consistently handle them badly. (It certainly feels that way, when simple websites are janky as hell but video games create immersive worlds at scale and speed.) I'm going to have to stop and think if there are ways to take these insights and apply them to my problems too.
Ответить🤯 Thank you for this
ОтветитьAmazing talk, so much info in so little time. We demand more!
Ответитьgreat video
ОтветитьThis was super interesting, I like the way you've structured your talk with examples of increasing fidelity, it paves the way for everything to connect and make sense
ОтветитьThis is excellent, Jason! Thanks a lot for uploading. This is organized similarly to the Molly Rocket and Unity ECS talks I've listened to, but you present a lot more hands-on and practical supplemental info which drives the point home a lot better than anyone else I've seen.
ОтветитьAhhhh, so the real ECS was the friends we made along the way/the concepts from this video.
ОтветитьThis was so useful.
ОтветитьThat was excellent, thank you so much for sharing this.
ОтветитьThis is great! I love to see unique ways to use unity thats actually more optimal. "Optimization is a design time problem" Yes! Exactly! I absolutely despise the odea of "we'll fix it in an optimization pass"
ОтветитьCROOK
ОтветитьGreat video. One thing that would have been interesting to mention in the first example would be the option of utilizing domain knowledge and existence-based processing by redesigning it so that the arrays only contain elements where the stamina or health aren't at max capacity (which, at least for health, would be the common case and thus reduce the number of elements to process to a tiny fraction). Likewise, by keeping dead creatures out of it as well you'd eliminate the branching in the update function in regards to the upper and lower bounds, so it would just look like `hp = min( hp + hp_regen * dt, max_hp );`.
ОтветитьOne of many amazing things i understood in unity, as i am just a beginner in unity with almost like 9 months of personal work using only monobehaviour , but always thought how can we make like 500,000 things in a simple computer or laptop that has its only built in GPU to delegate tasks to but this practical work of code is just so much better then anything i'v learned yet thanks Jason, need more of this type of videos from Expert Seniors like yourself.
do take time to teach things like this in a simple series of videos just targeting simple but not used right concepts as many beginners just never know that even code could be optimized in unity and in any engine.
Thank you so much, extremely helpful.
Any thoughts on sparse sets in general, and for associating data between arrays using an id?
Magnificent. Thank you.
ОтветитьThese theoratical examples at the beginning look very simple. The part I have a hard time wrapping my head around, is how you actually manage all those structs manually. In a GameObject you have everything neatly contained, and when you delete a GM, you destroy all the components on them aswell. I would be interested to see some actualy real world implementations of this design philosophy, to be able to wrap my hand around it better.
ОтветитьBest video I've seen this year
ОтветитьThis talk is so good, i have to watch multiple times to get it into my head. Hope more content like this from you Jason
Btw, if unity Mathf so slow, can you give a quick introduce to what you have done to make math operation faster?
Thanks
I enjoyed the daylights out of that, thank you. :)
ОтветитьHi Jason. I've seen a few of your MicroSplat videos in the last few months, and just watched this one. I just wanted to say: You are a true artist and a genius, and present the subject matter so clearly! Thanks for your contributions - this is immensely interesting and useful!
I've been working on a complex terrain shader for a while, and how nice to find that some of the stuff I did there aligns with your advice in the terrain shader section :)
How do we populate each monster data struct inside the array of 1000 elements ? Since the job can do operations on the data but the data needs to be present beforehand right ? What is the most efficient way of doing that and assigning the output values to respective Monobehaviors to update the UI and stuff.
ОтветитьAwesome channel
ОтветитьWonderful Mike Acton famous presentation reference using the shirt. 🙂
ОтветитьThanks a ton for sharing this talk, very insightful! As a programmer that makes it a point to make things run as fast as possible, I'm happy to have picked up a few new tricks from this :).
ОтветитьReally great talk, thanks. I was wondering how you prefer coding behaviours of your AI agents (birds, zombies, etc). Is it some sort of DOD friendly FSM? Utility AI? Or something else? And what parameters are available to tweak for game designers and in what form (scriptable objects? configs?).
Ответить16 minutes in and am already flabbergasted. Subbed with all notifications!
ОтветитьThis is extremely informative and really changed my perspective in how i should write code - very thankful!
Does using an array of interfaces act the same as an array of structs or do they become a boxed variable which means reference type?
Curious if an array of interfaces instead of multiple arrays of set types would be worse.
What a great talk
ОтветитьMaybe someone could explain this to me because I'm struggling to wrap my head around it.
This makes sense for simple values like health and stamina values. But how do we go about applying our data stored in the structs with our game objects. Let's say I have game objects with rigidbodies that I want to control its velocity or torque of. I can see putting those values in the struct array but then how do I map that one struct instance back to the game object in an efficient manner?