[video member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Preliminary Asset Structuring" vod_platform=youtube id=u0LjxqHmvkk annotator=Miblo] [2:37][Recap and set the stage] [5:19][Blackboard: "One in, One out"] [7:46][Blackboard: Only load once!] [9:16][Outline our tasks for the day] [10:05][handmade.cpp: Get TopDownAlignY back in] [12:19][Run the game to see the correct alignment] [12:27][handmade.h: Make things only load once] [14:05][handmade.cpp: Check to see if the asset in question is loaded] [16:14][handmade_intrinsics.h: Introduce AtomicCompareExchangeUInt32] [19:05][Compile and run] [19:41][FillGroundChunk will render incorrectly if the bitmap to be composited doesn't exist] [21:42][handmade.cpp: Only mark the ground chunk as having been filled once we know it has been] [22:19][handmade_render_group.cpp: Introduce AllBitmapsValid (AllResourcesPresent)] [23:50][Add MissingResourceCount to render_group] [24:31][Problem: With ground chunks being rendered on a separate thread, they could potentially be evicted at the wrong time] [25:49][Possible solutions to this problem] [28:09][handmade_render_group.cpp: Introduce CleanupRenderGroup] [30:12][handmade_render_group.h: Add game_asset_id to render_entry_bitmap] [31:27][handmade_render_group.cpp: Introduce UnlockAsset in CleanupRenderGroup] [32:19][Introduce LockAsset in PushBitmap] [33:09][Assess this locking implementation and undo it] [37:06][handmade.h: Introduce AssetState_Locked in asset_state] [38:06][Add asset_state FinalState to load_asset_work] [39:03][handmade.cpp: Assess what DEBUGLoadBMP is doing and consider what to do next] [42:12][handmade.h: Expand the notion of game_asset_id to be more generic] [43:15][Introduce asset_bitmap_info] [44:24][Introduce asset_tag] [45:08][Talk about creating a table of assets which provides semantic information to the code] [46:22][handmade.cpp: Discuss how this semantic information could be used by the world generation code] [48:09][Assets: Take a look at the art assets] [49:06][handmade.cpp: Introduce PickBest to rank assets according to the given criteria] [53:39][Explain how PickBest could work] [55:50][handmade.h: Introduce asset_group] [56:50][Get it compiling and leave it for now] [57:20][Q&A] [57:38][@robotchocolatedino][In PickBest, would you want other types of falloffs when computing the difference?] [57:57][@xyane][When compiling for 64bit, shouldn't you be using _InterlockedCompareExchange64?] [58:29][@quikligames][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:44][@johnicholas][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:02][@xyane][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:42][@marius_av][Shouldn't you fill Work completely before calling PlatformAddEntry for LoadAssetWork?] [1:03:23][handmade.cpp: Move PlatformAddEntry after the switch statements in LoadAsset] [1:04:06][@ezyfool][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:49][@xyane][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:52][@robotchocolatedino][Will the assets loaded in from a file be stored and evicted in the same way as the ground chunks?] [1:07:18][Song: 'Are There Questions?' by Casey Muratori] [1:07:50][@benzih][Why only .bmp?] [1:09:04][@soysaucethekid][The eviction stuff you're doing, is it basically garbage collection?] [1:10:40][@zilerrezko][Will we be using AMD hair physics?][quote 114] [1:12:07][@popcorn0x90][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:22][@zilerrezko][Why do people care so much about garbage collection?] [1:14:29][@stelar7][Why use a pack-file instead of bmps? What makes it "better"?] [1:16:21][@alephant][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:45][@marumoto][Are the ground chunks going to be pre-composited when using the GPU?] [1:18:02][@dekameel][Is there a reason why you split the character into three bitmaps?] [1:18:12][@mrstone56][Is the rendering going to be eventually done on the GPU?] [1:19:05][@quikligames][Are game saves going to be part of that asset pack-file, or their own pack-file?] [1:20:23][Song: 'Q's & A's' by Casey Muratori] [1:20:39][@mrstone56][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:24][@cubercaleb][I thought you hated both DRM and cloud-based stuff (based off of Jeff and Casey Show)] [1:24:00][Go get some ramen][quote 115] [/video]