0:00Introducing Jason Gregory
0:00Introducing Jason Gregory
0:00Introducing Jason Gregory
1:35Casey Muratori: What's your background?
1:35Casey Muratori: What's your background?
1:35Casey Muratori: What's your background?
1:47Jason Gregory: Studying Systems Design Engineering at University of Waterloo, before entering the gaming industry at Midway Games, then EA and finally Naughty Dog
1:47Jason Gregory: Studying Systems Design Engineering at University of Waterloo, before entering the gaming industry at Midway Games, then EA and finally Naughty Dog
1:47Jason Gregory: Studying Systems Design Engineering at University of Waterloo, before entering the gaming industry at Midway Games, then EA and finally Naughty Dog
3:03CM: What have you been involved in at Naughty Dog?
3:03CM: What have you been involved in at Naughty Dog?
3:03CM: What have you been involved in at Naughty Dog?
3:17JG: Starting in the middle of the original Uncharted, moving to C++ from GOOL 2
3:17JG: Starting in the middle of the original Uncharted, moving to C++ from GOOL 2
3:17JG: Starting in the middle of the original Uncharted, moving to C++ from GOOL 2
4:21CM: What's an example of the lowest-level component built in GOOL?
4:21CM: What's an example of the lowest-level component built in GOOL?
4:21CM: What's an example of the lowest-level component built in GOOL?
4:29JG: GOOL's Game Object Model, with hot reloading
4:29JG: GOOL's Game Object Model, with hot reloading
4:29JG: GOOL's Game Object Model, with hot reloading
5:09JG: Naughty Dog's current usage of a Lisp-like language: for data definition and runtime scripting
5:09JG: Naughty Dog's current usage of a Lisp-like language: for data definition and runtime scripting
5:09JG: Naughty Dog's current usage of a Lisp-like language: for data definition and runtime scripting
5:38JG: Scheme basic syntax
🖌
5:38JG: Scheme basic syntax
🖌
5:38JG: Scheme basic syntax
🖌
7:13JG: Animation Overlay System
🖌
7:13JG: Animation Overlay System
🖌
7:13JG: Animation Overlay System
🖌
8:13JG: Syntax pattern matching in Scheme
8:13JG: Syntax pattern matching in Scheme
8:13JG: Syntax pattern matching in Scheme
8:50CM: How essential is this flexibility of Scheme?
8:50CM: How essential is this flexibility of Scheme?
8:50CM: How essential is this flexibility of Scheme?
9:16JG: Slow full-build, but quicker partial-builds
9:16JG: Slow full-build, but quicker partial-builds
9:16JG: Slow full-build, but quicker partial-builds
9:50CM: You wanted to tell an emergency fire story
9:50CM: You wanted to tell an emergency fire story
9:50CM: You wanted to tell an emergency fire story
10:16JG: Growing pains from Uncharted 3 → The Last of Us → Uncharted 4
10:16JG: Growing pains from Uncharted 3 → The Last of Us → Uncharted 4
10:16JG: Growing pains from Uncharted 3 → The Last of Us → Uncharted 4
11:50JG: Naughty Dog's development pipeline and relatively small team
11:50JG: Naughty Dog's development pipeline and relatively small team
11:50JG: Naughty Dog's development pipeline and relatively small team
15:46JG: Code flavours: Normal, Final and Hybrid release (no debug build)
15:46JG: Code flavours: Normal, Final and Hybrid release (no debug build)
15:46JG: Code flavours: Normal, Final and Hybrid release (no debug build)
17:47JG: Development pipeline continued: Check-in, publication and being a hybrid Windows and Linux studio
17:47JG: Development pipeline continued: Check-in, publication and being a hybrid Windows and Linux studio
17:47JG: Development pipeline continued: Check-in, publication and being a hybrid Windows and Linux studio
19:51JG: Building an animation, using "frame ranges" metadata
19:51JG: Building an animation, using "frame ranges" metadata
19:51JG: Building an animation, using "frame ranges" metadata
20:22CM: So the database is like a manifest? And it isn't Lisp-like?
20:22CM: So the database is like a manifest? And it isn't Lisp-like?
20:22CM: So the database is like a manifest? And it isn't Lisp-like?
27:15JG: Further asset processing
27:15JG: Further asset processing
27:15JG: Further asset processing
28:24CM: Is the whole dependency graph coming from the metadata db?
28:24CM: Is the whole dependency graph coming from the metadata db?
28:24CM: Is the whole dependency graph coming from the metadata db?
28:38JG: The pros and cons of graph links coming from multiple sources
28:38JG: The pros and cons of graph links coming from multiple sources
28:38JG: The pros and cons of graph links coming from multiple sources
31:08CM: So an asset build produces two outputs?
31:08CM: So an asset build produces two outputs?
31:08CM: So an asset build produces two outputs?
31:47JG: Multiple intermediate files, e.g. streaming, chunked animations
31:47JG: Multiple intermediate files, e.g. streaming, chunked animations
31:47JG: Multiple intermediate files, e.g. streaming, chunked animations
32:22CM: Are these intermediate files just byproducts or are they reusable?
32:22CM: Are these intermediate files just byproducts or are they reusable?
32:22CM: Are these intermediate files just byproducts or are they reusable?
32:41JG: Desirable intermediate file reuse
🖌
32:41JG: Desirable intermediate file reuse
🖌
32:41JG: Desirable intermediate file reuse
🖌
34:19JG: Global asset and code builds
34:19JG: Global asset and code builds
34:19JG: Global asset and code builds
36:25CM: What size team are we talking about?
36:25CM: What size team are we talking about?
36:25CM: What size team are we talking about?
36:30JG: 600+ people on Uncharted 4, 30 programmers plus Technical Directors, mostly senior hires
36:30JG: 600+ people on Uncharted 4, 30 programmers plus Technical Directors, mostly senior hires
36:30JG: 600+ people on Uncharted 4, 30 programmers plus Technical Directors, mostly senior hires
37:25CM: You've still not told us the emergency fire story
37:25CM: You've still not told us the emergency fire story
37:25CM: You've still not told us the emergency fire story
37:40JG: z: and y: drives as a NAS called NetApp
🖌
37:40JG: z: and y: drives as a NAS called NetApp
🖌
37:40JG: z: and y: drives as a NAS called NetApp
🖌
38:27JG: Emergency fire story: Crunch on Uncharted 4, with intermittent failures in NetApp
38:27JG: Emergency fire story: Crunch on Uncharted 4, with intermittent failures in NetApp
38:27JG: Emergency fire story: Crunch on Uncharted 4, with intermittent failures in NetApp
45:08CM: How do you handle asset format changes?
45:08CM: How do you handle asset format changes?
45:08CM: How do you handle asset format changes?
46:30JG: Handling format changes: 1) Wholesale .pak file, using versioned directories
46:30JG: Handling format changes: 1) Wholesale .pak file, using versioned directories
46:30JG: Handling format changes: 1) Wholesale .pak file, using versioned directories
48:09JG: Handling format changes: 2) Padding in data structures
48:09JG: Handling format changes: 2) Padding in data structures
48:09JG: Handling format changes: 2) Padding in data structures
48:31JG: Handling format changes: 3) Geometry versioning system within .pak file
48:31JG: Handling format changes: 3) Geometry versioning system within .pak file
48:31JG: Handling format changes: 3) Geometry versioning system within .pak file
49:12JG: Handling format changes: 4) Animation live re-targeting, using mixed versions
49:12JG: Handling format changes: 4) Animation live re-targeting, using mixed versions
49:12JG: Handling format changes: 4) Animation live re-targeting, using mixed versions
50:14CM: Could you talk about soft and hard lockdown?
50:14CM: Could you talk about soft and hard lockdown?
50:14CM: Could you talk about soft and hard lockdown?
50:38JG: Lockdown periods
50:38JG: Lockdown periods
50:38JG: Lockdown periods
51:35JG: Lockdowns: Soft, changes coordinated with lead
51:35JG: Lockdowns: Soft, changes coordinated with lead
51:35JG: Lockdowns: Soft, changes coordinated with lead
53:27JG: Lockdowns: Hard, approval for any change
53:27JG: Lockdowns: Hard, approval for any change
53:27JG: Lockdowns: Hard, approval for any change
54:03CM: So we're putting impediments in place?
54:03CM: So we're putting impediments in place?
54:03CM: So we're putting impediments in place?
54:18JG: Different rates of lockdown between departments
54:18JG: Different rates of lockdown between departments
54:18JG: Different rates of lockdown between departments
56:29CM: Did you have anything else?
56:29CM: Did you have anything else?
56:29CM: Did you have anything else?
56:36JG: Branching code before shipping
56:36JG: Branching code before shipping
56:36JG: Branching code before shipping
57:12CM: Because in the mainline branch you don't distinguish between builds?
57:12CM: Because in the mainline branch you don't distinguish between builds?
57:12CM: Because in the mainline branch you don't distinguish between builds?
57:22JG: Code structure, with shared and common libraries
57:22JG: Code structure, with shared and common libraries
57:22JG: Code structure, with shared and common libraries
58:45CM: Could you give me an example of what goes in these libraries?
58:45CM: Could you give me an example of what goes in these libraries?
58:45CM: Could you give me an example of what goes in these libraries?
58:55JG: Shared library, e.g. core animation engine, low-level rendering pipeline
58:55JG: Shared library, e.g. core animation engine, low-level rendering pipeline
58:55JG: Shared library, e.g. core animation engine, low-level rendering pipeline
59:12JG: Common library, e.g. initialisation
59:12JG: Common library, e.g. initialisation
59:12JG: Common library, e.g. initialisation
59:24JG: Game code, e.g. Drake's rope sliding code, player mechanics, custom weapons
59:24JG: Game code, e.g. Drake's rope sliding code, player mechanics, custom weapons
59:24JG: Game code, e.g. Drake's rope sliding code, player mechanics, custom weapons
59:37JG: Code migration / promotion, e.g. Vox character dialogue system
59:37JG: Code migration / promotion, e.g. Vox character dialogue system
59:37JG: Code migration / promotion, e.g. Vox character dialogue system
1:00:13CM: What's the difference between shared and common?
1:00:13CM: What's the difference between shared and common?
1:00:13CM: What's the difference between shared and common?
1:00:51JG: Shared libraries are game-agnostic, common libraries are customised to the game
1:00:51JG: Shared libraries are game-agnostic, common libraries are customised to the game
1:00:51JG: Shared libraries are game-agnostic, common libraries are customised to the game
1:01:32CM: So it's the presence of #ifs?
1:01:32CM: So it's the presence of #ifs?
1:01:32CM: So it's the presence of #ifs?
1:01:58JG: Low-level game-specific code in EA code
1:01:58JG: Low-level game-specific code in EA code
1:01:58JG: Low-level game-specific code in EA code
1:02:36CM: So this is a question of discipline?
1:02:36CM: So this is a question of discipline?
1:02:36CM: So this is a question of discipline?
1:03:36JG: Division of libraries: 1) Good housekeeping
1:03:36JG: Division of libraries: 1) Good housekeeping
1:03:36JG: Division of libraries: 1) Good housekeeping
1:03:50JG: Division of libraries: 2) Beneficial rebuildable code
1:03:50JG: Division of libraries: 2) Beneficial rebuildable code
1:03:50JG: Division of libraries: 2) Beneficial rebuildable code
1:04:29JG: Division of libraries: 3) Making a good mental distinction between game-specific and not
1:04:29JG: Division of libraries: 3) Making a good mental distinction between game-specific and not
1:04:29JG: Division of libraries: 3) Making a good mental distinction between game-specific and not
1:05:19CM: So the shared is a large piece of the codebase?
1:05:19CM: So the shared is a large piece of the codebase?
1:05:19CM: So the shared is a large piece of the codebase?
1:05:31JG: Library division tempered with pragmatism
1:05:31JG: Library division tempered with pragmatism
1:05:31JG: Library division tempered with pragmatism
1:06:09CM: You mentioned some places where Linux shines
1:06:09CM: You mentioned some places where Linux shines
1:06:09CM: You mentioned some places where Linux shines
1:06:43JG: Efficient Linux server available to PS4
1:06:43JG: Efficient Linux server available to PS4
1:06:43JG: Efficient Linux server available to PS4
1:09:11CM: Why does Linux shine in that example?
1:09:11CM: Why does Linux shine in that example?
1:09:11CM: Why does Linux shine in that example?
1:09:22JG: More efficient NFS protocol in Linux
1:09:22JG: More efficient NFS protocol in Linux
1:09:22JG: More efficient NFS protocol in Linux
1:09:51CM: What about your custom version control for assets?
1:09:51CM: What about your custom version control for assets?
1:09:51CM: What about your custom version control for assets?
1:10:25JG: Custom asset version control using Linux symlinks
1:10:25JG: Custom asset version control using Linux symlinks
1:10:25JG: Custom asset version control using Linux symlinks
1:13:11JG: Naughty Dog codenames: Next (Jak and Daxter) Big (Uncharted) Thing (The Last of Us)
1:13:11JG: Naughty Dog codenames: Next (Jak and Daxter) Big (Uncharted) Thing (The Last of Us)
1:13:11JG: Naughty Dog codenames: Next (Jak and Daxter) Big (Uncharted) Thing (The Last of Us)
1:13:47JG: Custom asset version control, continued
1:13:47JG: Custom asset version control, continued
1:13:47JG: Custom asset version control, continued
1:16:14CM: So you store every version of every asset?
1:16:14CM: So you store every version of every asset?
1:16:14CM: So you store every version of every asset?
1:16:34JG: Purging assets
1:16:34JG: Purging assets
1:16:34JG: Purging assets
1:17:33CM: You tend to use command-line tools, but lately use C#, Qt and PyQt tools. Why this mixture?
1:17:33CM: You tend to use command-line tools, but lately use C#, Qt and PyQt tools. Why this mixture?
1:17:33CM: You tend to use command-line tools, but lately use C#, Qt and PyQt tools. Why this mixture?
1:18:13JG: Tool interface mixture
1:18:13JG: Tool interface mixture
1:18:13JG: Tool interface mixture
1:19:44JG: Not every tool is ideal as a GUI
1:19:44JG: Not every tool is ideal as a GUI
1:19:44JG: Not every tool is ideal as a GUI
1:20:18JG: Fine-grained, per-asset building
1:20:18JG: Fine-grained, per-asset building
1:20:18JG: Fine-grained, per-asset building
1:25:01CM: Did you find the fine-grained and explicit nature of your dependency graph to ever be a limitation?
1:25:01CM: Did you find the fine-grained and explicit nature of your dependency graph to ever be a limitation?
1:25:01CM: Did you find the fine-grained and explicit nature of your dependency graph to ever be a limitation?
1:26:08JG: Halo's dependency graph, as described by
Chris Butcher🖌
1:26:08JG: Halo's dependency graph, as described by
Chris Butcher🖌
1:26:08JG: Halo's dependency graph, as described by
Chris Butcher🖌
1:26:59JG: Looser coupling in Naughty Dog's asset dependency graph, with the flip-side of a large number of files
🖌
1:26:59JG: Looser coupling in Naughty Dog's asset dependency graph, with the flip-side of a large number of files
🖌
1:26:59JG: Looser coupling in Naughty Dog's asset dependency graph, with the flip-side of a large number of files
🖌
1:29:44CM: And you also depend on people setting up the dependencies?
1:29:44CM: And you also depend on people setting up the dependencies?
1:29:44CM: And you also depend on people setting up the dependencies?
1:30:13JG: Platonic perfection vs Reality, and making errors as obvious as possible
1:30:13JG: Platonic perfection vs Reality, and making errors as obvious as possible
1:30:13JG: Platonic perfection vs Reality, and making errors as obvious as possible
1:31:14CM: Thank you, Jason
1:31:14CM: Thank you, Jason
1:31:14CM: Thank you, Jason