Here’s a great discussion of data-oriented design from some gamer programmers: Data-Oriented Design (Or Why You Might Be Shooting Yourself in The Foot With OOP)
I believe OOP is the very best way to manage complexity, but isn’t the end-all be-all. It must build on structured programming techniques. That’s not a given.
Further, memory organization may make a big difference as well, depending on the application. Even with modern processors and gigabytes of RAM. I recently encountered an application that needed its memory footprint to be reworked. It brought the very-powerful machine on which it ran to its knees by using memory very inefficiently.
Though I don’t have much desire to build games, I appreciate the game-development community. They build incredibly ambitious pieces of software: ambitious in both complexity and performance. That causes them to encounter many issues one might not consider, and think hard about everything they do.
Update: Here’s a very detailed article on memory usage from the bare metal up: What Every Programmer Should Know About Memory, by Ulrich Drepper. Hat-tip Dan DeMaggio. If your performance concerns reach all the way to RAM access and CPU caches, this is one to study. It’s a whole course, and not a light read. One take-away: memory usage patterns can have very non-linear effects on performance.