Downsampling Imported Assets
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next timestamp
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 and Index Controls

a
w
s
d
h j k l


Esc Close menu / unfocus timestamp

Quotes and References Menus and Index

Enter Jump to timestamp

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 and set the stage for the day
🗩
0:01Recap and set the stage for the day
🗩
0:01Recap and set the stage for the day
🗩
2:02Research fast, good file hash: xxHash1,2
📖
2:02Research fast, good file hash: xxHash1,2
📖
2:02Research fast, good file hash: xxHash1,2
📖
5:21Check out MurmurHash3,4
📖
5:21Check out MurmurHash3,4
📖
5:21Check out MurmurHash3,4
📖
13:06Introduce MurmurHashUpdate() as a MurmurHash35 and a 64-bit version of RotateLeft()
13:06Introduce MurmurHashUpdate() as a MurmurHash35 and a 64-bit version of RotateLeft()
13:06Introduce MurmurHashUpdate() as a MurmurHash35 and a 64-bit version of RotateLeft()
20:13Introduce MurmurHashFinalize()6
20:13Introduce MurmurHashFinalize()6
20:13Introduce MurmurHashFinalize()6
21:54Consult the MurmurHash3 repo for the constant values suitable for 64-bit hashing7
📖
21:54Consult the MurmurHash3 repo for the constant values suitable for 64-bit hashing7
📖
21:54Consult the MurmurHash3 repo for the constant values suitable for 64-bit hashing7
📖
29:42Enable MurmurHashUpdate() to perform the mixing step from the 128-bit MurmurHash38
29:42Enable MurmurHashUpdate() to perform the mixing step from the 128-bit MurmurHash38
29:42Enable MurmurHashUpdate() to perform the mixing step from the 128-bit MurmurHash38
31:04Reflect on our chosen hash function and our unfortunate inability to gauge its strength
🗩
31:04Reflect on our chosen hash function and our unfortunate inability to gauge its strength
🗩
31:04Reflect on our chosen hash function and our unfortunate inability to gauge its strength
🗩
34:06Implement CheckSumOf() as a MurmurHash3, permissively unaligned and for little-endian machines
34:06Implement CheckSumOf() as a MurmurHash3, permissively unaligned and for little-endian machines
34:06Implement CheckSumOf() as a MurmurHash3, permissively unaligned and for little-endian machines
41:56“I'm just going to leave it like this, and everyone who has a big-endian machine can eat on it”α
🗩
41:56“I'm just going to leave it like this, and everyone who has a big-endian machine can eat on it”α
🗩
41:56“I'm just going to leave it like this, and everyone who has a big-endian machine can eat on it”α
🗩
42:01Finish implementing CheckSumOf()
42:01Finish implementing CheckSumOf()
42:01Finish implementing CheckSumOf()
42:42Decide against making ReadHHA_V0() produce the file's checksum
🗩
42:42Decide against making ReadHHA_V0() produce the file's checksum
🗩
42:42Decide against making ReadHHA_V0() produce the file's checksum
🗩
44:16Set up to test our importing
🏃
44:16Set up to test our importing
🏃
44:16Set up to test our importing
🏃
44:47Create and inspect a new local.hha
🏃
44:47Create and inspect a new local.hha
🏃
44:47Create and inspect a new local.hha
🏃
45:47Step in to AllocateGameAssets() and follow the asset importing process
🏃
45:47Step in to AllocateGameAssets() and follow the asset importing process
🏃
45:47Step in to AllocateGameAssets() and follow the asset importing process
🏃
48:11Address the failed TagIndexInFile == TagCount assertion in WriteModificationsToHHA()
🏃
48:11Address the failed TagIndexInFile == TagCount assertion in WriteModificationsToHHA()
🏃
48:11Address the failed TagIndexInFile == TagCount assertion in WriteModificationsToHHA()
🏃
49:23Create a new local.hha and step through WriteModificationsToHHA()
🏃
49:23Create a new local.hha and step through WriteModificationsToHHA()
🏃
49:23Create a new local.hha and step through WriteModificationsToHHA()
🏃
51:26Fix WriteModificationsToHHA() to skip the null asset entry, and copy out the source tags
51:26Fix WriteModificationsToHHA() to skip the null asset entry, and copy out the source tags
51:26Fix WriteModificationsToHHA() to skip the null asset entry, and copy out the source tags
52:30Continue to step through WriteModificationsToHHA() into the game
🏃
52:30Continue to step through WriteModificationsToHHA() into the game
🏃
52:30Continue to step through WriteModificationsToHHA() into the game
🏃
53:03Check out our local.hha dump in TabView to see UNKNOWN types
🏃
53:03Check out our local.hha dump in TabView to see UNKNOWN types
🏃
53:03Check out our local.hha dump in TabView to see UNKNOWN types
🏃
55:26Make ProcessTiledImport() set the Type
55:26Make ProcessTiledImport() set the Type
55:26Make ProcessTiledImport() set the Type
56:48Run the game, check out our local.hha dump and see that the bitmap types are now set
🏃
56:48Run the game, check out our local.hha dump and see that the bitmap types are now set
🏃
56:48Run the game, check out our local.hha dump and see that the bitmap types are now set
🏃
57:51Step through AllocateGameAssets() to see if we correctly check for changes
🏃
57:51Step through AllocateGameAssets() to see if we correctly check for changes
🏃
57:51Step through AllocateGameAssets() to see if we correctly check for changes
🏃
59:26Make AllocateGameAssets() set the asset BasicCategory
59:26Make AllocateGameAssets() set the asset BasicCategory
59:26Make AllocateGameAssets() set the asset BasicCategory
1:01:24Recreate local.hha
🏃
1:01:24Recreate local.hha
🏃
1:01:24Recreate local.hha
🏃
1:02:05“Oh, Blue Angels again today”β
🗩
1:02:05“Oh, Blue Angels again today”β
🗩
1:02:05“Oh, Blue Angels again today”β
🗩
1:02:11Check the local.hha dump in TabView to see our BasicCategory settings
🏃
1:02:11Check the local.hha dump in TabView to see our BasicCategory settings
🏃
1:02:11Check the local.hha dump in TabView to see our BasicCategory settings
🏃
1:02:49Determine to swizzle the R and G channels, and downsample our assets
🗩
1:02:49Determine to swizzle the R and G channels, and downsample our assets
🗩
1:02:49Determine to swizzle the R and G channels, and downsample our assets
🗩
1:03:59Downsampling of Art Assets
🖌
1:03:59Downsampling of Art Assets
🖌
1:03:59Downsampling of Art Assets
🖌
1:07:01Streaming in assets from disk9
🖌
1:07:01Streaming in assets from disk9
🖌
1:07:01Streaming in assets from disk9
🖌
1:10:03Solving the streaming-from-disk problem by downsampling or compressing
🖌
1:10:03Solving the streaming-from-disk problem by downsampling or compressing
🖌
1:10:03Solving the streaming-from-disk problem by downsampling or compressing
🖌
1:13:39Oversampling art as a future-proofing measure
🖌
1:13:39Oversampling art as a future-proofing measure
🖌
1:13:39Oversampling art as a future-proofing measure
🖌
1:15:02Set up to downsample our assets
🗩
1:15:02Set up to downsample our assets
🗩
1:15:02Set up to downsample our assets
🗩
1:18:49Enable ProcessTiledImport() to downsample our assets and swizzle their R and B channels
1:18:49Enable ProcessTiledImport() to downsample our assets and swizzle their R and B channels
1:18:49Enable ProcessTiledImport() to downsample our assets and swizzle their R and B channels
1:32:36Run the game without downsampling to see our asset
🏃
1:32:36Run the game without downsampling to see our asset
🏃
1:32:36Run the game without downsampling to see our asset
🏃
1:33:22Run the game downsampling by 2, to not see our asset
🏃
1:33:22Run the game downsampling by 2, to not see our asset
🏃
1:33:22Run the game downsampling by 2, to not see our asset
🏃
1:33:51Check the local.hha dump in TabView to see nothing obvious wrong
🏃
1:33:51Check the local.hha dump in TabView to see nothing obvious wrong
🏃
1:33:51Check the local.hha dump in TabView to see nothing obvious wrong
🏃
1:34:50Make ProcessTiledImport() stride through the pixels differently, and delinearize their colour
1:34:50Make ProcessTiledImport() stride through the pixels differently, and delinearize their colour
1:34:50Make ProcessTiledImport() stride through the pixels differently, and delinearize their colour
1:36:43Run the game to see parts of our asset
🏃
1:36:43Run the game to see parts of our asset
🏃
1:36:43Run the game to see parts of our asset
🏃
1:37:22Fix ProcessTiledImport() to correctly stride through all the rows
1:37:22Fix ProcessTiledImport() to correctly stride through all the rows
1:37:22Fix ProcessTiledImport() to correctly stride through all the rows
1:38:30Run the game to see our asset, and consider that they do not have premultiplied alpha
🏃
1:38:30Run the game to see our asset, and consider that they do not have premultiplied alpha
🏃
1:38:30Run the game to see our asset, and consider that they do not have premultiplied alpha
🏃
1:39:25Insert some investigative code in ProcessTiledImport() to determine whether or not the assets have premultiplied alpha
1:39:25Insert some investigative code in ProcessTiledImport() to determine whether or not the assets have premultiplied alpha
1:39:25Insert some investigative code in ProcessTiledImport() to determine whether or not the assets have premultiplied alpha
1:41:26Break in to ProcessTiledImport() and watch the MaxBlueAlphaDiffC, to deduce that the alpha is not premultiplied
🏃
1:41:26Break in to ProcessTiledImport() and watch the MaxBlueAlphaDiffC, to deduce that the alpha is not premultiplied
🏃
1:41:26Break in to ProcessTiledImport() and watch the MaxBlueAlphaDiffC, to deduce that the alpha is not premultiplied
🏃
1:42:50Make ProcessTiledImport() multiply each pixel's alpha into its colour
1:42:50Make ProcessTiledImport() multiply each pixel's alpha into its colour
1:42:50Make ProcessTiledImport() multiply each pixel's alpha into its colour
1:45:20Run the game and hit a long delay
🏃
1:45:20Run the game and hit a long delay
🏃
1:45:20Run the game and hit a long delay
🏃
1:46:28Check out the nice clean edges on our asset
🏃
1:46:28Check out the nice clean edges on our asset
🏃
1:46:28Check out the nice clean edges on our asset
🏃
1:47:01Run the game a second time, and test it all in -O2
🏃
1:47:01Run the game a second time, and test it all in -O2
🏃
1:47:01Run the game a second time, and test it all in -O2
🏃
1:49:18Q&A
🗩
1:49:18Q&A
🗩
1:49:18Q&A
🗩
1:49:51vateferfout Q: At the end of the y loop of the downsample, shouldn't it be SourceBuffer0 = SourceBuffer1 + PrevDim; SourceBuffer1 = SourceBuffer0 + PrevDim; and x and y advancing by 2?
🗪
1:49:51vateferfout Q: At the end of the y loop of the downsample, shouldn't it be SourceBuffer0 = SourceBuffer1 + PrevDim; SourceBuffer1 = SourceBuffer0 + PrevDim; and x and y advancing by 2?
🗪
1:49:51vateferfout Q: At the end of the y loop of the downsample, shouldn't it be SourceBuffer0 = SourceBuffer1 + PrevDim; SourceBuffer1 = SourceBuffer0 + PrevDim; and x and y advancing by 2?
🗪
1:51:01mmozeiko Q: You added a comment for handling big-endianness for residual value when calculating hash, but I feel it is important to mention that the same comment should apply also for *At dereferencing in the loop. Loading u64 from byte array will also be affected by endianness and hash value will be different
🗪
1:51:01mmozeiko Q: You added a comment for handling big-endianness for residual value when calculating hash, but I feel it is important to mention that the same comment should apply also for *At dereferencing in the loop. Loading u64 from byte array will also be affected by endianness and hash value will be different
🗪
1:51:01mmozeiko Q: You added a comment for handling big-endianness for residual value when calculating hash, but I feel it is important to mention that the same comment should apply also for *At dereferencing in the loop. Loading u64 from byte array will also be affected by endianness and hash value will be different
🗪
1:51:50Make the big-endian comment apply to the whole of CheckSumOf()
1:51:50Make the big-endian comment apply to the whole of CheckSumOf()
1:51:50Make the big-endian comment apply to the whole of CheckSumOf()
1:52:39zrizi Q: (Off-topic) Are you the founder of Molly? How long ago did you start working there?
🗪
1:52:39zrizi Q: (Off-topic) Are you the founder of Molly? How long ago did you start working there?
🗪
1:52:39zrizi Q: (Off-topic) Are you the founder of Molly? How long ago did you start working there?
🗪
1:53:02jim0_o Q: Does Anna draw Vector graphics initially and would you consider rasterising vector graphics in the asset system or at startup for a game like this?
🗪
1:53:02jim0_o Q: Does Anna draw Vector graphics initially and would you consider rasterising vector graphics in the asset system or at startup for a game like this?
🗪
1:53:02jim0_o Q: Does Anna draw Vector graphics initially and would you consider rasterising vector graphics in the asset system or at startup for a game like this?
🗪
1:54:23nxsy Q: What sort of precision would we be losing by doing the downsamples from each other and doing srgb->linear->srgb, rather than, say, doing the linear conversion at the start and keeping it in linear, and doing the linear->srgb only when writing out each file?
🗪
1:54:23nxsy Q: What sort of precision would we be losing by doing the downsamples from each other and doing srgb->linear->srgb, rather than, say, doing the linear conversion at the start and keeping it in linear, and doing the linear->srgb only when writing out each file?
🗪
1:54:23nxsy Q: What sort of precision would we be losing by doing the downsamples from each other and doing srgb->linear->srgb, rather than, say, doing the linear conversion at the start and keeping it in linear, and doing the linear->srgb only when writing out each file?
🗪
1:56:28zrizi Q: (Off-topic) Any suggestion / resource about how to implement a networking layer from scratch for massive multiplayer games?
🗪
1:56:28zrizi Q: (Off-topic) Any suggestion / resource about how to implement a networking layer from scratch for massive multiplayer games?
🗪
1:56:28zrizi Q: (Off-topic) Any suggestion / resource about how to implement a networking layer from scratch for massive multiplayer games?
🗪
1:56:46nxsy Q: I guess that’s a fun thing for me to test out
🗪
1:56:46nxsy Q: I guess that’s a fun thing for me to test out
🗪
1:56:46nxsy Q: I guess that’s a fun thing for me to test out
🗪
1:59:06ivereadthesequel Q: (Off-topic) Just curious, are there any games that require more accurate or complex digital filters on the image than those of bilinear or other approximations? Like any sort of sharp low pass filter, etc?
🗪
1:59:06ivereadthesequel Q: (Off-topic) Just curious, are there any games that require more accurate or complex digital filters on the image than those of bilinear or other approximations? Like any sort of sharp low pass filter, etc?
🗪
1:59:06ivereadthesequel Q: (Off-topic) Just curious, are there any games that require more accurate or complex digital filters on the image than those of bilinear or other approximations? Like any sort of sharp low pass filter, etc?
🗪
2:00:49centhusiast Q: Could you explain again the rotation to the left in the bit pattern you used?
🗪
2:00:49centhusiast Q: Could you explain again the rotation to the left in the bit pattern you used?
🗪
2:00:49centhusiast Q: Could you explain again the rotation to the left in the bit pattern you used?
🗪
2:02:01zrizi Q: I was thinking about a shooter. But let's think that we want to support multiplayer (over network) for Handmade Hero
🗪
2:02:01zrizi Q: I was thinking about a shooter. But let's think that we want to support multiplayer (over network) for Handmade Hero
🗪
2:02:01zrizi Q: I was thinking about a shooter. But let's think that we want to support multiplayer (over network) for Handmade Hero
🗪
2:03:01graemephi Q: (Off-topic, a bit) Can you give a quick description of the filter you designed? I'm fine with heavy DSP jargon
🗪
2:03:01graemephi Q: (Off-topic, a bit) Can you give a quick description of the filter you designed? I'm fine with heavy DSP jargon
🗪
2:03:01graemephi Q: (Off-topic, a bit) Can you give a quick description of the filter you designed? I'm fine with heavy DSP jargon
🗪
2:03:41vaualbus Q: There are no rotate left / right SSE / AVX intrinsics?10
🗪
2:03:41vaualbus Q: There are no rotate left / right SSE / AVX intrinsics?10
🗪
2:03:41vaualbus Q: There are no rotate left / right SSE / AVX intrinsics?10
🗪
2:05:00frostyninja Q: My girlfriend appreciates how much you hate on Microsoft and Windows (since I scream about it day in and out), but she said your keyboard sounds like someone's peeing in the next room and it has ruined my life
🗪
2:05:00frostyninja Q: My girlfriend appreciates how much you hate on Microsoft and Windows (since I scream about it day in and out), but she said your keyboard sounds like someone's peeing in the next room and it has ruined my life
🗪
2:05:00frostyninja Q: My girlfriend appreciates how much you hate on Microsoft and Windows (since I scream about it day in and out), but she said your keyboard sounds like someone's peeing in the next room and it has ruined my life
🗪
2:05:38zrizi Q: But when client updates using server's incoming updates, assuming client simulates locally, it can create discontinuation if simulation diverged. Maybe in Handmade Hero it cannot diverge that much, though
🗪
2:05:38zrizi Q: But when client updates using server's incoming updates, assuming client simulates locally, it can create discontinuation if simulation diverged. Maybe in Handmade Hero it cannot diverge that much, though
🗪
2:05:38zrizi Q: But when client updates using server's incoming updates, assuming client simulates locally, it can create discontinuation if simulation diverged. Maybe in Handmade Hero it cannot diverge that much, though
🗪
2:07:38vateferfout You can just lerp between the client state and the server update
🗪
2:07:38vateferfout You can just lerp between the client state and the server update
🗪
2:07:38vateferfout You can just lerp between the client state and the server update
🗪
2:08:11jim0_o Q: Would you need the brush strokes or would vector graphics from a conversion tool work? In Adobe Illustrator there is a quick and dirty conversion tool that I found works nicely for high-res cartoony graphics to vector graphics
🗪
2:08:11jim0_o Q: Would you need the brush strokes or would vector graphics from a conversion tool work? In Adobe Illustrator there is a quick and dirty conversion tool that I found works nicely for high-res cartoony graphics to vector graphics
🗪
2:08:11jim0_o Q: Would you need the brush strokes or would vector graphics from a conversion tool work? In Adobe Illustrator there is a quick and dirty conversion tool that I found works nicely for high-res cartoony graphics to vector graphics
🗪
2:08:52Shut it on down
🗩
2:08:52Shut it on down
🗩
2:08:52Shut it on down
🗩