When I approach a new code base I use a technique I call "tunneling". I start at the highest level, then I jump to the lowest level, and repeat until my knowledge meets in the middle, like two tunnels being dug in opposite directions and eventually meeting.
I start by using the software like an end-user would to familiarize myself with the basic concepts. This might seem obvious, but a lot of people jump straight into the code base, sometimes without a clear idea of what the software actually does. While I do this, I think of how I would implement each feature.
Then I open a few source files of a key system to try to get a feel for what the code looks like. What are the most common data structures? How are objects created and destroyed? What design patterns and idioms do they use? At this point it's crucial that you don't overanalyze any one particular system, especially if the software is mature and heavily optimized, because you could spend days figuring out one system without getting a feel of how the major components of the engine interact.
Going back to the high level, I would run the engine again and step over the game loop, making sure not to stop and think too hard about any given chunk of code. The point is to get a feel for what general operations happen in what order, not to become an expert on every single line of code in the engine. You should be able to look at an engine's update loop and say "There's a lot of minor details in here, but the basic flow is that they run the garbage collector, update all objects, update the physics simulation, and draw all objects".
I developed this technique after struggling with Unreal 3's labyrinthine code base early in my career. I made the mistake of tunnel-visioning the rendering code without trying to use the engine first. I think I spent an entire day trying to figure out how their post-processing system worked, when I never actually bothered to pull up the editor and play with the post-process chain first. It's easy to get caught up in the details and spin your wheels without actually learning anything, especially if the engine uses a lot of macros and uncommon idioms like UE3 does.