Let's continue our discussion of Game Technology by discussing a bit about the software side of game technology. At the deepest level, computers work on ones and zeros or on and off. Early computer programming involves setting physical switches to make the computer do things. Then we expedited this by using punched cards that we fed into the computers as previously discussed. But this was slow and painful. Machine language or machine code is a way of representing the native binary language of the computer as a set of atomic instructions that are executed by the CPU. At this level, most of the instructions are just moving bits of information around or jumping from one set of instructions to another. Programming in machine code is sometimes called writing directly to the metal. While back in the early PC days, people did write machine code as shown here. But because of the tediousness of doing this, it is rarely done anymore, except for situations that require the most extreme optimization. A much more readable rendition of machine language, called Assembly Language, uses mnemonic codes to refer to machine code instructions rather than using the instructions numerical values directly. But this still is not very human-readable, this is generally as close to the metal that any computer scientist ever gets. Fortunately, most of us don't need to dive this deep. High-level languages are abstracted from the details of the computing hardware and made to be more human readable and writeable. The language is then compiled or interpreted into assembly or directly to machine language. There are literally hundreds of high-level computer languages in existence. Some high-level languages are more efficient than others, that is, they compile down to more efficient machine code. Some are easier to read and write for humans, and some languages are great at solving certain types of problems, like accounting tasks, processing text data or creating games. The C-variant of languages have been and continue to be what most game developer use for commercial game projects. These languages are used to create not only games, but also game engines. However, sometimes an easier to use programming language, sometimes called a scripting language, is used on top of a game engine to actually create the game logic. Using a higher-level language makes it easier for non-programmers to program. Some scripting languages are visual in nature, meaning that rather than type out code, you program by creating visual diagrams made up of nodes and connections that usually represent the flow of game logic and data in the game. Blueprints is the visual scripting language in Unreal, Unity has Bolt, amongst other visual scripting languages. Today, our games are very sophisticated, it would be nearly impossible to write everything from scratch for each game. Therefore, we build on top of software systems developed by others. Most notably the operating system which controls the computer hardware, as I have mentioned, the operating system and hardware together, we often refer to as the Platform. Above the operating system is often middleware, which usually provides our core game systems, such as graphics rendering, physics, et cetera. The game logic leverages and speaks to these systems through what is known as the application programming interface or API. A lot of game development has become learning the API, to interface with the middleware and the operating system. Of course, the middleware is often bundled together in what we refer to as the game engine. In this class, the game engine that we have focused on is Unity. Unity and Unreal are the two most popular game engines used in the industry today. But there are many others, including the CryEngine, Lumberyard, Godot, and many others. Most engines come with additional sets of tools called editors. The editors help make creating games easier and more approachable. Artists and designers can get more involved with the process, which in turn makes better games. Take a few minutes to explore other game engines on the Internet. Start by Googling list of game engines to find the Wikipedia page of that name. This page contains a table of over a 150 game engines. The engines I list on this slide are ones to take particular note of, pause the video now to do this. Within the operating system, there is a special software component whose job is to interface with a variety of different types of graphics processing hardware. Then through an API, the game engine or game logic directly can then take advantage of all the hardware has to offer without having to deal with the complexity of each piece of hardware. Microsoft has DirectX for this purpose, Apple has what they call Metal. An OpenGL is a cross-platform API for graphics. Game engines such as Unity often will work with DirectX, Metal, and OpenGL, depending on the target platform you're deploying your game to. At times you have the option to pick the graphics engine, generally, you'll use DirectX on Microsoft hardware, Metal on Apple hardware, and OpenGL when the other two are not available. The primary target game platforms we focus on across this course include PC games on Windows, Mac, and to some extent Linux operating systems, web games via the WebGL technology, and mobile gaming such as on smartphones and tablets running iOS and Android operating systems. Of course, home console and handhelds are also important gaming platforms. While we reference them in this course, as I mentioned, there's a much higher bar of entry to acquire the hardware and licenses to actually develop games for those platforms and distribute them. So they will not be our primary focus, however, the knowledge and skills we are learning can definitely apply towards developing games for almost any modern or emerging game platform.