Layers | Game Engine series

  Рет қаралды 78,229

The Cherno

The Cherno

Күн бұрын

Пікірлер: 152
@TheCherno
@TheCherno 6 жыл бұрын
Thanks for watching, hope you enjoyed the video! One change which I somehow didn't mention in the video was making the m_Handled boolean in the Event class public, and changing its name to Handled. You can see this exact change here in the GitHub commit: github.com/TheCherno/Hazel/commit/5bd809312a266c23d13d84dcd08a833a526aa264#diff-1efdcc4a89a5bfd4da4f5d73c3df72f8 Happy New Year!
@revvilo
@revvilo 5 жыл бұрын
Much appreciated :)
@pramodbhandari9151
@pramodbhandari9151 4 жыл бұрын
part 3 : 12:47
@ringkunmori
@ringkunmori 6 жыл бұрын
Ogres are like Game engines, they have layers
@ap1evideogame44
@ap1evideogame44 6 жыл бұрын
What about cakes? Cakes have layers.
@alanramirezherrera7485
@alanramirezherrera7485 6 жыл бұрын
And onions, onions have layers
@Ayodehi
@Ayodehi 6 жыл бұрын
Glad I wasn't the only one to think this... :)
@seditt5146
@seditt5146 5 жыл бұрын
Parfait might be the greatest thing on the Whole Damn Planet!
@neemaadam
@neemaadam 3 жыл бұрын
When was the last time i watched that?
@KingdomBusiness21
@KingdomBusiness21 6 жыл бұрын
Your channel and knowledge are invaluable. Understanding C++ in a modern, free and advanced way is a blessing. I genuinely hope and even pray that you receive financial support to do this as much as you want :D
@CalSeedy
@CalSeedy 6 жыл бұрын
If the higher ups at EA would get their collective heads out of their a**es and realise the raw potential of coding outreach. Future employees, future contracts, more advertisement for them, it's win-win for them and TheCherno.
@madeso
@madeso 5 жыл бұрын
I wrote a layer system for my previous engines, in 90% a bool was less of a hassle to deal with given that you only have a maximum of like 5 layers. Layers also tend to get super complex if you have shared state/interaction between states.
@ComprarAlimento
@ComprarAlimento Жыл бұрын
there is a different way to set to /MDd or /MD that changes the properties accordingly. For /MDd, add : staticruntime "off" runtime "Debug" For /MD, add: staticruntime "off" runtime "Release"
@urzaschannel3335
@urzaschannel3335 Жыл бұрын
Actually it's enough just to remove 'staticruntime' statement - the Visual C will use project defaults which are /MD / MDd, although 'runtime' statements still may be required (Premake determines which version to use based on 'symbols' and 'optimization' statements)
@esben181
@esben181 6 жыл бұрын
I like your new style of presenting code. It allows me to read the code, minimize KZbin and then try to implement it myself.
@alicia696
@alicia696 3 жыл бұрын
Super helpful and inspiring tutorial and game engine series!
@emanuelkokovics
@emanuelkokovics 2 жыл бұрын
In the Application.cpp we have e.Handled but where is Handled defined?
@m96fa40
@m96fa40 9 ай бұрын
I think it is a public variable, but I'm not so sure how did he implement it. However, you can make an inline bool Handled() const { return m_Handled; } function where m_Handled is your protected bool variable;
@ness3963
@ness3963 2 жыл бұрын
How would the layers communicate with one another? Say I have a slider in my GUI layer that modifies the FOV of my camera in my Game layer. Whats the best way to facilitate that kind of communication?
@wggesucht533
@wggesucht533 6 жыл бұрын
I could really need a video on move Constructor / assignmment and copy elision!
@placid07
@placid07 6 жыл бұрын
Love this series. Keep up the great work!
@aaronsiegel8367
@aaronsiegel8367 6 жыл бұрын
FYI the m_LayerInsert iterator in the LayerStack class is invalidated when you emplace_back.
@nextwave5164
@nextwave5164 6 жыл бұрын
I had to do this. m_layerInsert = m_Layers.emplace(m_layerInsert,layer); m_layerInsert++;
@sevenbit
@sevenbit 4 жыл бұрын
yea the whole system is flawed - you can't do anything to the layer stack from update/event either. everything breaks if you add/remove a layer from an event or on update :)
@ChlorieHCl
@ChlorieHCl 5 жыл бұрын
I think you may have made a slight mistake. The push and pop actions on the vector could potentially invalidate the m_LayerInsert iterator, so instead of using an iterator, use an offset variable to prevent bad things from happening.
@jasperschellingerhout
@jasperschellingerhout 2 жыл бұрын
According to cpp reverence "[delete] Invalidates iterators and references at or after the point of the erase, including the end() iterator." So a simple reversal of the two operations should fix it
@ncky2431
@ncky2431 4 жыл бұрын
Class Hazel::Event has no member Handled. Its called m_Handled. And even then its inaccessible. So how does it work when you do it?
@ncky2431
@ncky2431 4 жыл бұрын
Fixed it. You have to rename the m_Handled from the Event System Video to Handled and it must be public. And in the Event dispatcher m_Event is a private attribute. Just weird how he renamed it and didnt mention it but here you go.
@Hello-vq4tn
@Hello-vq4tn 4 жыл бұрын
@@ncky2431 Yeah that confused me too. Had to go digging through the commit on GitHub
@dawid4450
@dawid4450 4 жыл бұрын
lol guys don't type every letter with him, you won't learn this way, try to implement some things on your own
@acelyon5221
@acelyon5221 2 жыл бұрын
Ima try this cause rn I have this issue, and I don't understand much of c++ but I did try and figure why it wouldn't work, and saw it was either not a member so I had to make it one, or it was reading the wrong header. I would love if he mentioned a rename and how he changed it cause errors in c++ can be hard to figure out for beginners
@acelyon5221
@acelyon5221 2 жыл бұрын
It worked thank you, I understand now how it works. :)
@joelincz8314
@joelincz8314 2 жыл бұрын
After some debugging I found I missed my export on layer class. Thanks!!
@Destroyer19941995
@Destroyer19941995 5 жыл бұрын
Very nice explanation Cherno thank you!
@pritamrathi3087
@pritamrathi3087 4 жыл бұрын
Thanks for the knowledge you share, your channel is invaluable. Didn't get such content/learnings from any other link. In some of the video you had said you will make a video on complete graphics flow, is it already there or yet to come?
@aarondraws7699
@aarondraws7699 3 жыл бұрын
my window that I create turns white and is perpetually loading anyone have any solutions I'm really struggling because there is no error for me to look into what might have gone wrong
@aarondraws7699
@aarondraws7699 3 жыл бұрын
fixed it accidentally deleted the line m_Window -> OnUpdate(); in the application.cpp Run function I though the layer-> OnUpdate would do that but you need both.
@許熙康
@許熙康 6 жыл бұрын
Don't know if i have misunderstood anything but doesn't the function PushLayer() leave m_LayerInsert unaffected, it remains m_Layers.begin(), therefore, the line "m_LayersInsert--" in PopLayers() causes error?
@huyvole9724
@huyvole9724 6 жыл бұрын
Wow You have a good Log to show info !
@andreagenor
@andreagenor 6 жыл бұрын
what do you think to convert this project to cmake and make it more flexible for all other platforms?
@esben181
@esben181 6 жыл бұрын
He is already using Premake which allows you to port to other IDEs and hence other platforms.
@ryanmeyers3863
@ryanmeyers3863 5 жыл бұрын
Can someone help me understand the for loop in Application::OnEvent() that he's added. At the first line (*--it)->OnEvent(e) Wouldn't this decrement it first, thus skipping the top layer? Also, LayerStack::PushLayer() doesn't increment m_LayerInsert, so I don't understand how it's supposed to keep track of where the overlays begin.
@BlackHawk2499
@BlackHawk2499 5 жыл бұрын
The end iterator points to the past-the-end element in the sequence. Therefore, we actually want to decrement the iterator before dereferencing it. std::vector test = { 1, 2, 3, 4, 5 }; // first element auto it = test.begin(); std::cout
@BlackHawk2499
@BlackHawk2499 5 жыл бұрын
To expand on this, C++ also supports reverse iterators with rbegin() and rend(). The provided code could be changed to something like this if you feel that it's easier to follow: for (auto it = m_layerStack.rbegin(); it != m_layerStack.rend();) { (*it++)->OnEvent(e); if (e.Handled) break; } EDIT: If you want this implementation to work you will need to add the rbegin() and rend() definitions to LayerStack.h: std::vector::reverse_iterator rbegin() { return m_Layers.rbegin(); } std::vector::reverse_iterator rend() { return m_Layers.rend(); }
@ComprarAlimento
@ComprarAlimento Жыл бұрын
@@BlackHawk2499 isnt it the same as: for (auto it = m_LayerStack.end() - 1; it != m_LayerStack.begin();) { (*it)->OnEvent(e); if (e.Handled) break; }
@aarondraws7699
@aarondraws7699 3 жыл бұрын
Could anyone kindly explain why all of his variable name begin with m_ ? what organizational purpose does that serve?
@yabot5496
@yabot5496 3 жыл бұрын
Member variable i guess?
@cuddeford
@cuddeford 2 жыл бұрын
Yes to differentiate the variables from method parameters of the same name. Using just an underscore instead of m_ is also common
@zhulikkulik
@zhulikkulik Жыл бұрын
It's short for member. Sometimes you get a situation where your function receives int x as a parameter and you need to assign it to int x in your object. This way names won't clash and you can just m_x=x instead of this.x=x.
@RaneMstSage
@RaneMstSage 4 ай бұрын
member variable i use m instead of m_ some just use _
@adamodimattia
@adamodimattia 4 жыл бұрын
“It’s hard for me to ALLOCATE time...” :)
@catorials444
@catorials444 4 жыл бұрын
it's a really common phrase actually
@WilliamWelsh
@WilliamWelsh 6 жыл бұрын
thank u for the tutorials maxmoefoe
@Sebanisu
@Sebanisu 3 жыл бұрын
This is similar to the Test classes code you created in the opengl series.
@ryanj.s9340
@ryanj.s9340 5 жыл бұрын
Kind of dipping my toes here but I’m doing so natively with the Windows API and DirectX... is this the same concept as “deciding which child window has focus” in terms of how the Windows API words things on MSDN
@yan-amar
@yan-amar 5 жыл бұрын
So what if you pop a Layer but then forget to delete it ? I'm not one of those who freaks in front of a naked pointer, but you talk about the ownership semantics of the LayerStack, however there is nothing enforcing those semantics, not even hinting it in the interface of the stack. I think this is just the case where unique_ptr would make sense (and first of all, let's be honest, unique_ptr has no overhead wathsoever). You return an rvalue reference to unique_ptr on pop() to indicate that you are releasing ownership, and you take it back on push with the same parameter. That said, for my part I would make the stack just manipulate raw pointers and not own the Layers.
@climatechangedoesntbargain9140
@climatechangedoesntbargain9140 5 жыл бұрын
+1
@dekrain
@dekrain 5 жыл бұрын
Actually you would return actual unique_ptr on pop, not a reference, since the unique_ptr would not be in the stack anymore.
@nokompromis2297
@nokompromis2297 4 жыл бұрын
In this scenario, Cherno is talking about a layer as a persistent thing, that shouldn't really be moved or deleted every frame, or frequently, at all. Thus, you would probably contain a real instace of a layer somewhere before you enter an entry point, and start doing stuff. Layers will be big, that is why Cherno isstoring them references to them, not as copies. Like a graphics layer with whole bunch of instructions, or events layer, with other heavy things, or debug layer with lots of ImGui stuff. Thatswhy, most of the time, you shouldn't bother about it, then you really shouldn't move or delete layers frequently.
@haos4574
@haos4574 4 жыл бұрын
@@nokompromis2297 the problem with his code is when you pop a layer, m_Layers loses reference to that layer, and thus it won't be deleted when the stack gets destroyed. The code is problematic.
@theo-dr2dz
@theo-dr2dz Жыл бұрын
@@nokompromis2297 No. Layer is polymorphic and polymorphy works through pointer indirection, not through value semantics. Also, the actual layers (GameLayer, ImguiLayer etc) are of different types and probably different sizes. That doesn't work with vector, vector needs elements of uniform type and size. The intention of the code is (kind of) deductable from the code. The layers are identified on pointer value, so if the client ever wants to pop a layer, it needs to keep it's own pointer. So, in this case the client is the owner of the Layer object. If the client doesn't keep it's own pointer, the stack becomes owner. But that is not very clear at all. I think yan-amar's suggestion is a lot better: store unique_ptr instead of Layer*. Let the pop functions return the unique_ptr so it returns the ownership back to the client. This clearly expresses the intention, and you will never leak a Layer object. Of course unique_ptr can't be copied so you need an intermediary: auto temp = std::move(*itr); m_layers.erase(itr); m_layerinsertindex--; return temp;
@daftmat31
@daftmat31 4 жыл бұрын
I've heard about game states too, as I may not understand all of this deeply yet, I have a doubt, are the layers you're talking about just like the so-called GameState design ? I think it is, but again, i'm not sure
@kallebalik
@kallebalik 4 жыл бұрын
I know this video is old, but I have a question. Why do we want the overlay to be absolute last and not pushed in front of the other overlays?
@supersquare
@supersquare 4 жыл бұрын
He explains this at 3:00
@kallebalik
@kallebalik 4 жыл бұрын
​@@supersquare It's actually the opposite the renderer will go front to back and the event will go back to front. That's why he's pushing in the back. I just made the process much more complicated in my head :)
@andrewgraham2546
@andrewgraham2546 3 жыл бұрын
So correct me if I'm missing something but what is the use of wrapping vector in a separate class? Std::vector already gives us interators like begin and end and also rbegin and rend... couldnt the layerstack be a vector maintained inside the application class?
@egunan
@egunan 3 жыл бұрын
3:50
@mukov
@mukov 3 жыл бұрын
I was about to comment the bug that the "m_LayerInsert" will be invalidated, but i saw that you changed it to "unsigned int m_LayerInsertIndex". Don't use "unsigned" except for bit operations, "int" arithmetic is potentially faster, because it is not required to wrap around, "size_t" is a known mistake. 10x for the videos!
@TheRVenson
@TheRVenson Жыл бұрын
I did some research about this statement because it made me curious. Wouldn't using the unsigned int for the index be safer to ensure that the value is never negative? I'm not sure if that's the reason.
@nextwave5164
@nextwave5164 6 жыл бұрын
I made my Camera class inherit from Layer so it can receive Events. Wondering if it's a good idea?.. works fine enough.
@jamesmnguyen
@jamesmnguyen 6 жыл бұрын
I think it makes more sense to have a Camera in every Layer. But whatever works, you can always change it later.
@DerrickCanfield
@DerrickCanfield 6 жыл бұрын
Is there a reason you are not using smart pointers in your engine? I understand in your other C++ fundamentals, but I imagine since this is an actual persisting project, you would want to use smart pointers.
@anthonybrigante9087
@anthonybrigante9087 5 жыл бұрын
I don't know if he's answered this at a different point in the series, but my assumption is that it's not worth the performance cost. Smart Pointers essentially introduce a form of garbage collection into C++, and doing this comes at a huge performance cost. In smaller projects where performance isn't vital, then smart pointers are a great idea - but if you need speed and are willing to manage memory yourself, smart pointers should be avoided.
@ChlorieHCl
@ChlorieHCl 5 жыл бұрын
@@anthonybrigante9087 It's shared_ptr which has a noticeable overhead over raw pointers. If you don't use custom deleters, unique_ptr in release builds should be as efficient (memory-wise and performance-wise) as manually new-ing and delete-ing. So I don't see the point of not using unique_ptr...
@climatechangedoesntbargain9140
@climatechangedoesntbargain9140 5 жыл бұрын
​@@anthonybrigante9087 smart_pointers are zero-cost...
@anthonybrigante9087
@anthonybrigante9087 5 жыл бұрын
@@climatechangedoesntbargain9140 smart pointers are absolutely not zero cost. I have to look more carefully into unique_ptrs overhead, since it seems to be fairly negligible, but a shared_ptr has a noticible performance overhead in high performance applications.
@climatechangedoesntbargain9140
@climatechangedoesntbargain9140 5 жыл бұрын
@@anthonybrigante9087its zero cost. Zero cost does not mean that the usage is for free, but that you would pay the same if you would do it manually and correct. Situations where you actually need shared_ptrs are rare anyways.
@blenderalien
@blenderalien 4 жыл бұрын
In Application.cpp line "if (e.Handled)" i get the error "Handled is not a member of Hazel::Event." Edit: create a Getter "bool & get_Handled() {return m_Handled;}" and in App.cpp: "if (e.get_Handled())"
@dustinclark5620
@dustinclark5620 3 жыл бұрын
Hello, would layers be the same as a State? StateStack etc? The implementation seems similar. Thanks
@b0570nk4
@b0570nk4 5 жыл бұрын
shouldnt there be virtual destructor for LayerStack?
@Berzeger
@Berzeger 5 жыл бұрын
LayerStack isn't supposed to have subclasses.
@dimts2701
@dimts2701 6 жыл бұрын
Merry->Christmas(); //happy new year!
@greenscreen587
@greenscreen587 6 жыл бұрын
segmentation fault (core dumped)
@srdjan3057
@srdjan3057 6 жыл бұрын
@@greenscreen587 Damn i miss Linux!
@agfd5659
@agfd5659 6 жыл бұрын
Exception thrown at 0x00000000: Access violation executing location 0x00000000.
@catorials444
@catorials444 4 жыл бұрын
does that mean that class Merry also has method Crisler?
@tttopcattt
@tttopcattt 4 жыл бұрын
Has anyone else who's following along had an issue with the e.Handled call?
@andrewgeary415
@andrewgeary415 4 жыл бұрын
if you add a getter to event.h you can just call that instead
@shadowleague2486
@shadowleague2486 4 жыл бұрын
I believe it would have been more efficient to use a doubly-linked list for the layer stack, wouldn't it?
@jonohiggs
@jonohiggs 4 жыл бұрын
That would be insert efficient but read / iteration inefficient. The layers are iterated every render call but layers are added super infrequently, so this is optimised for the iteration
@sc5shout
@sc5shout 6 жыл бұрын
Is there any sense to create layers on different threads (or use them in a threadpool)?
@brendan-from-mars
@brendan-from-mars 6 жыл бұрын
TheCherno is such a great teacher for modern C++, project structure and organization, programming patterns and so on that it is such a waste of talent that he just releases one video per week. Nevertheless, he is one of my favorite KZbinrs
@MsJavaWolf
@MsJavaWolf 6 жыл бұрын
I think he still works at EA. Probably the main reason why he doesn't have time to release more, but on the other hand his job is what made him a good programmer in the first place. Many people who make a lot of videos don't seem to have a lot of real world experience.
@MatkoFaka
@MatkoFaka 6 жыл бұрын
Raw pointers are not modern C++
@evolucaohunz
@evolucaohunz 6 жыл бұрын
The composite pattern of calling on update on each object within a layer should be handled by hazel, right? As I see now it’s an app responsibility to keep a list of objects within the layer and forward the framework callbacks to them, which I don’t see any benefit, as a “layer” is simply another object in the point of view of the e engine. Did I miss something?
@ahmadkakarr
@ahmadkakarr 6 жыл бұрын
thanks
@stfoggy124
@stfoggy124 Жыл бұрын
how should you address layers if you shouldnt address them by name?
@N014t4ll
@N014t4ll Жыл бұрын
Probably by indexing?
@stfoggy124
@stfoggy124 Жыл бұрын
@@N014t4ll I would Memorize a number any time I'd wanna address a specific layer?
@N014t4ll
@N014t4ll Жыл бұрын
Well I'm not exactly a pro at this but i think you could create an instance of the Layer and then pass in the address of the layer. Then anything you do to that layer should affect the layer in the layerstack. But I don't really know if this would work
@DrBarnabus
@DrBarnabus 6 жыл бұрын
Shouldn't the sandbox app be using MTd and MT as it isn't a DLL or am I missing something there?
@MsJavaWolf
@MsJavaWolf 6 жыл бұрын
Those options don't determine if your project will be a static lib or a DLL, they determine how the visual c++ libraries are linked into your project. MD and MDd mean that your app will load the visual c libs dynamically, it doesn't matter if your project is a dll, a lib, or an exe.
@DrBarnabus
@DrBarnabus 6 жыл бұрын
@@MsJavaWolf Thanks for the good answer!
@KennyTutorials
@KennyTutorials 5 жыл бұрын
You be in future create scene system? Or layers be considered as scenes? I think scene need to load some other world like a shop, or 3d menu, or other game map. And layers are needed to control the rendering itself. I ask because I like to use the scene system. And I use it in my engine. I also believe that the scene is also the base of the core.
@jibrilyahaya3731
@jibrilyahaya3731 6 жыл бұрын
Can you like give us a challenge after each video about the topic of the video
@GamerDude27
@GamerDude27 6 жыл бұрын
Second this, challenges personally help me learn, and then the next video could contain Cherno's solution
@mjthebest7294
@mjthebest7294 2 жыл бұрын
ChiliTomatoNoodle's style. Check him out :)
@derpartypatrick5660
@derpartypatrick5660 Жыл бұрын
Great series and up until this point everything made sense imo. But I don't see this implementation of the layerstack as useful. You have to push layers from outside, but if you want to remove a layer you need to give it a pointer to that layer, why? So do I have to store the layer pointer outside the layerstack the whole time? Also the pop logic doesnt make any sense. You could pop an overlay using the PopLayer function or am I wrong. This is so error prone. Not to mention the readability: You should have a function like PushBaseLayer and one like PushOverlayLayer or something. I guess this system has to be rewritten in the future. Nevertheless great series up to this point!
@duyquannhan9414
@duyquannhan9414 2 жыл бұрын
For anyone who get error during debug, running "GenerateProject.bat" may solve the problem. I builted the project successfully, but during debug, if I moved the mouse or did anything that returns a log, I would get Assertion failed error. Running the ".bat" file did it for me, hope this will be useful for someone else.
@Xeab
@Xeab 4 жыл бұрын
Layers are like ogres, they have game engines
@agfd5659
@agfd5659 6 жыл бұрын
You could make a video explaining what the std runtime library actually is.
@jamesmnguyen
@jamesmnguyen 6 жыл бұрын
The CRT runtime library is a collection of functions that are part of the standard, ie. memset, memcpy, strlen, malloc, etc. Usually it is implemented to work on one platform, ie Windows, Linux, MacOS. That's my knowledge, so anyone can correct me.
@madPL1239
@madPL1239 2 ай бұрын
Hi, Can layers be called game states? Game states understood as: state of the menu, interface, state of the actual game, state of the intro, etc.
@jehadkhaled906
@jehadkhaled906 6 жыл бұрын
you are the best
@youngjin8300
@youngjin8300 2 жыл бұрын
The code in LayerStack class is erroneous.
@ycombinator765
@ycombinator765 6 жыл бұрын
where have you learned these concepts ?, please add some references to that material too by the way thanks for this amazing stuff #LongLiveCherno
@pooria_garrett3020
@pooria_garrett3020 6 жыл бұрын
He has worked for more than 4 years (hopefully recollecting correctly) on game engines, and works currently @ EA in frostbyte division
@ycombinator765
@ycombinator765 6 жыл бұрын
thanks
@oj0024
@oj0024 5 жыл бұрын
Talks about debug name only for debug... Has a getName member function Xd
@bacontf2
@bacontf2 6 жыл бұрын
I was really looking forward to this series, it's a shame that now I feel cheated out of my own time because you seem not to value the opinion of your regular KZbin subscribers. When you announced you would be switching to this odd format of showing code you've already written (a format more suited to written media than a video), many people including myself voiced their opinion that this change would be detrimental to the viewing experience. One of the reasons why I feel this way is that it takes too long to pause, write out what there is on screen without any explanation, then unpause for a quick overview that would be much more detailed if you wrote it live - not to mention any mistakes or changes of mind you have along the way - it's a much more natural flow and helps show the viewer what the thought process should be when writing some code. People have pointed out to me that I can view the github repo for the code, but even when it's updated on time with the video's release, it's the same issue of just copying down text with little to no insight. I don't think anyone would have a problem with you releasing 1-2 hour long videos instead of these if it meant you wrote and spoke at the same time. I understand that you obviously first and foremost would like to make money from these videos, as evidenced by your patreon plugs at the start and end of the video, but I feel that it has distanced you from the people who can't support you with money as you don't seem to be even reading these comments and taking things on board. As someone who has enjoyed your videos for quite a while now - especially the Sparky series, I hope you continue to enjoy making these videos as much as I used to enjoy watching them, but I can't stick around if the video quality is coming down to this. Cheerio.
@bacontf2
@bacontf2 6 жыл бұрын
@@totoze1956 Interesting, I had a feeling the patrons weren't getting their money's worth. I mean, offering a video or some code a week early is only a one-time benefit for someone interested in getting the videos early. Once they've seen that early video they still have to wait a week until the next one, and then if they decide not to pledge further, they have to wait 2 weeks to see the next video! Not a model that favours the viewer/supporter.
@Smilezlol
@Smilezlol 6 жыл бұрын
First, How in the hell can you say he only does it for the money? These videos probably give next to nothing in terms of ad revenue, which is why he plugs his Patreon and the beginning and end (which is way better than most, nothing in the middle or content locked behind it). Obviously he wants money for the time invested, just like anyone would for doing this kind of high skilled work, which is why he gives his fans an OPTION to pay monthly for just a little bit of bonuses. Do you honestly think his Patreons care if they get their money's worth? They just want to support a content creator that has probably helped them out a ton that they themselves never had to give back to. I myself have learned more from this man than probably a year or two in a university would of taught me, all without paying a single dime, so to say that he is only in it for the money is just plain false. Second, your reasoning for why this format is worse makes no sense, because you argue that him writing it live would display more of his thought process, but that isn't removed, it's simply put at the beginning of his videos now, or sometimes put in a separate planning episode, if the topic is larger. Also, the reason cherno most likely made this change (besides it being easier for him) is because too often you see people so focused on copying the code. Any person whose made programming project tutorials, especially gamedev related, know that most of the people watching just mindlessly copy down the code without ever really making the decisions themselves. How i see this series is: "Here is something you want in your engine, here is my reasoning for implementing this, here is my implementation". Honestly the mental gymnastics you kind of people have to do to think that he only does it for the money is mind boggling.
@bacontf2
@bacontf2 6 жыл бұрын
My main quarrel is not to do with whether he does it for the money or not - that's a whole different can of worms but it's not exactly mental gymnastics, rather it's just my opinion given what I have seen. I don't deny that he is a very good teacher - probably one of the best on KZbin. My issue is with the format of this series. I can see where you're getting confused about my reasoning regarding my dislike for the format; I did not mean it lacked an overall focus and explanation for the feature being added, but instead that the basic should I/shouldn't I thought process for writing a certain line of code one way or another. That is how other coding channels manage it, and they are more intuitive than the format being used here. Don't just take my word for it, look back at the comments section of the video where this format was announced. I'm far from the only one complaining. I'd also argue that this format actually makes it easier for people to just mindlessly copy down code - just pause, copy down, play until you see more code, pause, copy down etc. And copying from github is the same with even less explanation. In contrast, the normal format of live coding provides a constant stream of information and generally leads to things being described in more detail. Yes it takes longer to make, but as evidenced by this format change, the more time put into it, the better quality of video.
@pikmin4000
@pikmin4000 6 жыл бұрын
I, for one, wouldn't want this video to be an hour long, I believe this video series is great as it is because it allows you see the bigger picture faster which is important when talking about architecture decisions.
@thijsjansen2052
@thijsjansen2052 6 жыл бұрын
@@bacontf2 i do actually kind off like this new format, but you have to look different to the teaching process. instead of just hearing what he has to say and writing down what he codes, you should try to watch the video once, make notes, and then try to write the implementation in your own way. You should be capable of writing what he shows here whit your knowledge from the c++ tutorial series
@mxcha
@mxcha 6 жыл бұрын
You have 123,456 subs
@kingsheep1829
@kingsheep1829 6 жыл бұрын
to the project but not the app I really don't know where did I go wrong (EDIT) LOL I FOUND THE PROBLEM
@lct113
@lct113 3 жыл бұрын
what was the problem?
@humm535
@humm535 6 жыл бұрын
Vi is better than Emacs!
@Light-wz6tq
@Light-wz6tq 6 жыл бұрын
5th
@emanuelkokovics
@emanuelkokovics 2 жыл бұрын
Does anyone have the errors: Error C2079 'ss' uses undefined class 'std::basic_stringstream' Sandbox Error C2297 '
@urzaschannel3335
@urzaschannel3335 Жыл бұрын
Check operator
TIMESTEPS and DELTA TIME | Game Engine series
28:06
The Cherno
Рет қаралды 48 М.
Serialization in Hazel - My Game Engine
28:22
The Cherno
Рет қаралды 34 М.
It’s all not real
00:15
V.A. show / Магика
Рет қаралды 20 МЛН
UFC 310 : Рахмонов VS Мачадо Гэрри
05:00
Setanta Sports UFC
Рет қаралды 1,2 МЛН
Super Fast Ray Casting in Tiled Worlds using DDA
30:03
javidx9
Рет қаралды 192 М.
Event System | Game Engine series
35:40
The Cherno
Рет қаралды 167 М.
CAMERAS and How They Work | Game Engine series
38:54
The Cherno
Рет қаралды 41 М.
C++ vs Rust: which is faster?
21:15
fasterthanlime
Рет қаралды 410 М.
What does a Game Engine actually do?
16:45
Ellie Rasmussen
Рет қаралды 176 М.
Building a fast ECS on top of a slow ECS
8:03
UnitOfTime
Рет қаралды 34 М.
2 Years Of Learning C | Prime Reacts
22:24
ThePrimeTime
Рет қаралды 326 М.
Is C BETTER than C++ for beginners? // Code Review
31:16
The Cherno
Рет қаралды 88 М.
It’s all not real
00:15
V.A. show / Магика
Рет қаралды 20 МЛН