Handmade Hero»Episode Guide
Capturing Source Information for Memory Allocations
?
?

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)
0:01Recap our new world apron and the tiled nature of our game, and set the stage for the day
🗩
0:01Recap our new world apron and the tiled nature of our game, and set the stage for the day
🗩
0:01Recap our new world apron and the tiled nature of our game, and set the stage for the day
🗩
3:23Demo our world apron, and set up to tackle our world solidity issues: lighting and ground cover
🏃
3:23Demo our world apron, and set up to tackle our world solidity issues: lighting and ground cover
🏃
3:23Demo our world apron, and set up to tackle our world solidity issues: lighting and ground cover
🏃
8:11Transient vs persistent state in the context of lighting entities and placing ground cover
🏃
8:11Transient vs persistent state in the context of lighting entities and placing ground cover
🏃
8:11Transient vs persistent state in the context of lighting entities and placing ground cover
🏃
15:35Plant trees in the apron, introducing AddTreeTags() for GenerateApron() to call
15:35Plant trees in the apron, introducing AddTreeTags() for GenerateApron() to call
15:35Plant trees in the apron, introducing AddTreeTags() for GenerateApron() to call
21:18See no trees in the apron
🏃
21:18See no trees in the apron
🏃
21:18See no trees in the apron
🏃
21:31Systematise entity generation for both traversable and non-traversable locations, introducing GenEntityAtP(), GenEntityAtTraversable() and AddInanimate()
21:31Systematise entity generation for both traversable and non-traversable locations, introducing GenEntityAtP(), GenEntityAtTraversable() and AddInanimate()
21:31Systematise entity generation for both traversable and non-traversable locations, introducing GenEntityAtP(), GenEntityAtTraversable() and AddInanimate()
34:11See our forest of trees in the apron
🏃
34:11See our forest of trees in the apron
🏃
34:11See our forest of trees in the apron
🏃
34:23Change GenerateApron() to plant a tree on one random tile out of three
34:23Change GenerateApron() to plant a tree on one random tile out of three
34:23Change GenerateApron() to plant a tree on one random tile out of three
34:48See our randomly distributed forest
🏃
34:48See our randomly distributed forest
🏃
34:48See our randomly distributed forest
🏃
35:04Prevent AddTreeTags() from picking DarkEnergy, Fall and Damaged trees
35:04Prevent AddTreeTags() from picking DarkEnergy, Fall and Damaged trees
35:04Prevent AddTreeTags() from picking DarkEnergy, Fall and Damaged trees
36:01Check out our less variable forest
🏃
36:01Check out our less variable forest
🏃
36:01Check out our less variable forest
🏃
36:16Consider preventing GenerateApron() from placing trees right next to rooms
🗩
36:16Consider preventing GenerateApron() from placing trees right next to rooms
🗩
36:16Consider preventing GenerateApron() from placing trees right next to rooms
🗩
37:34Note our need to light the sprites, and to prevent trees from penetrating walls by placing them carefully
🏃
37:34Note our need to light the sprites, and to prevent trees from penetrating walls by placing them carefully
🏃
37:34Note our need to light the sprites, and to prevent trees from penetrating walls by placing them carefully
🏃
38:54Make GenerateRoom() use our new AddTreeTags()
38:54Make GenerateRoom() use our new AddTreeTags()
38:54Make GenerateRoom() use our new AddTreeTags()
39:36Find that we're still generating all types of trees in our (non-apron) rooms
🏃
39:36Find that we're still generating all types of trees in our (non-apron) rooms
🏃
39:36Find that we're still generating all types of trees in our (non-apron) rooms
🏃
40:11Fix GenerateRoom() to pass the correct argument to AddTreeTags()
40:11Fix GenerateRoom() to pass the correct argument to AddTreeTags()
40:11Fix GenerateRoom() to pass the correct argument to AddTreeTags()
40:39Check out our winter trees, and see one tree in each room placed underground
🏃
40:39Check out our winter trees, and see one tree in each room placed underground
🏃
40:39Check out our winter trees, and see one tree in each room placed underground
🏃
43:16Try preventing GenerateApron() from placing trees
43:16Try preventing GenerateApron() from placing trees
43:16Try preventing GenerateApron() from placing trees
44:00See our sunken trees
🏃
44:00See our sunken trees
🏃
44:00See our sunken trees
🏃
44:07Try preventing GenerateRoom() from placing trees
44:07Try preventing GenerateRoom() from placing trees
44:07Try preventing GenerateRoom() from placing trees
44:48Still see our sunken trees
🏃
44:48Still see our sunken trees
🏃
44:48Still see our sunken trees
🏃
45:07Try preventing GenerateRoom() from placing lamps
45:07Try preventing GenerateRoom() from placing lamps
45:07Try preventing GenerateRoom() from placing lamps
45:24See no sunken trees, but still an errant entity in one room
🏃
45:24See no sunken trees, but still an errant entity in one room
🏃
45:24See no sunken trees, but still an errant entity in one room
🏃
45:42Try preventing GenerateRoom() from adding tags to pending entities
45:42Try preventing GenerateRoom() from adding tags to pending entities
45:42Try preventing GenerateRoom() from adding tags to pending entities
46:05Find that our sunken entity has disappeared
🏃
46:05Find that our sunken entity has disappeared
🏃
46:05Find that our sunken entity has disappeared
🏃
46:42Fix GenEntityAtTraversable() to only call Creator() once, and let everyone place their entities again
46:42Fix GenEntityAtTraversable() to only call Creator() once, and let everyone place their entities again
46:42Fix GenEntityAtTraversable() to only call Creator() once, and let everyone place their entities again
47:24Find that we have fixed our errant entity placement
🏃
47:24Find that we have fixed our errant entity placement
🏃
47:24Find that we have fixed our errant entity placement
🏃
47:43Caching ground cover in addition to lighting
🗩
47:43Caching ground cover in addition to lighting
🗩
47:43Caching ground cover in addition to lighting
🗩
49:56Begin to cache ground cover, augmenting the entity struct with a newly introduced ground_cover
49:56Begin to cache ground cover, augmenting the entity struct with a newly introduced ground_cover
49:56Begin to cache ground cover, augmenting the entity struct with a newly introduced ground_cover
54:32Gauge the performance of copying our larger entity
🏃
54:32Gauge the performance of copying our larger entity
🏃
54:32Gauge the performance of copying our larger entity
🏃
57:19Consider adding finer grained memory usage information to the debug system
🗩
57:19Consider adding finer grained memory usage information to the debug system
🗩
57:19Consider adding finer grained memory usage information to the debug system
🗩
59:58Illustrate where memory statistics may reside
🏃
59:58Illustrate where memory statistics may reside
🏃
59:58Illustrate where memory statistics may reside
🏃
1:01:29Reacquaint ourselves with the debug system
📖
1:01:29Reacquaint ourselves with the debug system
📖
1:01:29Reacquaint ourselves with the debug system
📖
1:04:02Add a debug UI hud for the memory data block
1:04:02Add a debug UI hud for the memory data block
1:04:02Add a debug UI hud for the memory data block
1:04:17Check out our sketched out memory viewer
🏃
1:04:17Check out our sketched out memory viewer
🏃
1:04:17Check out our sketched out memory viewer
🏃
1:04:41Add the AssetArena to our memory data block
1:04:41Add the AssetArena to our memory data block
1:04:41Add the AssetArena to our memory data block
1:07:49Consider adding "total space" to our memory viewer
🏃
1:07:49Consider adding "total space" to our memory viewer
🏃
1:07:49Consider adding "total space" to our memory viewer
🏃
1:08:14Toggle on DrawArenaOccupancy() and reacquaint ourselves with it
1:08:14Toggle on DrawArenaOccupancy() and reacquaint ourselves with it
1:08:14Toggle on DrawArenaOccupancy() and reacquaint ourselves with it
1:13:11Criticise the overly generic nature of our debug system
🗩
1:13:11Criticise the overly generic nature of our debug system
🗩
1:13:11Criticise the overly generic nature of our debug system
🗩
1:14:38Add to the debug system purpose-built support for memory tracking, including HANDMADE_INTERNAL versions of our Push*() functions
1:14:38Add to the debug system purpose-built support for memory tracking, including HANDMADE_INTERNAL versions of our Push*() functions
1:14:38Add to the debug system purpose-built support for memory tracking, including HANDMADE_INTERNAL versions of our Push*() functions
1:36:16Find that we've broken nothing
🏃
1:36:16Find that we've broken nothing
🏃
1:36:16Find that we've broken nothing
🏃
1:36:22Toggle off HANDMADE_INTERNAL and fix compile errors
1:36:22Toggle off HANDMADE_INTERNAL and fix compile errors
1:36:22Toggle off HANDMADE_INTERNAL and fix compile errors
1:37:48Crash 4coder upon writing "#endif HANDMADE_INTERNAL" in handmade_import.cpp
🗹
1:37:48Crash 4coder upon writing "#endif HANDMADE_INTERNAL" in handmade_import.cpp
🗹
1:37:48Crash 4coder upon writing "#endif HANDMADE_INTERNAL" in handmade_import.cpp
🗹
1:38:09Continue to fix compile errors
1:38:09Continue to fix compile errors
1:38:09Continue to fix compile errors
1:39:20Crash on the call to GetFontInfo() in InitializeUI()
🏃
1:39:20Crash on the call to GetFontInfo() in InitializeUI()
🏃
1:39:20Crash on the call to GetFontInfo() in InitializeUI()
🏃
1:41:00Investigate the assertion hit in GetFontInfo()
📖
1:41:00Investigate the assertion hit in GetFontInfo()
📖
1:41:00Investigate the assertion hit in GetFontInfo()
📖
1:49:41Step through AllocateGameAssets() in HANDMADE_INTERNAL
🏃
1:49:41Step through AllocateGameAssets() in HANDMADE_INTERNAL
🏃
1:49:41Step through AllocateGameAssets() in HANDMADE_INTERNAL
🏃
1:53:12Step through AllocateGameAssets() in not HANDMADE_INTERNAL, to see that we do not load all the asset files
🏃
1:53:12Step through AllocateGameAssets() in not HANDMADE_INTERNAL, to see that we do not load all the asset files
🏃
1:53:12Step through AllocateGameAssets() in not HANDMADE_INTERNAL, to see that we do not load all the asset files
🏃
1:57:10Fix AllocateGameAssets() to loop over all our allocated asset files
🦉
🖮
1:57:10Fix AllocateGameAssets() to loop over all our allocated asset files
🦉
🖮
1:57:10Fix AllocateGameAssets() to loop over all our allocated asset files
🦉
🖮
1:58:09Find that the non-internal build now works
🏃
🦉
1:58:09Find that the non-internal build now works
🏃
🦉
1:58:09Find that the non-internal build now works
🏃
🦉
1:59:37Q&A
🗩
1:59:37Q&A
🗩
1:59:37Q&A
🗩
2:01:02Brian Q: Why do you delete the pdb's before each build? Have you found the compiler having issues or leaving junk if you just let the compiler deal with it?
🗪
2:01:02Brian Q: Why do you delete the pdb's before each build? Have you found the compiler having issues or leaving junk if you just let the compiler deal with it?
🗪
2:01:02Brian Q: Why do you delete the pdb's before each build? Have you found the compiler having issues or leaving junk if you just let the compiler deal with it?
🗪
2:03:53macielda Q: In that system, do you have to transform all Push*() functions into macros?
🗪
2:03:53macielda Q: In that system, do you have to transform all Push*() functions into macros?
🗪
2:03:53macielda Q: In that system, do you have to transform all Push*() functions into macros?
🗪
2:04:10lucid_frost Q: What are some better alternatives to things like #ifdef's that a language could provide?
🗪
2:04:10lucid_frost Q: What are some better alternatives to things like #ifdef's that a language could provide?
🗪
2:04:10lucid_frost Q: What are some better alternatives to things like #ifdef's that a language could provide?
🗪
2:04:34macielda Q: So all functions that allocate any memory need to become macros if you want to keep track of where the memory was allocated?
🗪
2:04:34macielda Q: So all functions that allocate any memory need to become macros if you want to keep track of where the memory was allocated?
🗪
2:04:34macielda Q: So all functions that allocate any memory need to become macros if you want to keep track of where the memory was allocated?
🗪
2:04:44ivereadthesequel Q: How much more stable has remedybg gotten since you started using it on stream? Were there any particularly big issues that caused you trouble that have been fixed in that time?
🗪
2:04:44ivereadthesequel Q: How much more stable has remedybg gotten since you started using it on stream? Were there any particularly big issues that caused you trouble that have been fixed in that time?
🗪
2:04:44ivereadthesequel Q: How much more stable has remedybg gotten since you started using it on stream? Were there any particularly big issues that caused you trouble that have been fixed in that time?
🗪
2:05:22victorn Q: Do you think using tests would have made it easier to find the code paths that were broken with this refactor?
🗪
2:05:22victorn Q: Do you think using tests would have made it easier to find the code paths that were broken with this refactor?
🗪
2:05:22victorn Q: Do you think using tests would have made it easier to find the code paths that were broken with this refactor?
🗪
2:06:36macielda Q: Is that why you put all Push*() functions in the same file?
🗪
2:06:36macielda Q: Is that why you put all Push*() functions in the same file?
🗪
2:06:36macielda Q: Is that why you put all Push*() functions in the same file?
🗪
2:07:06Brian Q: If you didn't do code-reloading, like say for release, would you still have the platform exe, and a separate dll for the game code?
🗪
2:07:06Brian Q: If you didn't do code-reloading, like say for release, would you still have the platform exe, and a separate dll for the game code?
🗪
2:07:06Brian Q: If you didn't do code-reloading, like say for release, would you still have the platform exe, and a separate dll for the game code?
🗪
2:08:55uplinkcoder Q: The caller location is a many-to-one mapping which is why languages generally don't do it. You could, but it means complications for the runtime / code-generation
🗪
2:08:55uplinkcoder Q: The caller location is a many-to-one mapping which is why languages generally don't do it. You could, but it means complications for the runtime / code-generation
🗪
2:08:55uplinkcoder Q: The caller location is a many-to-one mapping which is why languages generally don't do it. You could, but it means complications for the runtime / code-generation
🗪
2:10:43We're done with questions
🗩
2:10:43We're done with questions
🗩
2:10:43We're done with questions
🗩