Handmade Hero»Episode Guide
Preliminary Asset Structuring
?
?

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)
2:37Recap and set the stage
2:37Recap and set the stage
2:37Recap and set the stage
5:19Blackboard: "One in, One out"
5:19Blackboard: "One in, One out"
5:19Blackboard: "One in, One out"
7:46Blackboard: Only load once!
7:46Blackboard: Only load once!
7:46Blackboard: Only load once!
9:16Outline our tasks for the day
9:16Outline our tasks for the day
9:16Outline our tasks for the day
10:05handmade.cpp: Get TopDownAlignY back in
10:05handmade.cpp: Get TopDownAlignY back in
10:05handmade.cpp: Get TopDownAlignY back in
12:19Run the game to see the correct alignment
12:19Run the game to see the correct alignment
12:19Run the game to see the correct alignment
12:27handmade.h: Make things only load once
12:27handmade.h: Make things only load once
12:27handmade.h: Make things only load once
14:05handmade.cpp: Check to see if the asset in question is loaded
14:05handmade.cpp: Check to see if the asset in question is loaded
14:05handmade.cpp: Check to see if the asset in question is loaded
16:14handmade_intrinsics.h: Introduce AtomicCompareExchangeUInt32
16:14handmade_intrinsics.h: Introduce AtomicCompareExchangeUInt32
16:14handmade_intrinsics.h: Introduce AtomicCompareExchangeUInt32
19:05Compile and run
19:05Compile and run
19:05Compile and run
19:41FillGroundChunk will render incorrectly if the bitmap to be composited doesn't exist
19:41FillGroundChunk will render incorrectly if the bitmap to be composited doesn't exist
19:41FillGroundChunk will render incorrectly if the bitmap to be composited doesn't exist
21:42handmade.cpp: Only mark the ground chunk as having been filled once we know it has been
21:42handmade.cpp: Only mark the ground chunk as having been filled once we know it has been
21:42handmade.cpp: Only mark the ground chunk as having been filled once we know it has been
22:19handmade_render_group.cpp: Introduce AllBitmapsValid (AllResourcesPresent)
22:19handmade_render_group.cpp: Introduce AllBitmapsValid (AllResourcesPresent)
22:19handmade_render_group.cpp: Introduce AllBitmapsValid (AllResourcesPresent)
23:50Add MissingResourceCount to render_group
23:50Add MissingResourceCount to render_group
23:50Add MissingResourceCount to render_group
24:31Problem: With ground chunks being rendered on a separate thread, they could potentially be evicted at the wrong time
24:31Problem: With ground chunks being rendered on a separate thread, they could potentially be evicted at the wrong time
24:31Problem: With ground chunks being rendered on a separate thread, they could potentially be evicted at the wrong time
25:49Possible solutions to this problem
25:49Possible solutions to this problem
25:49Possible solutions to this problem
28:09handmade_render_group.cpp: Introduce CleanupRenderGroup
28:09handmade_render_group.cpp: Introduce CleanupRenderGroup
28:09handmade_render_group.cpp: Introduce CleanupRenderGroup
30:12handmade_render_group.h: Add game_asset_id to render_entry_bitmap
30:12handmade_render_group.h: Add game_asset_id to render_entry_bitmap
30:12handmade_render_group.h: Add game_asset_id to render_entry_bitmap
31:27handmade_render_group.cpp: Introduce UnlockAsset in CleanupRenderGroup
31:27handmade_render_group.cpp: Introduce UnlockAsset in CleanupRenderGroup
31:27handmade_render_group.cpp: Introduce UnlockAsset in CleanupRenderGroup
32:19Introduce LockAsset in PushBitmap
32:19Introduce LockAsset in PushBitmap
32:19Introduce LockAsset in PushBitmap
33:09Assess this locking implementation and undo it
33:09Assess this locking implementation and undo it
33:09Assess this locking implementation and undo it
37:06handmade.h: Introduce AssetState_Locked in asset_state
37:06handmade.h: Introduce AssetState_Locked in asset_state
37:06handmade.h: Introduce AssetState_Locked in asset_state
38:06Add asset_state FinalState to load_asset_work
38:06Add asset_state FinalState to load_asset_work
38:06Add asset_state FinalState to load_asset_work
39:03handmade.cpp: Assess what DEBUGLoadBMP is doing and consider what to do next
39:03handmade.cpp: Assess what DEBUGLoadBMP is doing and consider what to do next
39:03handmade.cpp: Assess what DEBUGLoadBMP is doing and consider what to do next
42:12handmade.h: Expand the notion of game_asset_id to be more generic
42:12handmade.h: Expand the notion of game_asset_id to be more generic
42:12handmade.h: Expand the notion of game_asset_id to be more generic
43:15Introduce asset_bitmap_info
43:15Introduce asset_bitmap_info
43:15Introduce asset_bitmap_info
44:24Introduce asset_tag
44:24Introduce asset_tag
44:24Introduce asset_tag
45:08Talk about creating a table of assets which provides semantic information to the code
45:08Talk about creating a table of assets which provides semantic information to the code
45:08Talk about creating a table of assets which provides semantic information to the code
46:22handmade.cpp: Discuss how this semantic information could be used by the world generation code
46:22handmade.cpp: Discuss how this semantic information could be used by the world generation code
46:22handmade.cpp: Discuss how this semantic information could be used by the world generation code
48:09Assets: Take a look at the art assets
48:09Assets: Take a look at the art assets
48:09Assets: Take a look at the art assets
49:06handmade.cpp: Introduce PickBest to rank assets according to the given criteria
49:06handmade.cpp: Introduce PickBest to rank assets according to the given criteria
49:06handmade.cpp: Introduce PickBest to rank assets according to the given criteria
53:39Explain how PickBest could work
53:39Explain how PickBest could work
53:39Explain how PickBest could work
55:50handmade.h: Introduce asset_group
55:50handmade.h: Introduce asset_group
55:50handmade.h: Introduce asset_group
56:50Get it compiling and leave it for now
56:50Get it compiling and leave it for now
56:50Get it compiling and leave it for now
57:20Q&A
🗩
57:20Q&A
🗩
57:20Q&A
🗩
57:38robotchocolatedino In PickBest, would you want other types of falloffs when computing the difference?
🗪
57:38robotchocolatedino In PickBest, would you want other types of falloffs when computing the difference?
🗪
57:38robotchocolatedino In PickBest, would you want other types of falloffs when computing the difference?
🗪
57:57xyane When compiling for 64bit, shouldn't you be using _InterlockedCompareExchange64?
🗪
57:57xyane When compiling for 64bit, shouldn't you be using _InterlockedCompareExchange64?
🗪
57:57xyane When compiling for 64bit, shouldn't you be using _InterlockedCompareExchange64?
🗪
58:29quikligames In your example of having 32 GB of assets uncompressed and 2 GB of space for them, are there techniques you can use to tell whether you will need more than 2 GB at one time?
🗪
58:29quikligames In your example of having 32 GB of assets uncompressed and 2 GB of space for them, are there techniques you can use to tell whether you will need more than 2 GB at one time?
🗪
58:29quikligames In your example of having 32 GB of assets uncompressed and 2 GB of space for them, are there techniques you can use to tell whether you will need more than 2 GB at one time?
🗪
59:44johnicholas Can you summarize what you've done from the artist's perspective? Did you add a (light) obligation to the contract between the programmer and the artist?
🗪
59:44johnicholas Can you summarize what you've done from the artist's perspective? Did you add a (light) obligation to the contract between the programmer and the artist?
🗪
59:44johnicholas Can you summarize what you've done from the artist's perspective? Did you add a (light) obligation to the contract between the programmer and the artist?
🗪
1:01:02xyane If you can't evict locked resources, what would be the point of streaming them over just loading them up front, and doesn't it put a restraint on the diversity of the environments you can have?
🗪
1:01:02xyane If you can't evict locked resources, what would be the point of streaming them over just loading them up front, and doesn't it put a restraint on the diversity of the environments you can have?
🗪
1:01:02xyane If you can't evict locked resources, what would be the point of streaming them over just loading them up front, and doesn't it put a restraint on the diversity of the environments you can have?
🗪
1:02:42marius_av Shouldn't you fill Work completely before calling PlatformAddEntry for LoadAssetWork?
🗪
1:02:42marius_av Shouldn't you fill Work completely before calling PlatformAddEntry for LoadAssetWork?
🗪
1:02:42marius_av Shouldn't you fill Work completely before calling PlatformAddEntry for LoadAssetWork?
🗪
1:03:23handmade.cpp: Move PlatformAddEntry after the switch statements in LoadAsset
1:03:23handmade.cpp: Move PlatformAddEntry after the switch statements in LoadAsset
1:03:23handmade.cpp: Move PlatformAddEntry after the switch statements in LoadAsset
1:04:06ezyfool I may have missed this, but do you have the ability to set a hard limit on memory usage yet, e.g. so you know you can support lower memory machines?
🗪
1:04:06ezyfool I may have missed this, but do you have the ability to set a hard limit on memory usage yet, e.g. so you know you can support lower memory machines?
🗪
1:04:06ezyfool I may have missed this, but do you have the ability to set a hard limit on memory usage yet, e.g. so you know you can support lower memory machines?
🗪
1:04:49xyane In a prior episode you implemented bilinear filtering. Are you going to take it a step further and implement mipmapping and trilinear filtering?
🗪
1:04:49xyane In a prior episode you implemented bilinear filtering. Are you going to take it a step further and implement mipmapping and trilinear filtering?
🗪
1:04:49xyane In a prior episode you implemented bilinear filtering. Are you going to take it a step further and implement mipmapping and trilinear filtering?
🗪
1:06:52robotchocolatedino Will the assets loaded in from a file be stored and evicted in the same way as the ground chunks?
🗪
1:06:52robotchocolatedino Will the assets loaded in from a file be stored and evicted in the same way as the ground chunks?
🗪
1:06:52robotchocolatedino Will the assets loaded in from a file be stored and evicted in the same way as the ground chunks?
🗪
1:07:18Song: 'Are There Questions?' by Casey Muratori
1:07:18Song: 'Are There Questions?' by Casey Muratori
1:07:18Song: 'Are There Questions?' by Casey Muratori
1:07:50benzih Why only .bmp?
🗪
1:07:50benzih Why only .bmp?
🗪
1:07:50benzih Why only .bmp?
🗪
1:09:04soysaucethekid The eviction stuff you're doing, is it basically garbage collection?
🗪
1:09:04soysaucethekid The eviction stuff you're doing, is it basically garbage collection?
🗪
1:09:04soysaucethekid The eviction stuff you're doing, is it basically garbage collection?
🗪
1:10:40zilerrezko Will we be using AMD hair physics?α
🗪
1:10:40zilerrezko Will we be using AMD hair physics?α
🗪
1:10:40zilerrezko Will we be using AMD hair physics?α
🗪
1:12:07popcorn0x90 If you turn a bitmap black and white by altering the pixel, then would you have two copies of the bitmap? Would you delete one if you have two?
🗪
1:12:07popcorn0x90 If you turn a bitmap black and white by altering the pixel, then would you have two copies of the bitmap? Would you delete one if you have two?
🗪
1:12:07popcorn0x90 If you turn a bitmap black and white by altering the pixel, then would you have two copies of the bitmap? Would you delete one if you have two?
🗪
1:14:22zilerrezko Why do people care so much about garbage collection?
🗪
1:14:22zilerrezko Why do people care so much about garbage collection?
🗪
1:14:22zilerrezko Why do people care so much about garbage collection?
🗪
1:14:29stelar7 Why use a pack-file instead of bmps? What makes it "better"?
🗪
1:14:29stelar7 Why use a pack-file instead of bmps? What makes it "better"?
🗪
1:14:29stelar7 Why use a pack-file instead of bmps? What makes it "better"?
🗪
1:16:21alephant Earlier someone asked why reimplement virtual memory on top of the OS's virtual memory. Are we doing this just so we can have "more" virtual space?
🗪
1:16:21alephant Earlier someone asked why reimplement virtual memory on top of the OS's virtual memory. Are we doing this just so we can have "more" virtual space?
🗪
1:16:21alephant Earlier someone asked why reimplement virtual memory on top of the OS's virtual memory. Are we doing this just so we can have "more" virtual space?
🗪
1:17:45marumoto Are the ground chunks going to be pre-composited when using the GPU?
🗪
1:17:45marumoto Are the ground chunks going to be pre-composited when using the GPU?
🗪
1:17:45marumoto Are the ground chunks going to be pre-composited when using the GPU?
🗪
1:18:02dekameel Is there a reason why you split the character into three bitmaps?
🗪
1:18:02dekameel Is there a reason why you split the character into three bitmaps?
🗪
1:18:02dekameel Is there a reason why you split the character into three bitmaps?
🗪
1:18:12mrstone56 Is the rendering going to be eventually done on the GPU?
🗪
1:18:12mrstone56 Is the rendering going to be eventually done on the GPU?
🗪
1:18:12mrstone56 Is the rendering going to be eventually done on the GPU?
🗪
1:19:05quikligames Are game saves going to be part of that asset pack-file, or their own pack-file?
🗪
1:19:05quikligames Are game saves going to be part of that asset pack-file, or their own pack-file?
🗪
1:19:05quikligames Are game saves going to be part of that asset pack-file, or their own pack-file?
🗪
1:20:23Song: 'Q's & A's' by Casey Muratori
1:20:23Song: 'Q's & A's' by Casey Muratori
1:20:23Song: 'Q's & A's' by Casey Muratori
1:20:39mrstone56 Does porting the rendering to be done on the GPU mean you have to write a renderer completely separate to the CPU one, or is most of the groundwork done by having the CPU renderer done?
🗪
1:20:39mrstone56 Does porting the rendering to be done on the GPU mean you have to write a renderer completely separate to the CPU one, or is most of the groundwork done by having the CPU renderer done?
🗪
1:20:39mrstone56 Does porting the rendering to be done on the GPU mean you have to write a renderer completely separate to the CPU one, or is most of the groundwork done by having the CPU renderer done?
🗪
1:22:24cubercaleb I thought you hated both DRM and cloud-based stuff (based off of Jeff and Casey Show)
🗪
1:22:24cubercaleb I thought you hated both DRM and cloud-based stuff (based off of Jeff and Casey Show)
🗪
1:22:24cubercaleb I thought you hated both DRM and cloud-based stuff (based off of Jeff and Casey Show)
🗪
1:24:00Go get some ramenβ
🗩
1:24:00Go get some ramenβ
🗩
1:24:00Go get some ramenβ
🗩