Handmade Hero»Episode Guide
Finishing the Win32 Prototyping Layer
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next marker
t / T Toggle theatre / SUPERtheatre mode
V Revert filter to original state Y Select link (requires manual Ctrl-c)

Menu toggling

q Quotes r References f Filter y Link c Credits

In-Menu Movement

a
w
s
d
h j k l


Quotes and References Menus

Enter Jump to timecode

Quotes, References and Credits Menus

o Open URL (in new tab)

Filter Menu

x, Space Toggle category and focus next
X, ShiftSpace Toggle category and focus previous
v Invert topics / media as per focus

Filter and Link Menus

z Toggle filter / linking mode

Credits Menu

Enter Open URL (in new tab)
1:47Plans for today
1:47Plans for today
1:47Plans for today
4:20Getting the actual monitor refresh rate with GetDeviceCaps()
4:20Getting the actual monitor refresh rate with GetDeviceCaps()
4:20Getting the actual monitor refresh rate with GetDeviceCaps()
10:27Testing monitor refresh rate getting
10:27Testing monitor refresh rate getting
10:27Testing monitor refresh rate getting
11:17Preparing for future multi-threading
11:17Preparing for future multi-threading
11:17Preparing for future multi-threading
17:02Adding mouse debug functionality to our game input
17:02Adding mouse debug functionality to our game input
17:02Adding mouse debug functionality to our game input
23:38Getting the state of the mouse buttons
23:38Getting the state of the mouse buttons
23:38Getting the state of the mouse buttons
28:27Testing mouse button functionality
28:27Testing mouse button functionality
28:27Testing mouse button functionality
32:07Making improvements to replay code
32:07Making improvements to replay code
32:07Making improvements to replay code
33:20It's time to get piggy!
33:20It's time to get piggy!
33:20It's time to get piggy!
35:25Allocating memory for our replay buffers
35:25Allocating memory for our replay buffers
35:25Allocating memory for our replay buffers
38:01Changing Win32BeginRecordingInput to write to memory
38:01Changing Win32BeginRecordingInput to write to memory
38:01Changing Win32BeginRecordingInput to write to memory
42:19Swapping out WriteFile() for CopyMemory()
42:19Swapping out WriteFile() for CopyMemory()
42:19Swapping out WriteFile() for CopyMemory()
46:02Testing our new recording technique to much disappointment
46:02Testing our new recording technique to much disappointment
46:02Testing our new recording technique to much disappointment
49:00Poor man's profiling
49:00Poor man's profiling
49:00Poor man's profiling
52:28Stepping through to find the real culprit
52:28Stepping through to find the real culprit
52:28Stepping through to find the real culprit
53:46Removing SetFilePointerEx() for a massive speedup
53:46Removing SetFilePointerEx() for a massive speedup
53:46Removing SetFilePointerEx() for a massive speedup
55:31What we were going to do with memory mapped files
55:31What we were going to do with memory mapped files
55:31What we were going to do with memory mapped files
57:26Let's try it anyway
57:26Let's try it anyway
57:26Let's try it anyway
1:03:13Pulling out input file processing into WinMain()
1:03:13Pulling out input file processing into WinMain()
1:03:13Pulling out input file processing into WinMain()
1:07:25Step-through and removal of an assertion
1:07:25Step-through and removal of an assertion
1:07:25Step-through and removal of an assertion
1:08:55Debugging the memory mapped file failure
1:08:55Debugging the memory mapped file failure
1:08:55Debugging the memory mapped file failure
1:12:24A peculiar fix
1:12:24A peculiar fix
1:12:24A peculiar fix
1:13:18Review of the recording code
1:13:18Review of the recording code
1:13:18Review of the recording code
1:14:32Splitting the file output into two streams for more speedup
1:14:32Splitting the file output into two streams for more speedup
1:14:32Splitting the file output into two streams for more speedup
1:18:20Testing with some notion of success
1:18:20Testing with some notion of success
1:18:20Testing with some notion of success
1:21:14What's the memory bandwidth of Casey's machine?
1:21:14What's the memory bandwidth of Casey's machine?
1:21:14What's the memory bandwidth of Casey's machine?
1:25:16Looking at multiple sequential records
1:25:16Looking at multiple sequential records
1:25:16Looking at multiple sequential records
1:28:16Removing/disabling some debug code for now
1:28:16Removing/disabling some debug code for now
1:28:16Removing/disabling some debug code for now
1:30:29Final Thoughts
1:30:29Final Thoughts
1:30:29Final Thoughts
1:31:47Q&A
🗩
1:31:47Q&A
🗩
1:31:47Q&A
🗩
1:32:47Maybe first copy is causing alloc and zero on fault, maybe a second copy would be fast
1:32:47Maybe first copy is causing alloc and zero on fault, maybe a second copy would be fast
1:32:47Maybe first copy is causing alloc and zero on fault, maybe a second copy would be fast
1:35:28An interesting part of this project is that you're implementing all the compenents yourself that you'd take as given in an existing game engine. That said, do you intend for these components to be reusable in future projects?
1:35:28An interesting part of this project is that you're implementing all the compenents yourself that you'd take as given in an existing game engine. That said, do you intend for these components to be reusable in future projects?
1:35:28An interesting part of this project is that you're implementing all the compenents yourself that you'd take as given in an existing game engine. That said, do you intend for these components to be reusable in future projects?
1:36:32Why the pig hat?
1:36:32Why the pig hat?
1:36:32Why the pig hat?
1:36:44Why don't you use the Visual Studio profiler and anaylze performance?
1:36:44Why don't you use the Visual Studio profiler and anaylze performance?
1:36:44Why don't you use the Visual Studio profiler and anaylze performance?
1:37:06Remark about 300ms being 10 frames, not 3 frames
1:37:06Remark about 300ms being 10 frames, not 3 frames
1:37:06Remark about 300ms being 10 frames, not 3 frames
1:37:39Does it lag if you save to a smaller file size?
1:37:39Does it lag if you save to a smaller file size?
1:37:39Does it lag if you save to a smaller file size?
1:38:59Isn't the CPU Memory bandwidth only valid for on-die memory?
1:38:59Isn't the CPU Memory bandwidth only valid for on-die memory?
1:38:59Isn't the CPU Memory bandwidth only valid for on-die memory?
1:40:23Is the intent of saving the complete game state to support something like a rewind function that Braid allows?
1:40:23Is the intent of saving the complete game state to support something like a rewind function that Braid allows?
1:40:23Is the intent of saving the complete game state to support something like a rewind function that Braid allows?
1:41:07Will you do a string pool?
1:41:07Will you do a string pool?
1:41:07Will you do a string pool?
1:41:26When you say the platform non-specific layer, does that mean game code and renderer and logging sorts of things, or is there a sharper distinction between some of those?
1:41:26When you say the platform non-specific layer, does that mean game code and renderer and logging sorts of things, or is there a sharper distinction between some of those?
1:41:26When you say the platform non-specific layer, does that mean game code and renderer and logging sorts of things, or is there a sharper distinction between some of those?
1:42:15A quick test on my PC gave me around 3 GB/s...
1:42:15A quick test on my PC gave me around 3 GB/s...
1:42:15A quick test on my PC gave me around 3 GB/s...
1:43:17Is it time to split the source into more files?
1:43:17Is it time to split the source into more files?
1:43:17Is it time to split the source into more files?
1:43:40Would a non-caching write be faster for the memory copy? You know the SSE write instructions that bypass the cache?
1:43:40Would a non-caching write be faster for the memory copy? You know the SSE write instructions that bypass the cache?
1:43:40Would a non-caching write be faster for the memory copy? You know the SSE write instructions that bypass the cache?
1:45:14When are the four .hmi files created?
1:45:14When are the four .hmi files created?
1:45:14When are the four .hmi files created?
1:45:50...An AMD A8-6400k (Follow-up to 3GB/s memory bandwidth mention)
1:45:50...An AMD A8-6400k (Follow-up to 3GB/s memory bandwidth mention)
1:45:50...An AMD A8-6400k (Follow-up to 3GB/s memory bandwidth mention)
1:47:37Are you going to do a moblie port? (Android for example) Would the game loop of a mobile game be any different?
1:47:37Are you going to do a moblie port? (Android for example) Would the game loop of a mobile game be any different?
1:47:37Are you going to do a moblie port? (Android for example) Would the game loop of a mobile game be any different?
1:48:51How about disk write speed and access time?
1:48:51How about disk write speed and access time?
1:48:51How about disk write speed and access time?
1:49:30Why is the CPU even involved in a memory copy like this?
1:49:30Why is the CPU even involved in a memory copy like this?
1:49:30Why is the CPU even involved in a memory copy like this?
1:51:01What was the reason for choosing GetCursorPos() instead of just responding to the WM_MOUSEMOVE message? Is the message pump not fast enough?
1:51:01What was the reason for choosing GetCursorPos() instead of just responding to the WM_MOUSEMOVE message? Is the message pump not fast enough?
1:51:01What was the reason for choosing GetCursorPos() instead of just responding to the WM_MOUSEMOVE message? Is the message pump not fast enough?
1:51:25Have you ever programmed in Java? For how long?
1:51:25Have you ever programmed in Java? For how long?
1:51:25Have you ever programmed in Java? For how long?
1:52:27(continuation of Why is the CPU even involved question) Wouldn't the copy speed mostly depend on how quickly memory from one part of the memory gets to the CPU and back? In fact, in my mind it seems like large copies are something that could skip the CPU entirely unless it has something to do with paging.
1:52:27(continuation of Why is the CPU even involved question) Wouldn't the copy speed mostly depend on how quickly memory from one part of the memory gets to the CPU and back? In fact, in my mind it seems like large copies are something that could skip the CPU entirely unless it has something to do with paging.
1:52:27(continuation of Why is the CPU even involved question) Wouldn't the copy speed mostly depend on how quickly memory from one part of the memory gets to the CPU and back? In fact, in my mind it seems like large copies are something that could skip the CPU entirely unless it has something to do with paging.
1:54:32Is it worth writing games in Java?
1:54:32Is it worth writing games in Java?
1:54:32Is it worth writing games in Java?
1:57:03Are you in dual-channel write mode on your system?
1:57:03Are you in dual-channel write mode on your system?
1:57:03Are you in dual-channel write mode on your system?
1:57:13Does the Megabytes have any effect on the performance of the memory?
1:57:13Does the Megabytes have any effect on the performance of the memory?
1:57:13Does the Megabytes have any effect on the performance of the memory?
1:57:38Tom Forsyth comment about modern DMA units not being available to users
1:57:38Tom Forsyth comment about modern DMA units not being available to users
1:57:38Tom Forsyth comment about modern DMA units not being available to users
1:58:39What do you think of Test Driven Development?
1:58:39What do you think of Test Driven Development?
1:58:39What do you think of Test Driven Development?
1:59:27Can you explain the bit shifting?
1:59:27Can you explain the bit shifting?
1:59:27Can you explain the bit shifting?
2:04:24You can create a performance heavy application in Java without the garbage collection if you configure it to run as real time instead of virtually
2:04:24You can create a performance heavy application in Java without the garbage collection if you configure it to run as real time instead of virtually
2:04:24You can create a performance heavy application in Java without the garbage collection if you configure it to run as real time instead of virtually
2:06:33Do you consider Visual Basic a programming language?
2:06:33Do you consider Visual Basic a programming language?
2:06:33Do you consider Visual Basic a programming language?
2:07:16On the memory CPU speed, I see the answer is that the hardware doesn't do this. I guess I'm just envisioning a system where the gigabyte of memory never visits the CPU. I am envisioning a system where the memory can receive an instruction that says locally move a gigabyte over to this location
2:07:16On the memory CPU speed, I see the answer is that the hardware doesn't do this. I guess I'm just envisioning a system where the gigabyte of memory never visits the CPU. I am envisioning a system where the memory can receive an instruction that says locally move a gigabyte over to this location
2:07:16On the memory CPU speed, I see the answer is that the hardware doesn't do this. I guess I'm just envisioning a system where the gigabyte of memory never visits the CPU. I am envisioning a system where the memory can receive an instruction that says locally move a gigabyte over to this location
2:08:51Tom Forsyth comment on using LARGE_INTEGER instead of the bit shifting
2:08:51Tom Forsyth comment on using LARGE_INTEGER instead of the bit shifting
2:08:51Tom Forsyth comment on using LARGE_INTEGER instead of the bit shifting
2:11:00In your mind, what would be a good way to demonstrate to a potential employer proficiency in the type of engine programming you are teaching?
2:11:00In your mind, what would be a good way to demonstrate to a potential employer proficiency in the type of engine programming you are teaching?
2:11:00In your mind, what would be a good way to demonstrate to a potential employer proficiency in the type of engine programming you are teaching?
2:12:38Thanks (And a comment from Casey on the success of the stream)
2:12:38Thanks (And a comment from Casey on the success of the stream)
2:12:38Thanks (And a comment from Casey on the success of the stream)
2:13:29What defines the boundary between a high-level language and a low-level language?
2:13:29What defines the boundary between a high-level language and a low-level language?
2:13:29What defines the boundary between a high-level language and a low-level language?
2:16:40When will you start actual game logic?
2:16:40When will you start actual game logic?
2:16:40When will you start actual game logic?
2:16:53Have you heard of the Rust language?
2:16:53Have you heard of the Rust language?
2:16:53Have you heard of the Rust language?
2:17:31Have you ever dealt with programmer burnout? Or how do you deal with the fact there are days almost no code gets written and on some days massive amounts of code gets written?
2:17:31Have you ever dealt with programmer burnout? Or how do you deal with the fact there are days almost no code gets written and on some days massive amounts of code gets written?
2:17:31Have you ever dealt with programmer burnout? Or how do you deal with the fact there are days almost no code gets written and on some days massive amounts of code gets written?
2:20:28Any source or book recommendation for understanding the concepts you used better?
2:20:28Any source or book recommendation for understanding the concepts you used better?
2:20:28Any source or book recommendation for understanding the concepts you used better?
2:21:09Have you seen Game Programming Patterns by Robert Nystrom? Are you going to use any design patterns?
2:21:09Have you seen Game Programming Patterns by Robert Nystrom? Are you going to use any design patterns?
2:21:09Have you seen Game Programming Patterns by Robert Nystrom? Are you going to use any design patterns?
2:22:31Do you find it useful to learn many different languages to gain perspective?
2:22:31Do you find it useful to learn many different languages to gain perspective?
2:22:31Do you find it useful to learn many different languages to gain perspective?
2:25:11What do you think about using VCS for one man projects?
2:25:11What do you think about using VCS for one man projects?
2:25:11What do you think about using VCS for one man projects?
2:25:53What's your mindset when looking at a problem that's new? How you approach a new coding problem that you have no pre-defined idea how to solve?
2:25:53What's your mindset when looking at a problem that's new? How you approach a new coding problem that you have no pre-defined idea how to solve?
2:25:53What's your mindset when looking at a problem that's new? How you approach a new coding problem that you have no pre-defined idea how to solve?
2:26:33Will you write a book after Handmade Hero is done?
2:26:33Will you write a book after Handmade Hero is done?
2:26:33Will you write a book after Handmade Hero is done?
2:26:46How long have you been in the industry?
2:26:46How long have you been in the industry?
2:26:46How long have you been in the industry?
2:26:59I've always been a hobbyist, the more I've learned over the last year, the more I love programming. In your opinion is going back for a four-year CS degree a waste if I want to make things that don't suck?
2:26:59I've always been a hobbyist, the more I've learned over the last year, the more I love programming. In your opinion is going back for a four-year CS degree a waste if I want to make things that don't suck?
2:26:59I've always been a hobbyist, the more I've learned over the last year, the more I love programming. In your opinion is going back for a four-year CS degree a waste if I want to make things that don't suck?
2:27:22Perhaps the problem with high-level languages is that they are less general, but more domain specific in the first place
2:27:22Perhaps the problem with high-level languages is that they are less general, but more domain specific in the first place
2:27:22Perhaps the problem with high-level languages is that they are less general, but more domain specific in the first place
2:28:05How does your source code control differ from something like Git or SVN?
2:28:05How does your source code control differ from something like Git or SVN?
2:28:05How does your source code control differ from something like Git or SVN?