I Created a Game Engine Just to Optimise This

  Рет қаралды 1,189,156

Vercidium

Vercidium

Күн бұрын

Пікірлер: 1 300
@Vercidium
@Vercidium 11 ай бұрын
Download the source code for all my videos here: patreon.com/vercidium If you have any rendering or game dev questions, ask them here!
@utilizator500
@utilizator500 11 ай бұрын
Christ, could you have made the code any smaller? I don't know what 4k 60 inch monitor you have but this is bad on small screens.
@FortisConscius
@FortisConscius 11 ай бұрын
Have you looked at Minetest, per chance? Do you have thoughts about it?
@_vicary
@_vicary 11 ай бұрын
Is this technique used by any popular game engines and why?
@Greedy-Allay
@Greedy-Allay 11 ай бұрын
I feel like they should stop inventing new hardware, and instead try to optimise games so they work with the "older" hardware if you know what i mean
@monicde4570
@monicde4570 11 ай бұрын
Recently I learned about Vram for optimization. My game uses Unity and mixes 2D and 3D. So we have a lot of hand-paint texture, filling up my Vram. Starting to learn how Vram works. I found most tech is a comparison for disk size like jpg but when it sends GPU is still big(I know Crunch but it is just for fast decompression not reduced size). Found the only thing I could do was pack the channel and tell the artist to reduce texture count and separate scenes into small chunks to load. I want to know more about Vram's work and if there is any way non-destructive or lost too much texture quality to be optimized in modern GPU. Anything even not for unity is appreciated!
@ThislsYusuf
@ThislsYusuf 11 ай бұрын
The greater skill here isn't code optimization, but rather how you break it down with tasty metaphors to make for easily digestible content. Kudos.
@Tuhar
@Tuhar 11 ай бұрын
I too, am now hungry for burgers.
@DriftJunkie
@DriftJunkie 11 ай бұрын
Just let this man cook
@ThislsYusuf
@ThislsYusuf 11 ай бұрын
Haha, he's cooking fr@@DriftJunkie
@Nerthexx
@Nerthexx 11 ай бұрын
Analogy an average american can understand, yes.
@reed6514
@reed6514 11 ай бұрын
I prefer strawberry flavored metaphors 🍓
@Necrotechian
@Necrotechian 11 ай бұрын
123 optimization videos later: This game runs so smooth you can get 4k graphics with 120 frames a second on a potato clock even without the potatoes.
@uis246
@uis246 11 ай бұрын
Quake 666
@SethbotStar
@SethbotStar 11 ай бұрын
I think the first arm cpu was so energy efficient that it ran on ambient electricity or something like that, maybe that could be an actual goal point of optimization, to have it run on that.
@RowbotMaster
@RowbotMaster 11 ай бұрын
​@@SethbotStarrebuilds crysis to run on a single double A for a year
@elcalabozodelandroide2
@elcalabozodelandroide2 11 ай бұрын
​@@RowbotMasterand yet it remains un-portable for the switch bc nintendo.
@MichaelChin1994
@MichaelChin1994 11 ай бұрын
He's gonna get Doom working on an Ancient Roman sun dial
@ARTEMISXIX
@ARTEMISXIX 11 ай бұрын
Vercidium trying to explain game engine optimisation to an American: "So imagine a burger."
@emporioalnino4670
@emporioalnino4670 11 ай бұрын
They should make a version more at home for Aussies "Ok so imagine a parma.."
@Vercidium
@Vercidium 11 ай бұрын
@@emporioalnino4670 I love a good parma
@violet_broregarde
@violet_broregarde 11 ай бұрын
@@emporioalnino4670 What's a parma, a chicken parmesan? That's standard bar food in Australia? I love that
@CanalDoPhillipeMEME
@CanalDoPhillipeMEME 11 ай бұрын
most healthy american breakfest be like
@Vercidium
@Vercidium 11 ай бұрын
@@violet_broregarde a chicken parmigiana
@KilledByAPixel
@KilledByAPixel 11 ай бұрын
This is why you can use double buffering, which is kind of like what you are doing but instead of for the framebuffer, you are doing it for the mesh. Normally GPU operations queue up in the buffer, they aren't meant to be completed by the end of the refresh. If you use a double buffered system, it allows everything to render without a stall, because when a stall would have occurred, it just shows the back buffer like normal.
@SirNightmareFuel
@SirNightmareFuel 11 ай бұрын
Thank you! so that's where I recognised this technique, it's like a Double Buffering👍❤ Its probably still worth it, but the trade off you have with this technique is with the increased memory usage, as you'd about double the memory needed for the area around the player, and it adds more complexity managing these separate sources of meshes.
@OMGclueless
@OMGclueless 11 ай бұрын
@@SirNightmareFuel That's true but GPUs have massive amounts of very-fast memory these days in order to support the heavy texture bandwidth of AAA games. Doubling or even 10x'ing the memory used by the meshes is not a huge deal because they all refer to the same textures and the textures are the most memory-hungry part of rendering unless you go crazy with poly-count.
@1Maklak
@1Maklak 11 ай бұрын
It's even better with tripple buffering. One framebuffer is displayed on screen, one is being rendered to and the third one is ready to be displayed. When the part of hardware responsible for displaying is done with a display cycle (or VSync kicks in), it looks at the buffers and either displays the same one again or displays the ready buffer if it is newer. When the part that does the rendering is done, it marks it's buffer ready, then renders into whichever of the other buffers is not being displayed. This way the newest ready buffer is always displayed, rendering works continuously and there is no tearing, at least in theory.
@javaguru7141
@javaguru7141 11 ай бұрын
The real downside to this type of technique when used for the framebuffer is latency. I can't play games with triple buffering except on very high refresh-rate monitors because the latency causes me nausea (except with an uncapped internal/buffer refresh rate which doesn't seem to be commonly implemented sadly).
@sarkedev
@sarkedev 11 ай бұрын
Yup, screen buffer was my first thought too.
@joeroeinski1107
@joeroeinski1107 11 ай бұрын
Semaphores could also be ideal as fences can cause the CPU to stall waiting for GPU work to finish. Semaphores would allow for exclusive synchronization of GPU tasks ensuring the CPU is constantly writing commands and the GPU is constantly processing them. Great video nonetheless.
@oliverer3
@oliverer3 11 ай бұрын
Love semaphores, very useful if a bit scary!
@Stoney3K
@Stoney3K 11 ай бұрын
In real world implementations these are probably implemented as semaphores, because the transferring of data is being done in a background thread anyway. The busy-waiting done by a fence is probably done here for simplicity purposes because it makes the 'waiting' part easier to explain.
@joeroeinski1107
@joeroeinski1107 11 ай бұрын
@@Stoney3K Yes. Transfers don't just run as a background thread, but DMA transfers over PCIe can be done completely async to the rest of the system (and GPUs often have dedicated transfer queues to accommodate this, allowing for ultra-fast async transfer from the CPU). Nowadays you can just generate some data yourself on the GPU though in compute, eliminating the need to transfer entirely and keeping everything local to VRAM.
@Stoney3K
@Stoney3K 11 ай бұрын
@@joeroeinski1107True if you consider transferring of things like textures and shaders from the CPU to the GPU. But most of the waiting is often caused by the game loading in or parsing new assets from disk, which make it noticeably slow because I/O is *much* slower than CPU/GPU/memory access. It's even more pronounced when the game is an online one and the assets have to be fetched from an offsite server.
@joeroeinski1107
@joeroeinski1107 11 ай бұрын
@@Stoney3K Absolutely, though with emerging technology such as DirectStorage this soon may not be an issue.
@stratos2
@stratos2 11 ай бұрын
I just binged all of your optimisation videos. The metaphors are awesome and easy to follow, the code and graphics are clean, the voiceover is easy to understand. This is what I wish school/university was like. Instant subscribe, you have earned a place among my favorite KZbinrs. Thank you for your work.
@Vercidium
@Vercidium 11 ай бұрын
Far out, thank you! I'm stoked you like them and hope they help!
@ArneChristianRosenfeldt
@ArneChristianRosenfeldt 11 ай бұрын
I can’t read the tiny font
@DaStuntChannel
@DaStuntChannel 11 ай бұрын
school/university should teach you how to come up with these ideas by yourself
@nicosoftnt
@nicosoftnt 11 ай бұрын
@@DaStuntChannel Universities teach you 15 years old techniques in a field that is always 5 years ahead and counting.
@DaStuntChannel
@DaStuntChannel 11 ай бұрын
@@nicosoftnt That as well
@stormsoendergaard3023
@stormsoendergaard3023 11 ай бұрын
This is standard behavior in all major game engine used in production for the last 10-15 years.
@diddlenfiddle7311
@diddlenfiddle7311 11 ай бұрын
I was thinking that might be the case because unless I'm missing something, which is likely, he's described async code
@bradbradford8576
@bradbradford8576 11 ай бұрын
I wonder when someone working at Minecraft is going to find out. Split screen with my kids is ridiculous if anyone is crafting. It freezes every time
@gendalfgray7889
@gendalfgray7889 11 ай бұрын
UE already have that?
@greatbriton8425
@greatbriton8425 11 ай бұрын
I'd be surprised if this was true.
@Unethical.FandubsGames
@Unethical.FandubsGames 11 ай бұрын
@@greatbriton8425 Yeah it was definitely an exaggeration but he's right that it's not new.
@SatisfiedOnion
@SatisfiedOnion 11 ай бұрын
I love this man's food analogies as much as this guy loves his optimization. Amazing video, I'm so in love with the animations!
@duncathan_salt
@duncathan_salt 11 ай бұрын
It's worth noting that for some games, the additional input delay might be considered unacceptable. Most games it won't matter but in those rare cases it may be necessary to explore alternatives
@markdmckenna
@markdmckenna 10 ай бұрын
I think this technique won't increase input delay. It effectively just leaves old geometry on screen until new geometry is available. At worst you'll get "pop ins" instead of stalls.
@X606
@X606 10 ай бұрын
@@markdmckennait it does add input delay, think of it this way: now you're shipping a whole frame with this old mesh instead of the new one, that might take 16ms or so, but what if 5ms into those 16ms the transfer completes? now you still have to wait for the full frame to be drawn before we can include the new mesh in the next frame. Whereas if we just stalled for those 5ms we'd only have to wait 5+16 ms instead of 16+16ms
@markdmckenna
@markdmckenna 10 ай бұрын
@@X606 Maybe a different definition of input delay here? IMO as long as we're providing "reasonably" up to date geometry for the user to interact with, there is no added input delay.
@Ghorda9
@Ghorda9 9 ай бұрын
@@markdmckenna instead you get more render latency.
@potato9832
@potato9832 4 ай бұрын
@@markdmckenna Yeah. Earlier thread wasn't making sense to me. Input processing is non-graphical, so dunno why delayed rendering would delay input processing unless you tied input processing to your draw() routine. Albeit which happens a lot in amateur games using generalized game engines, but I presume this topic is scoped to more advanced game programming techniques.
@lopodyr
@lopodyr 5 ай бұрын
Lots of people seem to be mad at the fact that these optimizations are not groundbreaking and already exist in some engines. But as a game designer making solo projects on several engines, I'm super thankful for the amazing explanations of processes I would otherwise be unaware of. I love to see how the technologies we used are built from thousands of smart decisions like these. Also, good job and good luck on your engine project :D
@Vercidium
@Vercidium 5 ай бұрын
@@lopodyr thank you for the kind words, I’m glad this video has helped!
@Candywolf949
@Candywolf949 11 ай бұрын
yooooo i love that not only did you make a cool game i enjoyed, but that you're sharing all the knowledge you learned from making it with everyone. Good luck dude! I hope you continue this, It's really interesting and I love it.
@Mint25pop
@Mint25pop 11 ай бұрын
Videos like this are rare to find But It has to be my favorite type of video by far, making code run faster, better gaming experience, GPU goes vroom I love it!
@Vercidium
@Vercidium 11 ай бұрын
Thank you, more videos to come!
@bejoscha
@bejoscha 11 ай бұрын
I'm not coding games and stumbled here by chance, but this is a really, really well done description which can be appreciated by anyone with at least a bit of coding experience. Thanks.
@starplatinum3305
@starplatinum3305 11 ай бұрын
Bro i need more optimization videos this is amazing af
@Vercidium
@Vercidium 11 ай бұрын
Working on it! Thank you
@chickennuggetman2593
@chickennuggetman2593 11 ай бұрын
​@@VercidiumCan this work for terraria? If so, maybe a mod could be made for my dinky glorified potato with a screen..
@themourningwolf8926
@themourningwolf8926 11 ай бұрын
Uhm, the best person to ask is the dev, I recomment going to the subreddit and asking Redigit and his crew if this is something they have toyed with or even considered. I'm sure he would be stoked to see some new ideas!@@chickennuggetman2593
@goatmeal5241
@goatmeal5241 11 ай бұрын
It really was worth buying this 16,000 fps monitor---this is the first video to really use it to its fullest, but boy is it glorious.
@waltonsimons12
@waltonsimons12 11 ай бұрын
Waste of money. Nobody needs 16,000 fps. 12,000 is more than enough.
@AntiAntYT
@AntiAntYT 11 ай бұрын
the eye doesn't see more than 4,000 fps
@nukesrus2663
@nukesrus2663 11 ай бұрын
@@waltonsimons12 Trust me dude, once you've experienced 16,000 fps, 12,000 feels like looking at a slideshow.
@aqua-bery
@aqua-bery 11 ай бұрын
​@@AntiAntYTthe eye sees up to 60fps. Everything above is still useful, because the world runs at ∞ FPS, so the closer your pc can be to that, the better it will ~feel~
@luviam0001
@luviam0001 11 ай бұрын
@@aqua-bery Eyes can see much more than 60fps. The visual difference from 60fps to 120fps is quite noticeable as 120fps is just a lot smoother visually and your eyes can see that difference.
@Kw1h
@Kw1h 11 ай бұрын
This is a highly optimized dev tutorial. Jokes aside I think you have a true talent for game dev and teaching. Subscribed.
@KitsumiTheFox
@KitsumiTheFox 11 ай бұрын
This kind of sounds like double buffering, but for the geometry instead of the actual framebuffer. Very cool idea!
@Cara.314
@Cara.314 11 ай бұрын
It's know as Asynchronous Buffer Update/Upload, nothing new. The underlying concept of decoupling data transfer from rendering to avoid stalling the graphics pipeline is fundamental to graphics programming and has been a consideration as long as there have been programmable GPUs and sophisticated graphics APIs. it's been a feature of both directx and ogl for decades at this point.
@MadHau5
@MadHau5 11 ай бұрын
That's exactly what I thought! Same basic principles as double buffering!
@FrankHarwald
@FrankHarwald Ай бұрын
Asynchronous double buffering is used all over in software architecture - from network, i/o, file system, ipc, database, sound & graphics handling & more, in kernel, drivers, in plumbing layers & in user programs, from industrial automated real-time applications to interactive user-centered gui apps like browsers, games & more.
@lucaspawprint1888
@lucaspawprint1888 11 ай бұрын
The master chef has an infinite number of pans, but doesn't want to overwhelm his apprentices, so he keeps only the amount of pans necessary in the kitchen until a greater or lesser amount is needed.
@Vercidium
@Vercidium 11 ай бұрын
Haha excellent analogy
@angeldude101
@angeldude101 10 ай бұрын
Well, maybe not _infinitely_ many pans. More like, only about 4 billion pans. And usually when the chef needs more, rather than just grabbing the amount needed, usually they'll just grab as many extra pans as they're already using. It wastes a bit more space in the kichen, but it saves on the amount of trips to fetch more pans a way that generally balances out well.
@cookietheory
@cookietheory 11 ай бұрын
My favorite series on youtube, thank you for doing it!
@Vercidium
@Vercidium 11 ай бұрын
Too kind! Thank you
@AlucardNoir
@AlucardNoir 11 ай бұрын
Isnt this just asyncronous compute?
@zivmbs
@zivmbs 11 ай бұрын
I really loved the video and the analogy. I think you should increase the size of the code and animations, because seeing them on mobile is kind of hard. Great video nonetheless!
@Vercidium
@Vercidium 11 ай бұрын
Will do, thank you for the feedback and glad you liked the video!
@iminumst7827
@iminumst7827 11 ай бұрын
I had a similar issue in my 2D game made in Game Maker Studio. When it tried to render some high resolution sprites I would get those stutters. However, I found a very useful command "texture_prefetch" which as you can guess loads a texture group into VRAM memory even if it's not being drawn yet. And "texture flush" clears a group from VRAM. By being manually proactive about texture loading, I not only removed all the stutter, but I also cut level loading time down to under half a second. I'm pretty sure all engines have asynchronous buffered data loading / rendering, but I think some developers don't utilize it to it's full extend and just try to render a bunch of unloaded data at once. Your explanation is very good, and I hope it reminds other devs to think more carefully about asset loading.
@Jmcgee1125
@Jmcgee1125 11 ай бұрын
Fantastic overview. Right to the point and thorough enough to show off everything without getting bogged down in the details.
@Mostafa-hy4ty
@Mostafa-hy4ty 24 күн бұрын
This was actually a pretty awesome topic, thanks a lot for bringing it to attention :D
@dyllanmccreary688
@dyllanmccreary688 10 ай бұрын
something about this video made me super excited to watch, maybe the thumbnail/title.
@knoetsch13
@knoetsch13 9 ай бұрын
Now I'm hungry.
@WartimeFriction
@WartimeFriction 11 ай бұрын
I don't code yet but it is something that I find fascinating. I really enjoyed how you made this problem make sense even to me. Thanks for sharing
@ThatNiceDutchGuy
@ThatNiceDutchGuy 8 ай бұрын
Wow, I really like that underlaying background simulation at 1:51 I'm trying building something similar myself using Openprocessing but this looks like some great end result! Thanks for the inspiration.
@markonfilms
@markonfilms 10 ай бұрын
This is awesome! Managing stuff like this is still a real challenge and this is a great solution. Thank you for the great easy to understand explanation too!
@Wyrmver
@Wyrmver 11 ай бұрын
the biggest thing this video taught me is optimization =/= fewer lines
@Kyrelel
@Kyrelel 11 ай бұрын
*fewer
@Wyrmver
@Wyrmver 11 ай бұрын
@@Kyrelel thanks
@nerdycatgamer
@nerdycatgamer 9 ай бұрын
Usually the code with fewer lines is actually severely less optimized. Take a look at all the ""clean"" javascript code with a million abstractions and chained method calls. You have your fancy iterators when a simple for loop is literally 20x faster
@MrDoboz
@MrDoboz 2 ай бұрын
it depends. if your bottleneck is storage, which used to be true when we had floppies, fewer lines meant more content and thus a more complete experience, a better value overall
@mike22273
@mike22273 3 ай бұрын
I love how every metaphor is a pub. “How does quantum computing work?” “Well it’s like a pub with a quantum pan” 😂
@Zizaco
@Zizaco 11 ай бұрын
"Explain double buffer like I'm five" Great video Vercidium!
@castlecodersltd
@castlecodersltd 5 ай бұрын
Thanks for this, I'm really enjoying watching your videos. When I come to optimizing I'll be circling back to make sure I've covered the things your have. All the best 🙂
@Blademaster162
@Blademaster162 11 ай бұрын
Great video, loved all the animations. Even as someone who isn't particularly experienced in coding I feel like I understood everything!
@SylooxD
@SylooxD 11 ай бұрын
Great video and I am sure it will help me in the future 👍At the first moment I thought the sorting by swapping with the first element only works with 2 meshes but after thinking about it I realized it also works well with longer lists too if the transfer time is equal for every mesh. If not, then a circular array/ring buffer might be a better alternative to avoid rendering fast-to-transfer future meshes before slow-to-transfer past ones. That would cause the future mesh to render 2 frames while skipping the past one with your algorithm.
@Vercidium
@Vercidium 11 ай бұрын
Excellent point you’re right, a ring buffer would be more appropriate here. Now you have me thinking: I should be removing the element and inserting it at the start, rather than swapping. You’re right, great pickup! I wrote a similar thing for a particle engine, which does skip over the slow-to-transfer ones to ensure the most up to date buffer is always being rendered (even if it means an entire frames worth of data is skipped), i.e. if the cpu runs faster than the GPU and is writing to 2 buffers each frame, every 2nd buffer will never make it to the screen
@stratos2
@stratos2 11 ай бұрын
​@@VercidiumI would love to see a video where you take all the improvement ideas from the comments and try to apply them and see how they do.
@re_nforce
@re_nforce 11 ай бұрын
Everything before 2:57 was basically explaining double buffering right?
@Nevict
@Nevict 11 ай бұрын
I like how you're showing alternatives to the "just add more cores/memory" mentality.
@kyraxx
@kyraxx 11 ай бұрын
Won't these extra copy of the mesh consume more memory? I suspect this is a compromise. Here the mesh is extremely simple so it doesn't need much memory. On a more complex mesh this could require you to "just add memory".
@qvindicator
@qvindicator 11 ай бұрын
@@kyraxx The extra threads would require more cores to be more efficient as well. This solution is literally "just add more cores/memory", but it works.
@internet5076
@internet5076 11 ай бұрын
Just one more
@budgetarms
@budgetarms 11 ай бұрын
That is not really seen as a real optimization, more like a technique that (as you said) has been done. It is really interesting to see your approach compared to approaches game studio's make. A GDC talk that is on a technical level really interesting is this one "Marvel's Spider-Man: A Technical Postmortem". I also want to ask a question about your previous video, you mention that indeed triangle strip is way faster than triangle list. The problem that I seem to face, is that there are no tools, as far as I know of that convert triangle list to triangle strip. This is not a problem when you make all other models yourself and create a script that does it for you. But how did you do it in your previous video?
@Vercidium
@Vercidium 11 ай бұрын
Absolutely, technically this is a timing issue but since it affects game performance, it falls under the broader ‘optimisation’ category For complex models like characters, converting them into triangle strips isn’t easy. Modern renderers will use an index buffer to help, where the model is broken down into triangle strips of the same length (e.g. 3 triangles) and then a GL_PRIMITIVE_RESTART is set to tell the shader to start a new triangle strip every 3 triangles (for example) There will still be some vertices that hold the same data but any reduction in memory is a performance win
@budgetarms
@budgetarms 11 ай бұрын
​@@Vercidium I wish DirectX had something like that. It's really interesting how other API's do specific things.
@Vercidium
@Vercidium 11 ай бұрын
⁠@@budgetarms looks like DirectX 10 has this feature, check out the ‘Generating Multiple Strips’ section learn.microsoft.com/en-us/windows/win32/direct3d11/d3d10-graphics-programming-guide-primitive-topologies
@budgetarms
@budgetarms 11 ай бұрын
@@Vercidium Thanks, I am looking into it, just wondering do you have a discord server (or is something like that in the works)?
@budgetarms
@budgetarms 11 ай бұрын
@@Vercidium Just wondering, how do you do networking on your game, do you use an external OpenGL library for that or what?
@akhileshchandorkar1807
@akhileshchandorkar1807 11 ай бұрын
This is an epic video man, really liked the way you showcased your iterative design methodology to refine the problem into smaller chunks and solved them one at a time.
@Vercidium
@Vercidium 11 ай бұрын
Thank you, I’m not a teacher by any means but I’m learning so much creating these videos. Trying to find the best way to explain these things takes a while and I always resort back to food analogies haha
@akhileshchandorkar1807
@akhileshchandorkar1807 11 ай бұрын
@@VercidiumHonestly, its still really cool that you're able to make parallels with these kinds of arguments. Oftentimes, when I'm trying to explain my code using analogies, they end up just becoming warped, and all of a sudden you have a taxi driver talking about repairing a plane or something :/
@Vercidium
@Vercidium 11 ай бұрын
@@akhileshchandorkar1807 hahaha I know what you mean. I originally was talking about a restaurant with tables, plus a waiter and a chef, but it all got too complex. Simplifying it down to a chef and their pans worked much better. Takes a lot of iteration and feedback before I’m happy posting it here
@aljazbrilj1698
@aljazbrilj1698 11 ай бұрын
Very good, thank you for informing the community
@protossinator
@protossinator 11 ай бұрын
If only you had posted this video a few months sooner! I recently bought a new pc, and repeatedly sent it back to the company since I was experiencing weird stutters when meshes were loaded / updated in my games. I eventually boiled it down to a game engine issue myself, but I'm so glad that this video confirmed that. No money wasted on a broken machine :).
@jiegao3591
@jiegao3591 11 ай бұрын
There's actually an optimization mod for Minecraft that more or less does this where the renderer will keep using an older mesh until the new ones are ready. You did a nice job with the analogies!
@lancestryker
@lancestryker 11 ай бұрын
What's it called?
@nindew21Laughyourassoff
@nindew21Laughyourassoff 11 ай бұрын
What is it called?
@McHorsesCreations
@McHorsesCreations 11 ай бұрын
@@nindew21Laughyourassoffit’s either Sodium or Nvidium, there is also a mod Distant Horizons on the relevant topic
@winumoritribe8425
@winumoritribe8425 11 ай бұрын
Holy shit, this is spectacular! It's amazing how much more you can do with that one step further.
@blocc_nova746
@blocc_nova746 11 ай бұрын
This man spent 4 years of his life fixing the little freezes you get every once in a while. Real dedication!
@Cara.314
@Cara.314 11 ай бұрын
he didnt though, most good engines already do this sort of thing. though it is up to devs to properly use the engines systems to take advantage. you could easily circumvent them. Also, this is only 1 possible cause of freezes. It's known as Asynchronous Buffer Updates/Uploads.
@nicolasdesenvolvedor1642
@nicolasdesenvolvedor1642 10 ай бұрын
truly incredible, good job!
@someprick7705
@someprick7705 11 ай бұрын
0:20 Wendy’s thanks you for the inspiration for lunch lol.
@Vercidium
@Vercidium 11 ай бұрын
Haha I love it
@mz_eth
@mz_eth 11 ай бұрын
Love the analogies and especially the visuals, you have such a knack for presenting problems in an easy to understand light! Great vid :)
@Vercidium
@Vercidium 11 ай бұрын
Thank you, that means a lot!
@ichbinschwul187
@ichbinschwul187 10 ай бұрын
incredibly well edited, paced and informative video
@jan.melcher
@jan.melcher 11 ай бұрын
Wouldn't there be a chance that each new mesh clogs up the transfer pipeline even more, so you would end up with drawing really old meshes at some point?
@StewartWild
@StewartWild 11 ай бұрын
This video is epic. Liked, subscribed. I can't wait to watch your other ones, you have a great mind for being able to teach and explain concepts.
@soviut303
@soviut303 11 ай бұрын
Really excellent explanation for an issue a lot of players, and even developers, incorrectly associate with optimization. Also, I noticed your mic is picking up a lot of room reverb. A cheap mic shroud behind the mic will help a lot. The poor man's shroud is a closet full of clothes with the mic partially inside. If you can't fix it at the mic, try a "de-room" or "de-reverb" plugin. Your visuals are fantastic, your audio can be just as good without much more effort.
@Vercidium
@Vercidium 11 ай бұрын
I can't hear the reverb myself but I did notice an echo when standing next to a wall and recording. I recorded while standing in the center of my room instead, and I'll try a shroud too thank you for the recommendation :)
@soviut303
@soviut303 11 ай бұрын
@@Vercidium Cool, glad I could help. I noticed you've got a demo video about raytraced audio. Maybe this is an opportunity to do a game engine video about it to test your audio setup.
@xaalcarlsonanimations1539
@xaalcarlsonanimations1539 11 ай бұрын
im not really doing anything in game development these days but this tutorial was so well handled and impressive that you earned a new sub. thanks for that vid lol
@Vercidium
@Vercidium 11 ай бұрын
Thank you! It took a while to make
@suza3199
@suza3199 11 ай бұрын
This is genuinely interesting. I love it. Keep it up!
@SigmaSixSoftware
@SigmaSixSoftware 11 ай бұрын
This guy just added Promises to a game engine
@Vercidium
@Vercidium 11 ай бұрын
Best comment hahaha
@Wishbone_Games
@Wishbone_Games 11 ай бұрын
Excellent video i genuinely learned so much from it. Love the metaphors, keep up the great work!
@Vercidium
@Vercidium 11 ай бұрын
Glad to hear, thank you!
@_nwL
@_nwL 11 ай бұрын
Great video, I learned a lot! Small comment for future endeavors: watching this on mobile was difficult because I assume you optimized the text size for fullscreen desktop viewing. Other than that, I loved it!
@Vercidium
@Vercidium 11 ай бұрын
I’ll increase the font size in the next video, thank you!
@GOLD4DJ
@GOLD4DJ 11 ай бұрын
This.. this is a beautiful explanation. Thank you.
@silicalnz
@silicalnz 11 ай бұрын
Just a note. The code you show is a very tiny font size. It was difficult for me to read.
@JustfknBill
@JustfknBill 8 ай бұрын
Bruv you are the single most valuable resource I have as an indie dev. My games will run buttery smooth because of you and those like you. I've had these stories in mind since i was a child and didn't have the tools or skills to do them right. But with people like you and tools like blender and unreal, I will bring some really fun stuff! For the love of gaming!
@Vercidium
@Vercidium 8 ай бұрын
Thanks so much! I’m glad to help
@JustfknBill
@JustfknBill 8 ай бұрын
@@Vercidium When I grow my company and add to it, you're definitely hired if you want it. I'll respond in the future with a list of works & the studio name.
@ImNotGam
@ImNotGam 11 ай бұрын
Got it, I just need enough memory for 15 thousand meshes.
@Vercidium
@Vercidium 11 ай бұрын
Hahaha noooo
@JATmatic
@JATmatic 8 ай бұрын
I once implemented in GL4.5 similiar thing, for the uploaded uniform constants (UBO). It used fences to avoid remapping/reallocating the GPU memory each time when possible. It allocated N slots for the blocks in a single UBO. For each slot index, a fence is used tell if CPU is allowed to reuse it yet. If no slot was ready, a new (bigger) UBO would be allocated. After a few initial frames, the UBO's capacity would stabilize.
@ns2qhd520
@ns2qhd520 11 ай бұрын
Hey love the video man but the code font is a little small for a pc and almost microscopic for my phone. The animations and everything are also amazing but if you could enlarge the code it’d make the content more accessible.
@Vercidium
@Vercidium 11 ай бұрын
Will do for the next video, thank you for the feedback!
@miigon9117
@miigon9117 11 ай бұрын
Why this works: modern GPU has a lot of bandwidth but with a high latency to transfer data from main memory to gpu.(a lot of car lanes but long way to drive). If we could have 0 latency then we wouldn't need this because any transfer would be finished very quickly (high likelihood of finishing transfer before being drawn). Instead of doing nothing and waiting for the transfer to complete, we effectively stack multiple extra transfers for future frames within the first transfer's wait time (we can do this because we have a lot of bandwidth. aka we are sending more trucks on different car lanes simultaneously instead of waiting for the first one to come back and then send it out again). This is a form of parallelism and this idea of "doing other things or doing more of the same thing while waiting for the first one to finish" is everywhere in both cpu and gpu programming and let's you make more efficient(full) use of your hardware.
@fuzzy-02
@fuzzy-02 11 ай бұрын
Would sorting still be viable if the number of meshes is very big? Also, I loved this video. I never even realized this. Or rather, I knew of it but never was consciously aware of it while coding
@Vercidium
@Vercidium 11 ай бұрын
For heaps of meshes it would get pretty slow, something like a ring buffer would be much better. Thank you!
@zeyzer3405
@zeyzer3405 11 ай бұрын
My god it's so hight quality. I subscribe immediately!
@tgirlshark
@tgirlshark 11 ай бұрын
this is what wgpu does behind the scenes, I love wgpu
@tgirlshark
@tgirlshark 11 ай бұрын
also I love your channel, content like yours is rare, unique and very informative, I learn a lot with every Video, optimizing things to the limit is addicting hehe
@digitalasylum369
@digitalasylum369 11 ай бұрын
Great job breaking down such a complex concept to an easily digestible narrative.
@filiformis
@filiformis 11 ай бұрын
Reminds me of a swap chain, only for geometry instead of fully rendered frames. Very cool!
@noxagonal
@noxagonal 11 ай бұрын
Honestly, that's the future of everything nowadays, almost everything needs to be pipelined, the problem is that the more you pipeline, the more (relative) lag it introduces. Personally I settled for 2 mesh buffers for dynamic meshes, block frame if we catch up and the mesh isn't fully sent yet, though I might change this to non-blocking later. I'm also thinking which mesh data actually needs to be updated anyways. UVs might not need to be re-uploaded to the GPU, it's mostly just the coordinates and vertex normals. So I'm thinking of splitting the vertex into 2 buffers, one for coordinates and normals, and the rest into another struct. This way the transfer size should be smaller and shouldn't cause many issues. This saves space on the VRAM, allows custom attributes. Cache misses are very likely to happen though so it needs to be measured... Lots of options to explore. :)
@datow4327
@datow4327 11 ай бұрын
love the vids
@toxiccan175
@toxiccan175 11 ай бұрын
I’m curious: do you ever look at Minecraft optimization mods to get ideas of how to make your own voxel game engine better? People have tried many methods and there’s a lot of source code out there
@Vercidium
@Vercidium 11 ай бұрын
I haven’t but that’s a good idea, would be interesting to have a look through their source code to see what OpenGL tricks they’re using
@toxiccan175
@toxiccan175 11 ай бұрын
@@Vercidium Check out Sodium and related projects. They rewrote rendering in Minecraft to work with OpenGL and made it really efficient. There are related projects and extension type mods that are easy to find as well.
@Vercidium
@Vercidium 11 ай бұрын
@@toxiccan175 awesome thank you, will do!
@jcm2606
@jcm2606 11 ай бұрын
@@toxiccan175 Minecraft has used OpenGL since the beginning, Sodium and the like just rewrote core parts of the renderer to use newer OpenGL features and be generally more efficient with memory and GPU usage.
@tinoesroho
@tinoesroho 11 ай бұрын
@@jcm2606 i've heard mumbles about the sodium sub-mod, nvidium. what's up with that?
@BlueAndy_
@BlueAndy_ 11 ай бұрын
Damn explained in not even 5 minutes. Good video, keep up the great work!
@glorytoarstotzka330
@glorytoarstotzka330 11 ай бұрын
at the end the performance was 15k fps, what was the performance of the mesh rendering without any optimizations at the very start, how many fps?
@Vercidium
@Vercidium 11 ай бұрын
About 115, its shown at 0:09
@VicJang
@VicJang 11 ай бұрын
The first part also explains why some fast food drive thru allocate an employee taking orders instead of letting customers order at the fixed kiosk.
@doruvidejesus4508
@doruvidejesus4508 11 ай бұрын
Wow this is incredible, those this also work in Unreal Engine 5?
@Vercidium
@Vercidium 11 ай бұрын
It should, I was talking to a Unity dev about how models are loaded behind the scenes onto the GPU, and it seems like there’s a few tricks you can do with offscreen rendering and preloading (not sure these terms are right) so you can know when a model is actually sent to the GPU, before you try to render it If Unity has these features I’d be surprised if Unreal didn’t! It’s a pretty important feature I reckon
@coolbrotherf127
@coolbrotherf127 11 ай бұрын
I'm so glad KZbin randomly showed this to me. Really cool stuff.
@sclexz
@sclexz 11 ай бұрын
didn't realize you were sector's edge dev until the end!
@Vercidium
@Vercidium 11 ай бұрын
Haha hey there! What gave it away?
@duytdl
@duytdl 10 ай бұрын
Very humble explanation style for laymen to understand. Kudos!
@inferno3197
@inferno3197 11 ай бұрын
You lost me at burger
@cuboembaralhado8294
@cuboembaralhado8294 7 ай бұрын
He won me at burger
@zackmichalski3674
@zackmichalski3674 3 ай бұрын
Mmmm. Burger
@Marc83Aus
@Marc83Aus 9 ай бұрын
I learned that lists and looping are great for optimization, thumbs up!
@Lopeirada
@Lopeirada 11 ай бұрын
Does this apply to game engine devs, or also to game devs that use game engines like unreal or unity?
@Vercidium
@Vercidium 11 ай бұрын
Game engine devs 100%. Game engines should take care of this but I’ve heard of some devs talking about stuttering because their models weren’t preloaded/off-screen-rendered (not sure if these terms are right) before they tried rendering them onto the screen
@mrrenreal
@mrrenreal 9 ай бұрын
I’m addicted to your channel! \o/
@SuprSBG
@SuprSBG 10 ай бұрын
0:02 I have 2K+ hours in NMS and never (on my computer which has over minimum spec) had a freeze like that.
@KikoBean
@KikoBean 11 ай бұрын
I know nothing about code. thank you for making something im still engrossed in despite not knowing anything
@Cara.314
@Cara.314 11 ай бұрын
Long freezes in modern games can be attributed to a variety of factors, often relating to resource-intensive operations or inefficiencies in handling game assets and rendering. Here are some of the common causes: Asset Loading: When games load large assets (like textures, models, or sound files) from the disk into memory, it can cause a noticeable freeze, especially if the game is not using asynchronous loading techniques. Garbage Collection: In games developed with languages that have automatic memory management (like Java or C#), garbage collection can sometimes cause freezes or stutters. This happens when the garbage collector runs to free up memory, temporarily halting other processes. CPU/GPU Synchronization Issues: If the CPU is waiting for the GPU to finish rendering (a scenario known as a GPU bottleneck), or vice versa (CPU bottleneck), it can result in freezes. Efficient parallel processing and synchronization are crucial to avoid such stalls. (the one this video covers part of, and far from the only possible cause) Inefficient Resource Management: Poorly managed resources, such as repeatedly loading and unloading the same assets, can lead to performance issues and freezes. Complex Calculations or Scripts: Intensive computations, like complex AI calculations, physics simulations, or extensive world updates, can cause freezes if they are not efficiently managed or offloaded to separate threads. Network Latency or Hiccups: For multiplayer games, network issues can cause freezes or lag if the game's state is tightly coupled with the timely receipt of network packets. Driver or Hardware Issues: Sometimes, the problem may lie outside the game itself, such as outdated or buggy graphics drivers, or hardware that is overheating or malfunctioning.
@cakesteak
@cakesteak 10 ай бұрын
chatgpt has entered the chat
@Thy_cockroach_crusader
@Thy_cockroach_crusader 15 күн бұрын
Or using a hard drive.
@Womcataclysm
@Womcataclysm 11 ай бұрын
Great video, hope this becomes well known
@nguyenhoangminhtrung2779
@nguyenhoangminhtrung2779 11 ай бұрын
My guy explains double buffer so my 5 year-olds can actually understand it, kudos to you!
@Some-q1
@Some-q1 11 ай бұрын
as I 5 year old I can confirm
@spicydaddy2526
@spicydaddy2526 11 ай бұрын
buddy idk anything about coding but I love games, and this made (I think) sense to me. well done.
@Vercidium
@Vercidium 11 ай бұрын
That’s great to hear, thank you!
@shadow50011
@shadow50011 10 ай бұрын
Explaining optimization to an American: "So Imagine a burger..."
@coalkey8019
@coalkey8019 10 ай бұрын
Cool video. I'd love to see everything filling up the screen so I can actually read stuff while watching on my phone.
@CaptainUltimaFTW
@CaptainUltimaFTW 11 ай бұрын
Stuff like this is why i love graphics engineering, the interwoven understanding of what the hardware does and how you can get it to do what you want it to in the most efficient manner is just fun. Cool stuff!
@Vercidium
@Vercidium 11 ай бұрын
Absolutely, it is a very rewarding kind of programming
@hardtofinduniquename
@hardtofinduniquename 10 ай бұрын
This specific technique is for when you're **dynamically building a mesh** to represent a voxel world. At first, I misunderstood and thought each block in the world was a separate mesh and the solution didn't make much sense. The title and Intro examples makes it seem applicable to all games. If you're making a game without generated meshes, this specific fencing technique won't be very useful. However, double buffering is generally useful in many scenarios.
@gavinmorton7682
@gavinmorton7682 11 ай бұрын
Hey small feedback: could you please zoom in when displaying code? Small screens cant see the logic you're trying to showcase (even if the exact text doesn't matter). Awesome video as always❤️
@codeChuck
@codeChuck 5 ай бұрын
The animations are hilarious :D Those little hands of a video card :)
@ChamplooMusashi
@ChamplooMusashi 11 ай бұрын
Should you really be using a list? Wouldn't a pool be much preferable if we're considering optimization?
@SimonBuchanNz
@SimonBuchanNz 11 ай бұрын
A pool is a list though? (Not all lists are linked lists: this looks like C# where List is a dynamic array (like std::vector, ArrayList, Vec, etc)
@Vercidium
@Vercidium 11 ай бұрын
For a tiny amount of items a list is fine, but if we had a global list of all meshes in the scene then 100% should not use a list. A ring buffer that uses an array under the hood would be much better
@buzinaocara
@buzinaocara 11 ай бұрын
I find the burguer orderd analogy very helpful, but I still struggle to understand how it applies to the specific demo you are showing on-screen. What isthe mesh you are submitting? The entire voxel field is a single polygon mesh? Are you genereting that on the CPU? How? Why? Couldn't it be generated on the GPU with a geometry shader, or GPU compute? Couldn't the CPU just send a 3D texture of the voxels to render and the GPU just generates the polygon faces? For that demos specifically, you could just send a heighmap in fact. How about not even generating a mesh at all, but simply instancing the same cube mesh for every voxel? But ok, let's say this is just an illustrative example, but there could be other use cases where you have to generate a mesh on the CPU and then send that to the GPU to render... Them sure, you might want the GPU not to stall while waiting for that mesh data to come and create code that does other stuff while the data is being received. I understand that in theory. But again, how does that work on that demo? The only thing the GPU is doing is rendering that one mesh it's getting from the CPU every fram? What other work can it possibly do while waiting for that data? From what I gathered, this seems like the worst possible use case to exemplify your problem. Or am I missing something?
@HEADSHOTPROLOL
@HEADSHOTPROLOL 11 ай бұрын
Yeah this also got me pretty fucked up, I'm probably just small brain but it seemed like a pretty counter intuitive scenario to represent this problem and solution
@Dumb_Daft_Dim_Lafoole
@Dumb_Daft_Dim_Lafoole 11 ай бұрын
youtuber with 30k subs vs multimillion game companies
@anotherclearchannel
@anotherclearchannel 11 ай бұрын
Just wow! I am more than impressed with your communication and teaching skills (instant sub because of these traits alone). 🙏🏾 To say that I am so excited to consume your content is an understatement. 😁 I look forward to discovering and learning many new things alongside you. Please be encouraged and Thank You for such amazing content.
@Vercidium
@Vercidium 11 ай бұрын
You are too kind, thank you very much!
@NoName-1337
@NoName-1337 11 ай бұрын
From now on, my toaster can run crysis.
@ersia87
@ersia87 10 ай бұрын
I can't believe the closest analogy to a bottleneck was a burger. A *bottleneck*. But seriously, great video!!
I Optimised My Game Engine Up To 12000 FPS
11:58
Vercidium
Рет қаралды 737 М.
The Problem With Procedural Generation
17:57
Acerola
Рет қаралды 265 М.
Sigma Kid Mistake #funny #sigma
00:17
CRAZY GREAPA
Рет қаралды 30 МЛН
It works #beatbox #tiktok
00:34
BeatboxJCOP
Рет қаралды 41 МЛН
黑天使被操控了#short #angel #clown
00:40
Super Beauty team
Рет қаралды 61 МЛН
Dear Game Developers, Stop Messing This Up!
22:19
Jonas Tyroller
Рет қаралды 762 М.
When Your Game Is Bad But Your Optimisation Is Genius
8:52
Vercidium
Рет қаралды 1,5 МЛН
Why is video game topology so WEIRD? (Read pinned comment)
5:59
Magic Cyborg
Рет қаралды 78 М.
Giving Personality to Procedural Animations using Math
15:30
t3ssel8r
Рет қаралды 2,6 МЛН
Better Mountain Generators That Aren't Perlin Noise or Erosion
18:09
Josh's Channel
Рет қаралды 430 М.
Why Stairs Suck in Games... and why they don't have to
11:24
Nick Maltbie
Рет қаралды 1,5 МЛН
AI Copyright Claimed My Last Video
24:11
Venus Theory
Рет қаралды 652 М.
AI Learns to Play Dodgeball
10:59
AI Warehouse
Рет қаралды 1,1 МЛН
They Let the Intern Code...
12:50
Low Level
Рет қаралды 388 М.
Sigma Kid Mistake #funny #sigma
00:17
CRAZY GREAPA
Рет қаралды 30 МЛН