Drawing Memory Occupancy Accurately
?
?

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:00Plug Handmade Seattle1
🗩
0:00Plug Handmade Seattle1
🗩
0:00Plug Handmade Seattle1
🗩
1:21Recap and set the stage...
🗩
1:21Recap and set the stage...
🗩
1:21Recap and set the stage...
🗩
1:26rupan3 I'm surprised that Casey likes Chrono Trigger
🗪
1:26rupan3 I'm surprised that Casey likes Chrono Trigger
🗪
1:26rupan3 I'm surprised that Casey likes Chrono Trigger
🗪
2:23Recap and set the stage for the day
🗩
2:23Recap and set the stage for the day
🗩
2:23Recap and set the stage for the day
🗩
3:14Demo the current state of our memory viewers, with the determination to draw our blocks at sizes proportional to their usage amount, and track peak usage
🏃
3:14Demo the current state of our memory viewers, with the determination to draw our blocks at sizes proportional to their usage amount, and track peak usage
🏃
3:14Demo the current state of our memory viewers, with the determination to draw our blocks at sizes proportional to their usage amount, and track peak usage
🏃
8:08Set up DrawArenaInterval() to draw proportionally sized ranges of memory
8:08Set up DrawArenaInterval() to draw proportionally sized ranges of memory
8:08Set up DrawArenaInterval() to draw proportionally sized ranges of memory
16:52Implement DrawMemoryRange()
16:52Implement DrawMemoryRange()
16:52Implement DrawMemoryRange()
30:30Check out our incorrect memory Arenas viewer
🏃
30:30Check out our incorrect memory Arenas viewer
🏃
30:30Check out our incorrect memory Arenas viewer
🏃
30:56Fix DrawArenaInterval() to advance the BlockStartAddress
30:56Fix DrawArenaInterval() to advance the BlockStartAddress
30:56Fix DrawArenaInterval() to advance the BlockStartAddress
31:26Check out our less incorrect memory Arenas viewer
🏃
31:26Check out our less incorrect memory Arenas viewer
🏃
31:26Check out our less incorrect memory Arenas viewer
🏃
33:37Fix DrawMemoryRange() to correctly draw sub-regions of rows
33:37Fix DrawMemoryRange() to correctly draw sub-regions of rows
33:37Fix DrawMemoryRange() to correctly draw sub-regions of rows
34:54Check out our proportionally-sized memory Arenas viewer
🏃
34:54Check out our proportionally-sized memory Arenas viewer
🏃
34:54Check out our proportionally-sized memory Arenas viewer
🏃
40:51Add colours to the DebugColorTable, requesting a .h file containing the 64 most easily differentiated colours
40:51Add colours to the DebugColorTable, requesting a .h file containing the 64 most easily differentiated colours
40:51Add colours to the DebugColorTable, requesting a .h file containing the 64 most easily differentiated colours
43:08Enable DrawTopMemList() and DrawArenaInterval() to track and colour allocations the same per call-site
43:08Enable DrawTopMemList() and DrawArenaInterval() to track and colour allocations the same per call-site
43:08Enable DrawTopMemList() and DrawArenaInterval() to track and colour allocations the same per call-site
1:03:25Hit our "too many call sites" assertion in GetCallSiteFrom()
🏃
1:03:25Hit our "too many call sites" assertion in GetCallSiteFrom()
🏃
1:03:25Hit our "too many call sites" assertion in GetCallSiteFrom()
🏃
1:05:24Change GetCallSiteFrom() to compare GUIDs as strings, rather than by pointer, and increase the ArenaCallSites size
1:05:24Change GetCallSiteFrom() to compare GUIDs as strings, rather than by pointer, and increase the ArenaCallSites size
1:05:24Change GetCallSiteFrom() to compare GUIDs as strings, rather than by pointer, and increase the ArenaCallSites size
1:05:58Check out our memory Sizes viewer to see call-sites currently responsible for 0 allocations, but the Arenas viewer not colouring call-sites consistently
🏃
1:05:58Check out our memory Sizes viewer to see call-sites currently responsible for 0 allocations, but the Arenas viewer not colouring call-sites consistently
🏃
1:05:58Check out our memory Sizes viewer to see call-sites currently responsible for 0 allocations, but the Arenas viewer not colouring call-sites consistently
🏃
1:07:42Fix DrawArenaInterval() to use the CallSiteIndex in the lookup to the DebugColorTable
1:07:42Fix DrawArenaInterval() to use the CallSiteIndex in the lookup to the DebugColorTable
1:07:42Fix DrawArenaInterval() to use the CallSiteIndex in the lookup to the DebugColorTable
1:07:51Check out our consistently coloured memory Arenas call-site viewer
🏃
1:07:51Check out our consistently coloured memory Arenas call-site viewer
🏃
1:07:51Check out our consistently coloured memory Arenas call-site viewer
🏃
1:10:50Change DEBUGInit() to expand all the debug views by default
1:10:50Change DEBUGInit() to expand all the debug views by default
1:10:50Change DEBUGInit() to expand all the debug views by default
1:21:00Find that the debug views are not expanded by default
🏃
1:21:00Find that the debug views are not expanded by default
🏃
1:21:00Find that the debug views are not expanded by default
🏃
1:21:34Change DEBUGInit() to call SetExpand() after the AddTree() calls
1:21:34Change DEBUGInit() to call SetExpand() after the AddTree() calls
1:21:34Change DEBUGInit() to call SetExpand() after the AddTree() calls
1:21:47Find that the debug views remain not expanded by default
🏃
1:21:47Find that the debug views remain not expanded by default
🏃
1:21:47Find that the debug views remain not expanded by default
🏃
1:21:49Scour the code for the reason why the debug views are not expanded by default
📖
1:21:49Scour the code for the reason why the debug views are not expanded by default
📖
1:21:49Scour the code for the reason why the debug views are not expanded by default
📖
1:24:42Step through DEBUGInit() to see how view collapsibility figures in to it
🏃
1:24:42Step through DEBUGInit() to see how view collapsibility figures in to it
🏃
1:24:42Step through DEBUGInit() to see how view collapsibility figures in to it
🏃
1:26:45Consult the code to see if it matters if the View.Type is unset
📖
1:26:45Consult the code to see if it matters if the View.Type is unset
📖
1:26:45Consult the code to see if it matters if the View.Type is unset
📖
1:28:11Continue to step through SetExpand(), to find that we correctly match the Tree but not the Link of our views
🏃
1:28:11Continue to step through SetExpand(), to find that we correctly match the Tree but not the Link of our views
🏃
1:28:11Continue to step through SetExpand(), to find that we correctly match the Tree but not the Link of our views
🏃
1:31:31Discover that we create dummy view groups, to later replace them in CollateDebugRecords()
📖
1:31:31Discover that we create dummy view groups, to later replace them in CollateDebugRecords()
📖
1:31:31Discover that we create dummy view groups, to later replace them in CollateDebugRecords()
📖
1:33:18Make CollateDebugRecords() expand HUD groups
1:33:18Make CollateDebugRecords() expand HUD groups
1:33:18Make CollateDebugRecords() expand HUD groups
1:34:46Find that our debug views are now expanded by default
🏃
1:34:46Find that our debug views are now expanded by default
🏃
1:34:46Find that our debug views are now expanded by default
🏃
1:36:10Add per-arena peak memory usage tracking to DEBUGArenaBlockAllocate() and DrawTopMemList()
1:36:10Add per-arena peak memory usage tracking to DEBUGArenaBlockAllocate() and DrawTopMemList()
1:36:10Add per-arena peak memory usage tracking to DEBUGArenaBlockAllocate() and DrawTopMemList()
1:40:41Check out our peak usage in the memory Sizes viewer
🏃
1:40:41Check out our peak usage in the memory Sizes viewer
🏃
1:40:41Check out our peak usage in the memory Sizes viewer
🏃
1:42:21Add per-call-site peak memory usage tracking to DEBUGArenaBlockAllocate() and DrawTopMemList()
1:42:21Add per-call-site peak memory usage tracking to DEBUGArenaBlockAllocate() and DrawTopMemList()
1:42:21Add per-call-site peak memory usage tracking to DEBUGArenaBlockAllocate() and DrawTopMemList()
1:46:02Check out our per-call-site peak usage in the memory Sizes viewer
🏃
1:46:02Check out our per-call-site peak usage in the memory Sizes viewer
🏃
1:46:02Check out our per-call-site peak usage in the memory Sizes viewer
🏃
1:47:26Add a %m conversion specifier for FormatStringList() to convert byte-amounts to sensible, non-zero multiples of bytes, i.e. b, kb, mb, gb
1:47:26Add a %m conversion specifier for FormatStringList() to convert byte-amounts to sensible, non-zero multiples of bytes, i.e. b, kb, mb, gb
1:47:26Add a %m conversion specifier for FormatStringList() to convert byte-amounts to sensible, non-zero multiples of bytes, i.e. b, kb, mb, gb
1:56:26Find that our byte-amounts are incorrectly displayed
1:56:26Find that our byte-amounts are incorrectly displayed
1:56:26Find that our byte-amounts are incorrectly displayed
1:56:46Prevent DrawTopMemList() from casting memory amounts to u32 in its calls to FormatString()
1:56:46Prevent DrawTopMemList() from casting memory amounts to u32 in its calls to FormatString()
1:56:46Prevent DrawTopMemList() from casting memory amounts to u32 in its calls to FormatString()
1:57:58Check out our correctly converted byte-amounts
🏃
1:57:58Check out our correctly converted byte-amounts
🏃
1:57:58Check out our correctly converted byte-amounts
🏃
1:58:50Tweak FormatStringList() to display 1 kb, mb and gb as such, rather than 1024 of their smaller multiple
1:58:50Tweak FormatStringList() to display 1 kb, mb and gb as such, rather than 1024 of their smaller multiple
1:58:50Tweak FormatStringList() to display 1 kb, mb and gb as such, rather than 1024 of their smaller multiple
1:59:05Check out our perfectly converted byte-amounts
🏃
1:59:05Check out our perfectly converted byte-amounts
🏃
1:59:05Check out our perfectly converted byte-amounts
🏃
1:59:22Q&A
🗩
1:59:22Q&A
🗩
1:59:22Q&A
🗩
1:59:42vaualbus Q: Do you think that having a way to visualize the memory as an image could be useful? How you would implement that?
🗪
1:59:42vaualbus Q: Do you think that having a way to visualize the memory as an image could be useful? How you would implement that?
🗪
1:59:42vaualbus Q: Do you think that having a way to visualize the memory as an image could be useful? How you would implement that?
🗪
2:02:34Brian Q: Admittedly I have not been watching all the streams or reviewed the code, but if this tracks memory, and the transient memory could reset itself throughout the frame, is what is only tracked what is left at the end of the frame? And if you have collected peak information? Is the reason the memory appears static because you are not doing anything new / different between frames?
🗪
2:02:34Brian Q: Admittedly I have not been watching all the streams or reviewed the code, but if this tracks memory, and the transient memory could reset itself throughout the frame, is what is only tracked what is left at the end of the frame? And if you have collected peak information? Is the reason the memory appears static because you are not doing anything new / different between frames?
🗪
2:02:34Brian Q: Admittedly I have not been watching all the streams or reviewed the code, but if this tracks memory, and the transient memory could reset itself throughout the frame, is what is only tracked what is left at the end of the frame? And if you have collected peak information? Is the reason the memory appears static because you are not doing anything new / different between frames?
🗪
2:04:21shlver Q: Are you planning to add more features to this?
🗪
2:04:21shlver Q: Are you planning to add more features to this?
🗪
2:04:21shlver Q: Are you planning to add more features to this?
🗪
2:04:29decstar77 Q: Started watching you awhile back, is the earlier episodes still relevant / worth it, or should I start somewhere more up-to-date so to speak?2
🗪
2:04:29decstar77 Q: Started watching you awhile back, is the earlier episodes still relevant / worth it, or should I start somewhere more up-to-date so to speak?2
🗪
2:04:29decstar77 Q: Started watching you awhile back, is the earlier episodes still relevant / worth it, or should I start somewhere more up-to-date so to speak?2
🗪
2:05:39botder Q: Are you going to add an edit box to filter / reduce the visible lines for memory?
🗪
2:05:39botder Q: Are you going to add an edit box to filter / reduce the visible lines for memory?
🗪
2:05:39botder Q: Are you going to add an edit box to filter / reduce the visible lines for memory?
🗪
2:05:44centhusiast Q: Thanks for the image scaling explanation in the pre-stream. Could you explain about zoom towards the mouse position? Thanks!3
🗪
2:05:44centhusiast Q: Thanks for the image scaling explanation in the pre-stream. Could you explain about zoom towards the mouse position? Thanks!3
🗪
2:05:44centhusiast Q: Thanks for the image scaling explanation in the pre-stream. Could you explain about zoom towards the mouse position? Thanks!3
🗪
2:10:01Brian Q: The timing part of the profiler, you had it so you could click on a section and zoom into that section to see more details about a section. Do you see value for it here? Almost like an embedded tab-view that could show the allocations of each object if you wanted to see it? Or what about an option to print to a file the current allocations?
🗪
2:10:01Brian Q: The timing part of the profiler, you had it so you could click on a section and zoom into that section to see more details about a section. Do you see value for it here? Almost like an embedded tab-view that could show the allocations of each object if you wanted to see it? Or what about an option to print to a file the current allocations?
🗪
2:10:01Brian Q: The timing part of the profiler, you had it so you could click on a section and zoom into that section to see more details about a section. Do you see value for it here? Almost like an embedded tab-view that could show the allocations of each object if you wanted to see it? Or what about an option to print to a file the current allocations?
🗪
2:11:14sc5shout Q: In the threading tutorial you used a pointer to a function. I know that you want to keep it C-style, but wasn't that cleaner to just use a method inside a struct? It'd remove every "pointer = func"
🗪
2:11:14sc5shout Q: In the threading tutorial you used a pointer to a function. I know that you want to keep it C-style, but wasn't that cleaner to just use a method inside a struct? It'd remove every "pointer = func"
🗪
2:11:14sc5shout Q: In the threading tutorial you used a pointer to a function. I know that you want to keep it C-style, but wasn't that cleaner to just use a method inside a struct? It'd remove every "pointer = func"
🗪
2:12:52C-style function pointer in struct vs C++-style virtual function in class
🗩
2:12:52C-style function pointer in struct vs C++-style virtual function in class
🗩
2:12:52C-style function pointer in struct vs C++-style virtual function in class
🗩
2:23:43botder Q: What about C++ lambdas in that case?
🗪
2:23:43botder Q: What about C++ lambdas in that case?
🗪
2:23:43botder Q: What about C++ lambdas in that case?
🗪
2:25:14sc5shout handmade_hero I meant "GameMemory.PlatformAddEntry = Win32AddEntry" and "GameMemory.PlatformCompleteAllWark = Win32CompleteAllWork" platform_add_entry is a void and it points to Win32AddEntry instead of just a single method in a class / struct without jumping through the files and "=" every function pointer
🗪
2:25:14sc5shout handmade_hero I meant "GameMemory.PlatformAddEntry = Win32AddEntry" and "GameMemory.PlatformCompleteAllWark = Win32CompleteAllWork" platform_add_entry is a void and it points to Win32AddEntry instead of just a single method in a class / struct without jumping through the files and "=" every function pointer
🗪
2:25:14sc5shout handmade_hero I meant "GameMemory.PlatformAddEntry = Win32AddEntry" and "GameMemory.PlatformCompleteAllWark = Win32CompleteAllWork" platform_add_entry is a void and it points to Win32AddEntry instead of just a single method in a class / struct without jumping through the files and "=" every function pointer
🗪
2:26:32centhusiast Q: My nephew started computer science a year ago and when I saw the educational materials they are not good and professors mostly teach the toy examples. I think there is a problem with computer science education. Do you know how it can be improved? Maybe the production programmers should teach the programming courses
🗪
2:26:32centhusiast Q: My nephew started computer science a year ago and when I saw the educational materials they are not good and professors mostly teach the toy examples. I think there is a problem with computer science education. Do you know how it can be improved? Maybe the production programmers should teach the programming courses
🗪
2:26:32centhusiast Q: My nephew started computer science a year ago and when I saw the educational materials they are not good and professors mostly teach the toy examples. I think there is a problem with computer science education. Do you know how it can be improved? Maybe the production programmers should teach the programming courses
🗪
2:30:28longboolean Q: Would there also be an issue in C++ if you wanted to have it be in a queue and some other thing, perhaps, would need to inherit from two or more things?
🗪
2:30:28longboolean Q: Would there also be an issue in C++ if you wanted to have it be in a queue and some other thing, perhaps, would need to inherit from two or more things?
🗪
2:30:28longboolean Q: Would there also be an issue in C++ if you wanted to have it be in a queue and some other thing, perhaps, would need to inherit from two or more things?
🗪
2:31:13davep00 Q: Is the C++ way – a lot of hoop jumping just to avoid the cast from the void* to the data type (that you need to do in the C function pointer method) – did the C++ committee reason that it's more type safe?
🗪
2:31:13davep00 Q: Is the C++ way – a lot of hoop jumping just to avoid the cast from the void* to the data type (that you need to do in the C function pointer method) – did the C++ committee reason that it's more type safe?
🗪
2:31:13davep00 Q: Is the C++ way – a lot of hoop jumping just to avoid the cast from the void* to the data type (that you need to do in the C function pointer method) – did the C++ committee reason that it's more type safe?
🗪
2:31:44Wrap it up
🗩
2:31:44Wrap it up
🗩
2:31:44Wrap it up
🗩