SlideShare a Scribd company logo
1 of 27
A step towards data orientation JOHAN TORP                                                                     <JOHAN.torp@DICE.SE> DICE CODERS DAY 3/11 2010
AI decision making - Pathfinding - Animation Look at actual code & patterns Questions AGENDA
IN an OO WORLD AI DECISION MAKING OO PATHFINDING NAVPOWER OO ANIMATION OO
DECISION TO MOVEMENT
DECISION TO MOVEMENT
DECISION TO MOVEMENT
DECISION TO MOVEMENT
DECISION TO MOVEMENT
Find path Load / unload nav mesh section Add / remove obstacles Path invalidation detection Can go-tests “Raycasts”, circle tests, triangle tests NAVPOWER OPERATIONS
Pathfinder - find path, path invalidation, circle tests, raycasts Random position generator - can go-tests Manager - load nav mesh, obstacles, destruction, updates Left some raycasts synchronous ABSTRACTIONS
interfacePathfinder { public: virtualPathHandle* findPath(constPathfindingPosition& start,  constPathfindingPosition& end, Optional<float> corridorRadius, PathHandle::StateListener* listener) = 0; /// More efficient version of findPath when start is the end of a previous path /// /// @pre lastPath->getState() == PathHandle::ValidPath virtualPathHandle* findPathFromDestination(PathHandle* lastPath,  constPathfindingPosition& end, Optional<float> corridorRadius, PathHandle::StateListener* listener) = 0; virtualvoidreleasePath(PathHandle* path) = 0; virtualboolcanGoStraight(Vec3Refstart, Vec3Refend, Vec3* collision = nullptr) const = 0; }; Pathfinder INTERFACE
PATH HANDLE typedeffixed_vector<Vec3, 16> WaypointVector; typedeffixed_vector<float, 16> WaypointRadiusVector; structPathHandle { enumState {ComputingPath, ValidPath, NoPathAvailable, RepathingRequired}; interface StateListener { virtualvoidonStateChanged(PathHandle* handle) = 0; 	}; PathHandle() : waypoints(pathfindingArena()), radii(pathfindingArena()) {} WaypointVectorwaypoints; WaypointRadiusVectorradii;  Statestate; };
PATH HANDLE typedefeastl::fixed_vector<Vec3, 16> WaypointVector; typedefeastl::fixed_vector<float, 16> WaypointRadiusVector; struct PathHandle { enum State {ComputingPath, ValidPath, NoPathAvailable, RepathingRequired}; interface StateListener { virtual void onStateChanged(PathHandle* handle) = 0; 	}; PathHandle() : waypoints(pathfindingArena()), radii(pathfindingArena()) {} 	WaypointVector waypoints; 	WaypointRadiusVector radii;  	State state; };
classNavPowerPathfinder : publicPathfinder { public:    virtualPathHandle* findPath(...) override;     virtualPathHandle* findPathFromDestination(...)override;     virtualvoidreleasePath(...) override;     virtualboolcanGoStraight(...) constoverride; voidupdatePaths();     voidnotifyPathListeners(); private: bfx::PolylinePathRCPtrm_paths[MaxPaths];    PathHandlem_pathHandles[MaxPaths]; PathHandle::StateListener* m_pathHandleListeners[MaxPaths];     u64m_usedPaths;     typedef eastl::fixed_vector<PathHandle*, MaxPaths, false> PathHandleVector;     PathHandleVectorm_updatedPaths, m_updatedValidPaths;    }; NAVPOWER PATHFINDER
typedef eastl::vector<CorridorNode> Corridor; ScratchPadArena scratch; Corridor corridor(scratch); corridor.resize(navPowerPath.size()); // Will allocate memory using the scratch pad CORRIDOR STEP Copy all new NavPower paths -> temporary representation Drop unnecessary points Corridor adjust paths who requested it Copy temporaries -> PathHandles
constCorridorHandleVector::iteratorallBegin = all.begin(), allEnd = all.end(); constCorridorHandlePtrVector::iteratoradjustBegin = adjust.begin(), adjustEnd = adjust.end(); for (CorridorHandleVector::iteratorit=allBegin; it!=allEnd; ++it) dropUnnecessaryPoints(it->corridor, scratchPad); for (CorridorHandlePtrVector::iteratorit=adjustBegin; it!=adjustEnd; ++it) shrinkEndPoints((**it).corridor, m_id); for (CorridorHandlePtrVector::iteratorit=adjustBegin; it!=adjustEnd; ++it) calculateCornerDisplacements((**it).corridor); for (CorridorHandlePtrVector::iteratorit=adjustBegin; it!=adjustEnd; ++it) displaceCorners((**it).corridor, m_id); for (CorridorHandlePtrVector::iteratorit=adjustBegin; it!=adjustEnd; ++it) shrinkSections((**it).corridor, m_id); for (CorridorHandleVector::iteratorit=allBegin; it!=allEnd; ++it) copyCorridorToHandle(it->corridor, *it->handle); } CORRIDOR STEP 2-4
NavPOWER MANAGEr voidNavPowerManager::update(floatframeTime)  {        m_streamingManager.update(); m_destructionManager.update(); m_obstacleManager.update(); bfx::SystemSimulate( frameTime); for (PathfinderVector::const_iteratorit=m_pathfinders.begin(), ...) 	(**it).updatePaths(); for (PathfinderVector::const_iteratorit=m_pathfinders.begin(), ...) 	(**it).notifyPathListeners(); for (PositionGeneratorVector::const_iteratorit=m_positionGenerators.begin(), end = ...) 	       (**it).update();	 }
Keep pathfinding code/data cache hot Avoid call sites cache running cold Easier to jobify / SPUify Easy to timeslice BATCHING BENEFITS
Manager  Random position generator  Pathfinder Asynchronous Collect destruction messages, process in batch Runs ~1/sec. Allows synchronous decisions Decision making assumes success
LESS SIMPLIFIED ARCHITECTURE SCRIPTING SERVER CLIENT AI DECISION MAKING PATH FOLLOWING PATHFINDING NAVPOWER LOCOMOTION LOCOMOTION DRIVING Waypoints Waypoint Data VEHICLE INPUT ANIMATION CorridorRadii
Each server tick 1. Each AI decision making 2. Pathfinding manager update 	All pathfinding requests 	All corridor adjustments 	All PathHandle notifications -> path following -> server locomotion 3. Network pulse. Server locomotion -> client locomotion 4. ...rest of tick My precious latency
Callbacks. Delay? Fire in batch? Handle+poll instead of callbacks. Poll in batch. Record messages, process all once a frame Check success / failure next frame Pre-calculate what you’re likely to need Con: Callstack won’t tell you everything.         ...but can we afford deep callstacks? Asynchronous EXAMPLES
RESOLVE EARLY voidBot::changeVehicle(constServerEntryComponent* entry) {   ... m_pathFollower= entry->owner()-> getFirstComponentOfType<ServerPathFollowingComponent>()->getPathFollower(); }
new / push_back() / insert() / resize()   Stop and think! Where is the memory allocated? Pre-allocated containers?  Scratch pad? Can I resize()/reserve() immediately? Can I use Optional<T> instead of ScopedPtr<T>? Can I use vectors instead of list / set / map? BE NICE TO YOUR MEMORY 
Let’s not abandon OO nor rewrite the world Start small, batch a bit, resolve inputs, avoid deep dives, grow from there Much easer to rewrite a system in a DO fashion afterwards Let’s START MOVING
AI decision making – pathfinding – animation Code: Handles, arena, scratch pad, fixed_vector, batch processing Latency analysis, asyncpatterns Thinkaboutdepth/width of calls, try staywithin your system, resolveearly, new/push_back() = think SUMMARY
johan.torp@dice.se QUESTIONS?

More Related Content

What's hot

Siggraph2016 - The Devil is in the Details: idTech 666
Siggraph2016 - The Devil is in the Details: idTech 666Siggraph2016 - The Devil is in the Details: idTech 666
Siggraph2016 - The Devil is in the Details: idTech 666Tiago Sousa
 
Volumetric Lighting for Many Lights in Lords of the Fallen
Volumetric Lighting for Many Lights in Lords of the FallenVolumetric Lighting for Many Lights in Lords of the Fallen
Volumetric Lighting for Many Lights in Lords of the FallenBenjamin Glatzel
 
The Rendering Technology of Killzone 2
The Rendering Technology of Killzone 2The Rendering Technology of Killzone 2
The Rendering Technology of Killzone 2Guerrilla
 
Triangle Visibility buffer
Triangle Visibility bufferTriangle Visibility buffer
Triangle Visibility bufferWolfgang Engel
 
Rendering Techniques in Rise of the Tomb Raider
Rendering Techniques in Rise of the Tomb RaiderRendering Techniques in Rise of the Tomb Raider
Rendering Techniques in Rise of the Tomb RaiderEidos-Montréal
 
Dissecting the Rendering of The Surge
Dissecting the Rendering of The SurgeDissecting the Rendering of The Surge
Dissecting the Rendering of The SurgePhilip Hammer
 
Masked Software Occlusion Culling
Masked Software Occlusion CullingMasked Software Occlusion Culling
Masked Software Occlusion CullingIntel® Software
 
G1 Garbage Collector: Details and Tuning
G1 Garbage Collector: Details and TuningG1 Garbage Collector: Details and Tuning
G1 Garbage Collector: Details and TuningSimone Bordet
 
Intrinsics: Low-level engine development with Burst - Unite Copenhagen 2019
Intrinsics: Low-level engine development with Burst - Unite Copenhagen 2019 Intrinsics: Low-level engine development with Burst - Unite Copenhagen 2019
Intrinsics: Low-level engine development with Burst - Unite Copenhagen 2019 Unity Technologies
 
The Guerrilla Guide to Game Code
The Guerrilla Guide to Game CodeThe Guerrilla Guide to Game Code
The Guerrilla Guide to Game CodeGuerrilla
 
Destruction Masking in Frostbite 2 using Volume Distance Fields
Destruction Masking in Frostbite 2 using Volume Distance FieldsDestruction Masking in Frostbite 2 using Volume Distance Fields
Destruction Masking in Frostbite 2 using Volume Distance FieldsElectronic Arts / DICE
 
Practical Occlusion Culling in Killzone 3
Practical Occlusion Culling in Killzone 3Practical Occlusion Culling in Killzone 3
Practical Occlusion Culling in Killzone 3Guerrilla
 
Terrain in Battlefield 3: A Modern, Complete and Scalable System
Terrain in Battlefield 3: A Modern, Complete and Scalable SystemTerrain in Battlefield 3: A Modern, Complete and Scalable System
Terrain in Battlefield 3: A Modern, Complete and Scalable SystemElectronic Arts / DICE
 
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)Johan Andersson
 
Moving Frostbite to Physically Based Rendering
Moving Frostbite to Physically Based RenderingMoving Frostbite to Physically Based Rendering
Moving Frostbite to Physically Based RenderingElectronic Arts / DICE
 

What's hot (20)

Siggraph2016 - The Devil is in the Details: idTech 666
Siggraph2016 - The Devil is in the Details: idTech 666Siggraph2016 - The Devil is in the Details: idTech 666
Siggraph2016 - The Devil is in the Details: idTech 666
 
Scope Stack Allocation
Scope Stack AllocationScope Stack Allocation
Scope Stack Allocation
 
Volumetric Lighting for Many Lights in Lords of the Fallen
Volumetric Lighting for Many Lights in Lords of the FallenVolumetric Lighting for Many Lights in Lords of the Fallen
Volumetric Lighting for Many Lights in Lords of the Fallen
 
The Rendering Technology of Killzone 2
The Rendering Technology of Killzone 2The Rendering Technology of Killzone 2
The Rendering Technology of Killzone 2
 
Triangle Visibility buffer
Triangle Visibility bufferTriangle Visibility buffer
Triangle Visibility buffer
 
Lighting the City of Glass
Lighting the City of GlassLighting the City of Glass
Lighting the City of Glass
 
Shiny PC Graphics in Battlefield 3
Shiny PC Graphics in Battlefield 3Shiny PC Graphics in Battlefield 3
Shiny PC Graphics in Battlefield 3
 
Rendering Techniques in Rise of the Tomb Raider
Rendering Techniques in Rise of the Tomb RaiderRendering Techniques in Rise of the Tomb Raider
Rendering Techniques in Rise of the Tomb Raider
 
Dissecting the Rendering of The Surge
Dissecting the Rendering of The SurgeDissecting the Rendering of The Surge
Dissecting the Rendering of The Surge
 
Masked Software Occlusion Culling
Masked Software Occlusion CullingMasked Software Occlusion Culling
Masked Software Occlusion Culling
 
G1 Garbage Collector: Details and Tuning
G1 Garbage Collector: Details and TuningG1 Garbage Collector: Details and Tuning
G1 Garbage Collector: Details and Tuning
 
Intrinsics: Low-level engine development with Burst - Unite Copenhagen 2019
Intrinsics: Low-level engine development with Burst - Unite Copenhagen 2019 Intrinsics: Low-level engine development with Burst - Unite Copenhagen 2019
Intrinsics: Low-level engine development with Burst - Unite Copenhagen 2019
 
Light prepass
Light prepassLight prepass
Light prepass
 
The Guerrilla Guide to Game Code
The Guerrilla Guide to Game CodeThe Guerrilla Guide to Game Code
The Guerrilla Guide to Game Code
 
Destruction Masking in Frostbite 2 using Volume Distance Fields
Destruction Masking in Frostbite 2 using Volume Distance FieldsDestruction Masking in Frostbite 2 using Volume Distance Fields
Destruction Masking in Frostbite 2 using Volume Distance Fields
 
Practical Occlusion Culling in Killzone 3
Practical Occlusion Culling in Killzone 3Practical Occlusion Culling in Killzone 3
Practical Occlusion Culling in Killzone 3
 
Terrain in Battlefield 3: A Modern, Complete and Scalable System
Terrain in Battlefield 3: A Modern, Complete and Scalable SystemTerrain in Battlefield 3: A Modern, Complete and Scalable System
Terrain in Battlefield 3: A Modern, Complete and Scalable System
 
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)
 
Moving Frostbite to Physically Based Rendering
Moving Frostbite to Physically Based RenderingMoving Frostbite to Physically Based Rendering
Moving Frostbite to Physically Based Rendering
 
Masked Occlusion Culling
Masked Occlusion CullingMasked Occlusion Culling
Masked Occlusion Culling
 

Viewers also liked

Battlelog - Building scalable web sites with tight game integration
Battlelog - Building scalable web sites with tight game integrationBattlelog - Building scalable web sites with tight game integration
Battlelog - Building scalable web sites with tight game integrationElectronic Arts / DICE
 
How data rules the world: Telemetry in Battlefield Heroes
How data rules the world: Telemetry in Battlefield HeroesHow data rules the world: Telemetry in Battlefield Heroes
How data rules the world: Telemetry in Battlefield HeroesElectronic Arts / DICE
 
Stylized Rendering in Battlefield Heroes
Stylized Rendering in Battlefield HeroesStylized Rendering in Battlefield Heroes
Stylized Rendering in Battlefield HeroesElectronic Arts / DICE
 
5 Major Challenges in Interactive Rendering
5 Major Challenges in Interactive Rendering5 Major Challenges in Interactive Rendering
5 Major Challenges in Interactive RenderingElectronic Arts / DICE
 
SPU-Based Deferred Shading in BATTLEFIELD 3 for Playstation 3
SPU-Based Deferred Shading in BATTLEFIELD 3 for Playstation 3SPU-Based Deferred Shading in BATTLEFIELD 3 for Playstation 3
SPU-Based Deferred Shading in BATTLEFIELD 3 for Playstation 3Electronic Arts / DICE
 
Shadows & Decals: D3D10 Techniques in Frostbite (GDC'09)
 	 Shadows & Decals: D3D10 Techniques in Frostbite (GDC'09) 	 Shadows & Decals: D3D10 Techniques in Frostbite (GDC'09)
Shadows & Decals: D3D10 Techniques in Frostbite (GDC'09)Johan Andersson
 
Building the Battlefield AI Experience
Building the Battlefield AI ExperienceBuilding the Battlefield AI Experience
Building the Battlefield AI ExperienceElectronic Arts / DICE
 
Stable SSAO in Battlefield 3 with Selective Temporal Filtering
Stable SSAO in Battlefield 3 with Selective Temporal FilteringStable SSAO in Battlefield 3 with Selective Temporal Filtering
Stable SSAO in Battlefield 3 with Selective Temporal FilteringElectronic Arts / DICE
 
Level Design Challenges & Solutions - Mirror's Edge
Level Design Challenges & Solutions - Mirror's EdgeLevel Design Challenges & Solutions - Mirror's Edge
Level Design Challenges & Solutions - Mirror's EdgeElectronic Arts / DICE
 
Future Directions for Compute-for-Graphics
Future Directions for Compute-for-GraphicsFuture Directions for Compute-for-Graphics
Future Directions for Compute-for-GraphicsElectronic Arts / DICE
 

Viewers also liked (12)

Battlelog - Building scalable web sites with tight game integration
Battlelog - Building scalable web sites with tight game integrationBattlelog - Building scalable web sites with tight game integration
Battlelog - Building scalable web sites with tight game integration
 
How data rules the world: Telemetry in Battlefield Heroes
How data rules the world: Telemetry in Battlefield HeroesHow data rules the world: Telemetry in Battlefield Heroes
How data rules the world: Telemetry in Battlefield Heroes
 
A Real-time Radiosity Architecture
A Real-time Radiosity ArchitectureA Real-time Radiosity Architecture
A Real-time Radiosity Architecture
 
Bending the Graphics Pipeline
Bending the Graphics PipelineBending the Graphics Pipeline
Bending the Graphics Pipeline
 
Stylized Rendering in Battlefield Heroes
Stylized Rendering in Battlefield HeroesStylized Rendering in Battlefield Heroes
Stylized Rendering in Battlefield Heroes
 
5 Major Challenges in Interactive Rendering
5 Major Challenges in Interactive Rendering5 Major Challenges in Interactive Rendering
5 Major Challenges in Interactive Rendering
 
SPU-Based Deferred Shading in BATTLEFIELD 3 for Playstation 3
SPU-Based Deferred Shading in BATTLEFIELD 3 for Playstation 3SPU-Based Deferred Shading in BATTLEFIELD 3 for Playstation 3
SPU-Based Deferred Shading in BATTLEFIELD 3 for Playstation 3
 
Shadows & Decals: D3D10 Techniques in Frostbite (GDC'09)
 	 Shadows & Decals: D3D10 Techniques in Frostbite (GDC'09) 	 Shadows & Decals: D3D10 Techniques in Frostbite (GDC'09)
Shadows & Decals: D3D10 Techniques in Frostbite (GDC'09)
 
Building the Battlefield AI Experience
Building the Battlefield AI ExperienceBuilding the Battlefield AI Experience
Building the Battlefield AI Experience
 
Stable SSAO in Battlefield 3 with Selective Temporal Filtering
Stable SSAO in Battlefield 3 with Selective Temporal FilteringStable SSAO in Battlefield 3 with Selective Temporal Filtering
Stable SSAO in Battlefield 3 with Selective Temporal Filtering
 
Level Design Challenges & Solutions - Mirror's Edge
Level Design Challenges & Solutions - Mirror's EdgeLevel Design Challenges & Solutions - Mirror's Edge
Level Design Challenges & Solutions - Mirror's Edge
 
Future Directions for Compute-for-Graphics
Future Directions for Compute-for-GraphicsFuture Directions for Compute-for-Graphics
Future Directions for Compute-for-Graphics
 

Similar to A Step Towards Data Orientation

Codepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash course
Codepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash courseCodepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash course
Codepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash courseSages
 
[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기NAVER D2
 
Cassandra 2.1 boot camp, Overview
Cassandra 2.1 boot camp, OverviewCassandra 2.1 boot camp, Overview
Cassandra 2.1 boot camp, OverviewJoshua McKenzie
 
Presto anatomy
Presto anatomyPresto anatomy
Presto anatomyDongmin Yu
 
Skydive, real-time network analyzer, container integration
Skydive, real-time network analyzer, container integrationSkydive, real-time network analyzer, container integration
Skydive, real-time network analyzer, container integrationSylvain Afchain
 
How to Leverage Go for Your Networking Needs
How to Leverage Go for Your Networking NeedsHow to Leverage Go for Your Networking Needs
How to Leverage Go for Your Networking NeedsDigitalOcean
 
Wprowadzenie do technologi Big Data i Apache Hadoop
Wprowadzenie do technologi Big Data i Apache HadoopWprowadzenie do technologi Big Data i Apache Hadoop
Wprowadzenie do technologi Big Data i Apache HadoopSages
 
Server side JavaScript: going all the way
Server side JavaScript: going all the wayServer side JavaScript: going all the way
Server side JavaScript: going all the wayOleg Podsechin
 
Intravert Server side processing for Cassandra
Intravert Server side processing for CassandraIntravert Server side processing for Cassandra
Intravert Server side processing for CassandraEdward Capriolo
 
NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"
NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"
NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"DataStax Academy
 
RailswayCon 2010 - Dynamic Language VMs
RailswayCon 2010 - Dynamic Language VMsRailswayCon 2010 - Dynamic Language VMs
RailswayCon 2010 - Dynamic Language VMsLourens Naudé
 
How to Hack a Road Trip with a Webcam, a GSP and Some Fun with Node
How to Hack a Road Trip  with a Webcam, a GSP and Some Fun with NodeHow to Hack a Road Trip  with a Webcam, a GSP and Some Fun with Node
How to Hack a Road Trip with a Webcam, a GSP and Some Fun with Nodepdeschen
 
RxJS Operators - Real World Use Cases (FULL VERSION)
RxJS Operators - Real World Use Cases (FULL VERSION)RxJS Operators - Real World Use Cases (FULL VERSION)
RxJS Operators - Real World Use Cases (FULL VERSION)Tracy Lee
 
От Java Threads к лямбдам, Андрей Родионов
От Java Threads к лямбдам, Андрей РодионовОт Java Threads к лямбдам, Андрей Родионов
От Java Threads к лямбдам, Андрей РодионовYandex
 
The Road To Reactive with RxJava JEEConf 2016
The Road To Reactive with RxJava JEEConf 2016The Road To Reactive with RxJava JEEConf 2016
The Road To Reactive with RxJava JEEConf 2016Frank Lyaruu
 
Riak at The NYC Cloud Computing Meetup Group
Riak at The NYC Cloud Computing Meetup GroupRiak at The NYC Cloud Computing Meetup Group
Riak at The NYC Cloud Computing Meetup Groupsiculars
 

Similar to A Step Towards Data Orientation (20)

Codepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash course
Codepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash courseCodepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash course
Codepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash course
 
[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기
 
JS everywhere 2011
JS everywhere 2011JS everywhere 2011
JS everywhere 2011
 
Cassandra 2.1 boot camp, Overview
Cassandra 2.1 boot camp, OverviewCassandra 2.1 boot camp, Overview
Cassandra 2.1 boot camp, Overview
 
Presto anatomy
Presto anatomyPresto anatomy
Presto anatomy
 
Skydive, real-time network analyzer, container integration
Skydive, real-time network analyzer, container integrationSkydive, real-time network analyzer, container integration
Skydive, real-time network analyzer, container integration
 
Skydive 5/07/2016
Skydive 5/07/2016Skydive 5/07/2016
Skydive 5/07/2016
 
How to Leverage Go for Your Networking Needs
How to Leverage Go for Your Networking NeedsHow to Leverage Go for Your Networking Needs
How to Leverage Go for Your Networking Needs
 
Wprowadzenie do technologi Big Data i Apache Hadoop
Wprowadzenie do technologi Big Data i Apache HadoopWprowadzenie do technologi Big Data i Apache Hadoop
Wprowadzenie do technologi Big Data i Apache Hadoop
 
Server side JavaScript: going all the way
Server side JavaScript: going all the wayServer side JavaScript: going all the way
Server side JavaScript: going all the way
 
Loom and concurrency latest
Loom and concurrency latestLoom and concurrency latest
Loom and concurrency latest
 
Intravert Server side processing for Cassandra
Intravert Server side processing for CassandraIntravert Server side processing for Cassandra
Intravert Server side processing for Cassandra
 
NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"
NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"
NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"
 
RailswayCon 2010 - Dynamic Language VMs
RailswayCon 2010 - Dynamic Language VMsRailswayCon 2010 - Dynamic Language VMs
RailswayCon 2010 - Dynamic Language VMs
 
Akka http 2
Akka http 2Akka http 2
Akka http 2
 
How to Hack a Road Trip with a Webcam, a GSP and Some Fun with Node
How to Hack a Road Trip  with a Webcam, a GSP and Some Fun with NodeHow to Hack a Road Trip  with a Webcam, a GSP and Some Fun with Node
How to Hack a Road Trip with a Webcam, a GSP and Some Fun with Node
 
RxJS Operators - Real World Use Cases (FULL VERSION)
RxJS Operators - Real World Use Cases (FULL VERSION)RxJS Operators - Real World Use Cases (FULL VERSION)
RxJS Operators - Real World Use Cases (FULL VERSION)
 
От Java Threads к лямбдам, Андрей Родионов
От Java Threads к лямбдам, Андрей РодионовОт Java Threads к лямбдам, Андрей Родионов
От Java Threads к лямбдам, Андрей Родионов
 
The Road To Reactive with RxJava JEEConf 2016
The Road To Reactive with RxJava JEEConf 2016The Road To Reactive with RxJava JEEConf 2016
The Road To Reactive with RxJava JEEConf 2016
 
Riak at The NYC Cloud Computing Meetup Group
Riak at The NYC Cloud Computing Meetup GroupRiak at The NYC Cloud Computing Meetup Group
Riak at The NYC Cloud Computing Meetup Group
 

More from Electronic Arts / DICE

GDC2019 - SEED - Towards Deep Generative Models in Game Development
GDC2019 - SEED - Towards Deep Generative Models in Game DevelopmentGDC2019 - SEED - Towards Deep Generative Models in Game Development
GDC2019 - SEED - Towards Deep Generative Models in Game DevelopmentElectronic Arts / DICE
 
SIGGRAPH 2010 - Style and Gameplay in the Mirror's Edge
SIGGRAPH 2010 - Style and Gameplay in the Mirror's EdgeSIGGRAPH 2010 - Style and Gameplay in the Mirror's Edge
SIGGRAPH 2010 - Style and Gameplay in the Mirror's EdgeElectronic Arts / DICE
 
Syysgraph 2018 - Modern Graphics Abstractions & Real-Time Ray Tracing
Syysgraph 2018 - Modern Graphics Abstractions & Real-Time Ray TracingSyysgraph 2018 - Modern Graphics Abstractions & Real-Time Ray Tracing
Syysgraph 2018 - Modern Graphics Abstractions & Real-Time Ray TracingElectronic Arts / DICE
 
Khronos Munich 2018 - Halcyon and Vulkan
Khronos Munich 2018 - Halcyon and VulkanKhronos Munich 2018 - Halcyon and Vulkan
Khronos Munich 2018 - Halcyon and VulkanElectronic Arts / DICE
 
CEDEC 2018 - Towards Effortless Photorealism Through Real-Time Raytracing
CEDEC 2018 - Towards Effortless Photorealism Through Real-Time RaytracingCEDEC 2018 - Towards Effortless Photorealism Through Real-Time Raytracing
CEDEC 2018 - Towards Effortless Photorealism Through Real-Time RaytracingElectronic Arts / DICE
 
CEDEC 2018 - Functional Symbiosis of Art Direction and Proceduralism
CEDEC 2018 - Functional Symbiosis of Art Direction and ProceduralismCEDEC 2018 - Functional Symbiosis of Art Direction and Proceduralism
CEDEC 2018 - Functional Symbiosis of Art Direction and ProceduralismElectronic Arts / DICE
 
SIGGRAPH 2018 - PICA PICA and NVIDIA Turing
SIGGRAPH 2018 - PICA PICA and NVIDIA TuringSIGGRAPH 2018 - PICA PICA and NVIDIA Turing
SIGGRAPH 2018 - PICA PICA and NVIDIA TuringElectronic Arts / DICE
 
SIGGRAPH 2018 - Full Rays Ahead! From Raster to Real-Time Raytracing
SIGGRAPH 2018 - Full Rays Ahead! From Raster to Real-Time RaytracingSIGGRAPH 2018 - Full Rays Ahead! From Raster to Real-Time Raytracing
SIGGRAPH 2018 - Full Rays Ahead! From Raster to Real-Time RaytracingElectronic Arts / DICE
 
HPG 2018 - Game Ray Tracing: State-of-the-Art and Open Problems
HPG 2018 - Game Ray Tracing: State-of-the-Art and Open ProblemsHPG 2018 - Game Ray Tracing: State-of-the-Art and Open Problems
HPG 2018 - Game Ray Tracing: State-of-the-Art and Open ProblemsElectronic Arts / DICE
 
EPC 2018 - SEED - Exploring The Collaboration Between Proceduralism & Deep Le...
EPC 2018 - SEED - Exploring The Collaboration Between Proceduralism & Deep Le...EPC 2018 - SEED - Exploring The Collaboration Between Proceduralism & Deep Le...
EPC 2018 - SEED - Exploring The Collaboration Between Proceduralism & Deep Le...Electronic Arts / DICE
 
DD18 - SEED - Raytracing in Hybrid Real-Time Rendering
DD18 - SEED - Raytracing in Hybrid Real-Time RenderingDD18 - SEED - Raytracing in Hybrid Real-Time Rendering
DD18 - SEED - Raytracing in Hybrid Real-Time RenderingElectronic Arts / DICE
 
Creativity of Rules and Patterns: Designing Procedural Systems
Creativity of Rules and Patterns: Designing Procedural SystemsCreativity of Rules and Patterns: Designing Procedural Systems
Creativity of Rules and Patterns: Designing Procedural SystemsElectronic Arts / DICE
 
Shiny Pixels and Beyond: Real-Time Raytracing at SEED
Shiny Pixels and Beyond: Real-Time Raytracing at SEEDShiny Pixels and Beyond: Real-Time Raytracing at SEED
Shiny Pixels and Beyond: Real-Time Raytracing at SEEDElectronic Arts / DICE
 
A Certain Slant of Light - Past, Present and Future Challenges of Global Illu...
A Certain Slant of Light - Past, Present and Future Challenges of Global Illu...A Certain Slant of Light - Past, Present and Future Challenges of Global Illu...
A Certain Slant of Light - Past, Present and Future Challenges of Global Illu...Electronic Arts / DICE
 
Physically Based Sky, Atmosphere and Cloud Rendering in Frostbite
Physically Based Sky, Atmosphere and Cloud Rendering in FrostbitePhysically Based Sky, Atmosphere and Cloud Rendering in Frostbite
Physically Based Sky, Atmosphere and Cloud Rendering in FrostbiteElectronic Arts / DICE
 
High Dynamic Range color grading and display in Frostbite
High Dynamic Range color grading and display in FrostbiteHigh Dynamic Range color grading and display in Frostbite
High Dynamic Range color grading and display in FrostbiteElectronic Arts / DICE
 
4K Checkerboard in Battlefield 1 and Mass Effect Andromeda
4K Checkerboard in Battlefield 1 and Mass Effect Andromeda4K Checkerboard in Battlefield 1 and Mass Effect Andromeda
4K Checkerboard in Battlefield 1 and Mass Effect AndromedaElectronic Arts / DICE
 
FrameGraph: Extensible Rendering Architecture in Frostbite
FrameGraph: Extensible Rendering Architecture in FrostbiteFrameGraph: Extensible Rendering Architecture in Frostbite
FrameGraph: Extensible Rendering Architecture in FrostbiteElectronic Arts / DICE
 
Photogrammetry and Star Wars Battlefront
Photogrammetry and Star Wars BattlefrontPhotogrammetry and Star Wars Battlefront
Photogrammetry and Star Wars BattlefrontElectronic Arts / DICE
 

More from Electronic Arts / DICE (20)

GDC2019 - SEED - Towards Deep Generative Models in Game Development
GDC2019 - SEED - Towards Deep Generative Models in Game DevelopmentGDC2019 - SEED - Towards Deep Generative Models in Game Development
GDC2019 - SEED - Towards Deep Generative Models in Game Development
 
SIGGRAPH 2010 - Style and Gameplay in the Mirror's Edge
SIGGRAPH 2010 - Style and Gameplay in the Mirror's EdgeSIGGRAPH 2010 - Style and Gameplay in the Mirror's Edge
SIGGRAPH 2010 - Style and Gameplay in the Mirror's Edge
 
SEED - Halcyon Architecture
SEED - Halcyon ArchitectureSEED - Halcyon Architecture
SEED - Halcyon Architecture
 
Syysgraph 2018 - Modern Graphics Abstractions & Real-Time Ray Tracing
Syysgraph 2018 - Modern Graphics Abstractions & Real-Time Ray TracingSyysgraph 2018 - Modern Graphics Abstractions & Real-Time Ray Tracing
Syysgraph 2018 - Modern Graphics Abstractions & Real-Time Ray Tracing
 
Khronos Munich 2018 - Halcyon and Vulkan
Khronos Munich 2018 - Halcyon and VulkanKhronos Munich 2018 - Halcyon and Vulkan
Khronos Munich 2018 - Halcyon and Vulkan
 
CEDEC 2018 - Towards Effortless Photorealism Through Real-Time Raytracing
CEDEC 2018 - Towards Effortless Photorealism Through Real-Time RaytracingCEDEC 2018 - Towards Effortless Photorealism Through Real-Time Raytracing
CEDEC 2018 - Towards Effortless Photorealism Through Real-Time Raytracing
 
CEDEC 2018 - Functional Symbiosis of Art Direction and Proceduralism
CEDEC 2018 - Functional Symbiosis of Art Direction and ProceduralismCEDEC 2018 - Functional Symbiosis of Art Direction and Proceduralism
CEDEC 2018 - Functional Symbiosis of Art Direction and Proceduralism
 
SIGGRAPH 2018 - PICA PICA and NVIDIA Turing
SIGGRAPH 2018 - PICA PICA and NVIDIA TuringSIGGRAPH 2018 - PICA PICA and NVIDIA Turing
SIGGRAPH 2018 - PICA PICA and NVIDIA Turing
 
SIGGRAPH 2018 - Full Rays Ahead! From Raster to Real-Time Raytracing
SIGGRAPH 2018 - Full Rays Ahead! From Raster to Real-Time RaytracingSIGGRAPH 2018 - Full Rays Ahead! From Raster to Real-Time Raytracing
SIGGRAPH 2018 - Full Rays Ahead! From Raster to Real-Time Raytracing
 
HPG 2018 - Game Ray Tracing: State-of-the-Art and Open Problems
HPG 2018 - Game Ray Tracing: State-of-the-Art and Open ProblemsHPG 2018 - Game Ray Tracing: State-of-the-Art and Open Problems
HPG 2018 - Game Ray Tracing: State-of-the-Art and Open Problems
 
EPC 2018 - SEED - Exploring The Collaboration Between Proceduralism & Deep Le...
EPC 2018 - SEED - Exploring The Collaboration Between Proceduralism & Deep Le...EPC 2018 - SEED - Exploring The Collaboration Between Proceduralism & Deep Le...
EPC 2018 - SEED - Exploring The Collaboration Between Proceduralism & Deep Le...
 
DD18 - SEED - Raytracing in Hybrid Real-Time Rendering
DD18 - SEED - Raytracing in Hybrid Real-Time RenderingDD18 - SEED - Raytracing in Hybrid Real-Time Rendering
DD18 - SEED - Raytracing in Hybrid Real-Time Rendering
 
Creativity of Rules and Patterns: Designing Procedural Systems
Creativity of Rules and Patterns: Designing Procedural SystemsCreativity of Rules and Patterns: Designing Procedural Systems
Creativity of Rules and Patterns: Designing Procedural Systems
 
Shiny Pixels and Beyond: Real-Time Raytracing at SEED
Shiny Pixels and Beyond: Real-Time Raytracing at SEEDShiny Pixels and Beyond: Real-Time Raytracing at SEED
Shiny Pixels and Beyond: Real-Time Raytracing at SEED
 
A Certain Slant of Light - Past, Present and Future Challenges of Global Illu...
A Certain Slant of Light - Past, Present and Future Challenges of Global Illu...A Certain Slant of Light - Past, Present and Future Challenges of Global Illu...
A Certain Slant of Light - Past, Present and Future Challenges of Global Illu...
 
Physically Based Sky, Atmosphere and Cloud Rendering in Frostbite
Physically Based Sky, Atmosphere and Cloud Rendering in FrostbitePhysically Based Sky, Atmosphere and Cloud Rendering in Frostbite
Physically Based Sky, Atmosphere and Cloud Rendering in Frostbite
 
High Dynamic Range color grading and display in Frostbite
High Dynamic Range color grading and display in FrostbiteHigh Dynamic Range color grading and display in Frostbite
High Dynamic Range color grading and display in Frostbite
 
4K Checkerboard in Battlefield 1 and Mass Effect Andromeda
4K Checkerboard in Battlefield 1 and Mass Effect Andromeda4K Checkerboard in Battlefield 1 and Mass Effect Andromeda
4K Checkerboard in Battlefield 1 and Mass Effect Andromeda
 
FrameGraph: Extensible Rendering Architecture in Frostbite
FrameGraph: Extensible Rendering Architecture in FrostbiteFrameGraph: Extensible Rendering Architecture in Frostbite
FrameGraph: Extensible Rendering Architecture in Frostbite
 
Photogrammetry and Star Wars Battlefront
Photogrammetry and Star Wars BattlefrontPhotogrammetry and Star Wars Battlefront
Photogrammetry and Star Wars Battlefront
 

Recently uploaded

定制(UofT毕业证书)加拿大多伦多大学毕业证成绩单原版一比一
定制(UofT毕业证书)加拿大多伦多大学毕业证成绩单原版一比一定制(UofT毕业证书)加拿大多伦多大学毕业证成绩单原版一比一
定制(UofT毕业证书)加拿大多伦多大学毕业证成绩单原版一比一lvtagr7
 
Gripping Adult Web Series You Can't Afford to Miss
Gripping Adult Web Series You Can't Afford to MissGripping Adult Web Series You Can't Afford to Miss
Gripping Adult Web Series You Can't Afford to Missget joys
 
(伦敦大学毕业证学位证成绩单-PDF版)
(伦敦大学毕业证学位证成绩单-PDF版)(伦敦大学毕业证学位证成绩单-PDF版)
(伦敦大学毕业证学位证成绩单-PDF版)twfkn8xj
 
Call Girls Ellis Bridge 7397865700 Independent Call Girls
Call Girls Ellis Bridge 7397865700 Independent Call GirlsCall Girls Ellis Bridge 7397865700 Independent Call Girls
Call Girls Ellis Bridge 7397865700 Independent Call Girlsssuser7cb4ff
 
Call Girls CG Road 7397865700 Independent Call Girls
Call Girls CG Road 7397865700  Independent Call GirlsCall Girls CG Road 7397865700  Independent Call Girls
Call Girls CG Road 7397865700 Independent Call Girlsssuser7cb4ff
 
Call US '' 8377087607'' !! Call Girls In Model Town Metro (Delhi NCR)
Call US '' 8377087607'' !! Call Girls In Model Town Metro (Delhi NCR)Call US '' 8377087607'' !! Call Girls In Model Town Metro (Delhi NCR)
Call US '' 8377087607'' !! Call Girls In Model Town Metro (Delhi NCR)dollysharma2066
 
Amil Baba in Pakistan Kala jadu Expert Amil baba Black magic Specialist in Is...
Amil Baba in Pakistan Kala jadu Expert Amil baba Black magic Specialist in Is...Amil Baba in Pakistan Kala jadu Expert Amil baba Black magic Specialist in Is...
Amil Baba in Pakistan Kala jadu Expert Amil baba Black magic Specialist in Is...Amil Baba Company
 
Call Girl Contact Number Andheri WhatsApp:+91-9833363713
Call Girl Contact Number Andheri WhatsApp:+91-9833363713Call Girl Contact Number Andheri WhatsApp:+91-9833363713
Call Girl Contact Number Andheri WhatsApp:+91-9833363713Sonam Pathan
 
NO1 WorldWide Amil baba in pakistan Amil Baba in Karachi Black Magic Islamaba...
NO1 WorldWide Amil baba in pakistan Amil Baba in Karachi Black Magic Islamaba...NO1 WorldWide Amil baba in pakistan Amil Baba in Karachi Black Magic Islamaba...
NO1 WorldWide Amil baba in pakistan Amil Baba in Karachi Black Magic Islamaba...Amil baba
 
Kolkata Call Girls Service +918240919228 - Kolkatanightgirls.com
Kolkata Call Girls Service +918240919228 - Kolkatanightgirls.comKolkata Call Girls Service +918240919228 - Kolkatanightgirls.com
Kolkata Call Girls Service +918240919228 - Kolkatanightgirls.comKolkata Call Girls
 
The Fine Line Between Honest and Evil Comics by Salty Vixen
The Fine Line Between Honest and Evil Comics by Salty VixenThe Fine Line Between Honest and Evil Comics by Salty Vixen
The Fine Line Between Honest and Evil Comics by Salty VixenSalty Vixen Stories & More
 
Authentic No 1 Amil Baba In Pakistan Authentic No 1 Amil Baba In Karachi No 1...
Authentic No 1 Amil Baba In Pakistan Authentic No 1 Amil Baba In Karachi No 1...Authentic No 1 Amil Baba In Pakistan Authentic No 1 Amil Baba In Karachi No 1...
Authentic No 1 Amil Baba In Pakistan Authentic No 1 Amil Baba In Karachi No 1...First NO1 World Amil baba in Faisalabad
 
Call Girls Somajiguda Sarani 7001305949 all area service COD available Any Time
Call Girls Somajiguda Sarani 7001305949 all area service COD available Any TimeCall Girls Somajiguda Sarani 7001305949 all area service COD available Any Time
Call Girls Somajiguda Sarani 7001305949 all area service COD available Any Timedelhimodelshub1
 
Call Girls Near Taurus Sarovar Portico Hotel New Delhi 9873777170
Call Girls Near Taurus Sarovar Portico Hotel New Delhi 9873777170Call Girls Near Taurus Sarovar Portico Hotel New Delhi 9873777170
Call Girls Near Taurus Sarovar Portico Hotel New Delhi 9873777170Sonam Pathan
 
1681275559_haunting-adeline and hunting.pdf
1681275559_haunting-adeline and hunting.pdf1681275559_haunting-adeline and hunting.pdf
1681275559_haunting-adeline and hunting.pdfTanjirokamado769606
 
Call Girls in Faridabad 9000000000 Faridabad Escorts Service
Call Girls in Faridabad 9000000000 Faridabad Escorts ServiceCall Girls in Faridabad 9000000000 Faridabad Escorts Service
Call Girls in Faridabad 9000000000 Faridabad Escorts ServiceTina Ji
 
Call Girls Near Delhi Pride Hotel New Delhi 9873777170
Call Girls Near Delhi Pride Hotel New Delhi 9873777170Call Girls Near Delhi Pride Hotel New Delhi 9873777170
Call Girls Near Delhi Pride Hotel New Delhi 9873777170Sonam Pathan
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377087607
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377087607FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377087607
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377087607dollysharma2066
 
8377087607 Full Enjoy @24/7 Call Girls in Patel Nagar Delhi NCR
8377087607 Full Enjoy @24/7 Call Girls in Patel Nagar Delhi NCR8377087607 Full Enjoy @24/7 Call Girls in Patel Nagar Delhi NCR
8377087607 Full Enjoy @24/7 Call Girls in Patel Nagar Delhi NCRdollysharma2066
 
Call Girls Chorasi 7397865700 Ridhima Hire Me Full Night
Call Girls Chorasi 7397865700 Ridhima Hire Me Full NightCall Girls Chorasi 7397865700 Ridhima Hire Me Full Night
Call Girls Chorasi 7397865700 Ridhima Hire Me Full Nightssuser7cb4ff
 

Recently uploaded (20)

定制(UofT毕业证书)加拿大多伦多大学毕业证成绩单原版一比一
定制(UofT毕业证书)加拿大多伦多大学毕业证成绩单原版一比一定制(UofT毕业证书)加拿大多伦多大学毕业证成绩单原版一比一
定制(UofT毕业证书)加拿大多伦多大学毕业证成绩单原版一比一
 
Gripping Adult Web Series You Can't Afford to Miss
Gripping Adult Web Series You Can't Afford to MissGripping Adult Web Series You Can't Afford to Miss
Gripping Adult Web Series You Can't Afford to Miss
 
(伦敦大学毕业证学位证成绩单-PDF版)
(伦敦大学毕业证学位证成绩单-PDF版)(伦敦大学毕业证学位证成绩单-PDF版)
(伦敦大学毕业证学位证成绩单-PDF版)
 
Call Girls Ellis Bridge 7397865700 Independent Call Girls
Call Girls Ellis Bridge 7397865700 Independent Call GirlsCall Girls Ellis Bridge 7397865700 Independent Call Girls
Call Girls Ellis Bridge 7397865700 Independent Call Girls
 
Call Girls CG Road 7397865700 Independent Call Girls
Call Girls CG Road 7397865700  Independent Call GirlsCall Girls CG Road 7397865700  Independent Call Girls
Call Girls CG Road 7397865700 Independent Call Girls
 
Call US '' 8377087607'' !! Call Girls In Model Town Metro (Delhi NCR)
Call US '' 8377087607'' !! Call Girls In Model Town Metro (Delhi NCR)Call US '' 8377087607'' !! Call Girls In Model Town Metro (Delhi NCR)
Call US '' 8377087607'' !! Call Girls In Model Town Metro (Delhi NCR)
 
Amil Baba in Pakistan Kala jadu Expert Amil baba Black magic Specialist in Is...
Amil Baba in Pakistan Kala jadu Expert Amil baba Black magic Specialist in Is...Amil Baba in Pakistan Kala jadu Expert Amil baba Black magic Specialist in Is...
Amil Baba in Pakistan Kala jadu Expert Amil baba Black magic Specialist in Is...
 
Call Girl Contact Number Andheri WhatsApp:+91-9833363713
Call Girl Contact Number Andheri WhatsApp:+91-9833363713Call Girl Contact Number Andheri WhatsApp:+91-9833363713
Call Girl Contact Number Andheri WhatsApp:+91-9833363713
 
NO1 WorldWide Amil baba in pakistan Amil Baba in Karachi Black Magic Islamaba...
NO1 WorldWide Amil baba in pakistan Amil Baba in Karachi Black Magic Islamaba...NO1 WorldWide Amil baba in pakistan Amil Baba in Karachi Black Magic Islamaba...
NO1 WorldWide Amil baba in pakistan Amil Baba in Karachi Black Magic Islamaba...
 
Kolkata Call Girls Service +918240919228 - Kolkatanightgirls.com
Kolkata Call Girls Service +918240919228 - Kolkatanightgirls.comKolkata Call Girls Service +918240919228 - Kolkatanightgirls.com
Kolkata Call Girls Service +918240919228 - Kolkatanightgirls.com
 
The Fine Line Between Honest and Evil Comics by Salty Vixen
The Fine Line Between Honest and Evil Comics by Salty VixenThe Fine Line Between Honest and Evil Comics by Salty Vixen
The Fine Line Between Honest and Evil Comics by Salty Vixen
 
Authentic No 1 Amil Baba In Pakistan Authentic No 1 Amil Baba In Karachi No 1...
Authentic No 1 Amil Baba In Pakistan Authentic No 1 Amil Baba In Karachi No 1...Authentic No 1 Amil Baba In Pakistan Authentic No 1 Amil Baba In Karachi No 1...
Authentic No 1 Amil Baba In Pakistan Authentic No 1 Amil Baba In Karachi No 1...
 
Call Girls Somajiguda Sarani 7001305949 all area service COD available Any Time
Call Girls Somajiguda Sarani 7001305949 all area service COD available Any TimeCall Girls Somajiguda Sarani 7001305949 all area service COD available Any Time
Call Girls Somajiguda Sarani 7001305949 all area service COD available Any Time
 
Call Girls Near Taurus Sarovar Portico Hotel New Delhi 9873777170
Call Girls Near Taurus Sarovar Portico Hotel New Delhi 9873777170Call Girls Near Taurus Sarovar Portico Hotel New Delhi 9873777170
Call Girls Near Taurus Sarovar Portico Hotel New Delhi 9873777170
 
1681275559_haunting-adeline and hunting.pdf
1681275559_haunting-adeline and hunting.pdf1681275559_haunting-adeline and hunting.pdf
1681275559_haunting-adeline and hunting.pdf
 
Call Girls in Faridabad 9000000000 Faridabad Escorts Service
Call Girls in Faridabad 9000000000 Faridabad Escorts ServiceCall Girls in Faridabad 9000000000 Faridabad Escorts Service
Call Girls in Faridabad 9000000000 Faridabad Escorts Service
 
Call Girls Near Delhi Pride Hotel New Delhi 9873777170
Call Girls Near Delhi Pride Hotel New Delhi 9873777170Call Girls Near Delhi Pride Hotel New Delhi 9873777170
Call Girls Near Delhi Pride Hotel New Delhi 9873777170
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377087607
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377087607FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377087607
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377087607
 
8377087607 Full Enjoy @24/7 Call Girls in Patel Nagar Delhi NCR
8377087607 Full Enjoy @24/7 Call Girls in Patel Nagar Delhi NCR8377087607 Full Enjoy @24/7 Call Girls in Patel Nagar Delhi NCR
8377087607 Full Enjoy @24/7 Call Girls in Patel Nagar Delhi NCR
 
Call Girls Chorasi 7397865700 Ridhima Hire Me Full Night
Call Girls Chorasi 7397865700 Ridhima Hire Me Full NightCall Girls Chorasi 7397865700 Ridhima Hire Me Full Night
Call Girls Chorasi 7397865700 Ridhima Hire Me Full Night
 

A Step Towards Data Orientation

  • 1. A step towards data orientation JOHAN TORP <JOHAN.torp@DICE.SE> DICE CODERS DAY 3/11 2010
  • 2. AI decision making - Pathfinding - Animation Look at actual code & patterns Questions AGENDA
  • 3. IN an OO WORLD AI DECISION MAKING OO PATHFINDING NAVPOWER OO ANIMATION OO
  • 9. Find path Load / unload nav mesh section Add / remove obstacles Path invalidation detection Can go-tests “Raycasts”, circle tests, triangle tests NAVPOWER OPERATIONS
  • 10. Pathfinder - find path, path invalidation, circle tests, raycasts Random position generator - can go-tests Manager - load nav mesh, obstacles, destruction, updates Left some raycasts synchronous ABSTRACTIONS
  • 11. interfacePathfinder { public: virtualPathHandle* findPath(constPathfindingPosition& start, constPathfindingPosition& end, Optional<float> corridorRadius, PathHandle::StateListener* listener) = 0; /// More efficient version of findPath when start is the end of a previous path /// /// @pre lastPath->getState() == PathHandle::ValidPath virtualPathHandle* findPathFromDestination(PathHandle* lastPath, constPathfindingPosition& end, Optional<float> corridorRadius, PathHandle::StateListener* listener) = 0; virtualvoidreleasePath(PathHandle* path) = 0; virtualboolcanGoStraight(Vec3Refstart, Vec3Refend, Vec3* collision = nullptr) const = 0; }; Pathfinder INTERFACE
  • 12. PATH HANDLE typedeffixed_vector<Vec3, 16> WaypointVector; typedeffixed_vector<float, 16> WaypointRadiusVector; structPathHandle { enumState {ComputingPath, ValidPath, NoPathAvailable, RepathingRequired}; interface StateListener { virtualvoidonStateChanged(PathHandle* handle) = 0; }; PathHandle() : waypoints(pathfindingArena()), radii(pathfindingArena()) {} WaypointVectorwaypoints; WaypointRadiusVectorradii; Statestate; };
  • 13. PATH HANDLE typedefeastl::fixed_vector<Vec3, 16> WaypointVector; typedefeastl::fixed_vector<float, 16> WaypointRadiusVector; struct PathHandle { enum State {ComputingPath, ValidPath, NoPathAvailable, RepathingRequired}; interface StateListener { virtual void onStateChanged(PathHandle* handle) = 0; }; PathHandle() : waypoints(pathfindingArena()), radii(pathfindingArena()) {} WaypointVector waypoints; WaypointRadiusVector radii; State state; };
  • 14. classNavPowerPathfinder : publicPathfinder { public: virtualPathHandle* findPath(...) override; virtualPathHandle* findPathFromDestination(...)override; virtualvoidreleasePath(...) override; virtualboolcanGoStraight(...) constoverride; voidupdatePaths(); voidnotifyPathListeners(); private: bfx::PolylinePathRCPtrm_paths[MaxPaths]; PathHandlem_pathHandles[MaxPaths]; PathHandle::StateListener* m_pathHandleListeners[MaxPaths]; u64m_usedPaths; typedef eastl::fixed_vector<PathHandle*, MaxPaths, false> PathHandleVector; PathHandleVectorm_updatedPaths, m_updatedValidPaths; }; NAVPOWER PATHFINDER
  • 15. typedef eastl::vector<CorridorNode> Corridor; ScratchPadArena scratch; Corridor corridor(scratch); corridor.resize(navPowerPath.size()); // Will allocate memory using the scratch pad CORRIDOR STEP Copy all new NavPower paths -> temporary representation Drop unnecessary points Corridor adjust paths who requested it Copy temporaries -> PathHandles
  • 16. constCorridorHandleVector::iteratorallBegin = all.begin(), allEnd = all.end(); constCorridorHandlePtrVector::iteratoradjustBegin = adjust.begin(), adjustEnd = adjust.end(); for (CorridorHandleVector::iteratorit=allBegin; it!=allEnd; ++it) dropUnnecessaryPoints(it->corridor, scratchPad); for (CorridorHandlePtrVector::iteratorit=adjustBegin; it!=adjustEnd; ++it) shrinkEndPoints((**it).corridor, m_id); for (CorridorHandlePtrVector::iteratorit=adjustBegin; it!=adjustEnd; ++it) calculateCornerDisplacements((**it).corridor); for (CorridorHandlePtrVector::iteratorit=adjustBegin; it!=adjustEnd; ++it) displaceCorners((**it).corridor, m_id); for (CorridorHandlePtrVector::iteratorit=adjustBegin; it!=adjustEnd; ++it) shrinkSections((**it).corridor, m_id); for (CorridorHandleVector::iteratorit=allBegin; it!=allEnd; ++it) copyCorridorToHandle(it->corridor, *it->handle); } CORRIDOR STEP 2-4
  • 17. NavPOWER MANAGEr voidNavPowerManager::update(floatframeTime) { m_streamingManager.update(); m_destructionManager.update(); m_obstacleManager.update(); bfx::SystemSimulate( frameTime); for (PathfinderVector::const_iteratorit=m_pathfinders.begin(), ...) (**it).updatePaths(); for (PathfinderVector::const_iteratorit=m_pathfinders.begin(), ...) (**it).notifyPathListeners(); for (PositionGeneratorVector::const_iteratorit=m_positionGenerators.begin(), end = ...) (**it).update(); }
  • 18. Keep pathfinding code/data cache hot Avoid call sites cache running cold Easier to jobify / SPUify Easy to timeslice BATCHING BENEFITS
  • 19. Manager Random position generator Pathfinder Asynchronous Collect destruction messages, process in batch Runs ~1/sec. Allows synchronous decisions Decision making assumes success
  • 20. LESS SIMPLIFIED ARCHITECTURE SCRIPTING SERVER CLIENT AI DECISION MAKING PATH FOLLOWING PATHFINDING NAVPOWER LOCOMOTION LOCOMOTION DRIVING Waypoints Waypoint Data VEHICLE INPUT ANIMATION CorridorRadii
  • 21. Each server tick 1. Each AI decision making 2. Pathfinding manager update All pathfinding requests All corridor adjustments All PathHandle notifications -> path following -> server locomotion 3. Network pulse. Server locomotion -> client locomotion 4. ...rest of tick My precious latency
  • 22. Callbacks. Delay? Fire in batch? Handle+poll instead of callbacks. Poll in batch. Record messages, process all once a frame Check success / failure next frame Pre-calculate what you’re likely to need Con: Callstack won’t tell you everything. ...but can we afford deep callstacks? Asynchronous EXAMPLES
  • 23. RESOLVE EARLY voidBot::changeVehicle(constServerEntryComponent* entry) { ... m_pathFollower= entry->owner()-> getFirstComponentOfType<ServerPathFollowingComponent>()->getPathFollower(); }
  • 24. new / push_back() / insert() / resize() Stop and think! Where is the memory allocated? Pre-allocated containers? Scratch pad? Can I resize()/reserve() immediately? Can I use Optional<T> instead of ScopedPtr<T>? Can I use vectors instead of list / set / map? BE NICE TO YOUR MEMORY 
  • 25. Let’s not abandon OO nor rewrite the world Start small, batch a bit, resolve inputs, avoid deep dives, grow from there Much easer to rewrite a system in a DO fashion afterwards Let’s START MOVING
  • 26. AI decision making – pathfinding – animation Code: Handles, arena, scratch pad, fixed_vector, batch processing Latency analysis, asyncpatterns Thinkaboutdepth/width of calls, try staywithin your system, resolveearly, new/push_back() = think SUMMARY

Editor's Notes

  1. WelcomeWe have a lot of OO code in Frostbite that’s not very cache friendly. Sometimes it’s OO for good reasons, sometimes it’s because we’re used to coding that way.I’ll talk about how we can write more cache friendly code in the middle of OO systems and start moving towards data oriented designs
  2. We’ll spend most of our time on concrete examples from the pathfinding code.I’ll start by explaining how AI decision making, pathfinding and animation works togetherThen we&apos;ll move on and look at actual Frostbite code. Talk a bit about memory allocations, cache locality, asynchronous patterns, latency and so on. I&apos;ve set aside some time for questions at the end
  3. The pathfinding runtime sits between a bunch of OO systems, so we can’t make it fully data oriented without rewriting some of them too.What we _can_ do is collect all pathfinding operation from each individual OO bot and sort them on type. Then we can process all of the same type at the same time which gives us very good cache locality. We can also minimize memory allocations&amp;fragmentation and avoid cache misses that way.Then we have a few steps inside the pathfinding which is written in a dataoriented way. But in the end we have to return to the OO world again.
  4. Before we dive into the code I want to explain what the code does.Say we have this level with a bot over here and he...
  5. ... _decides_ to go into cover over here. The pathfindeing needs to find a path to get from A to B and then it’s the animation system’s responsability to follow this path.What we have at our disposal is a nav mesh. It looks like this
  6. It’s a set of 3D polygons which describes where bots can walk.NavPower does a search in this mesh to figure out how to get from A to B.
  7. It returns a path, a list of straight lines that you should walk along to get to your destination.But humans do not walk on perfectly straight lines, we tend to move in a smoother fashion. The animation system wants to diverge a bit from the path to look natural.If have two obstacles and and a path that looks like this, the animation system might want to move more like the blue lineSo to give the animation system a bit of freedom to move around...
  8. ... we build a corridor the animation system can move within. So we move points away from corners a bit, give them a radius which says how tight the passage is.We also drop some unnecessary points that the pathfinding system produces
  9. Finding a path from A to B is the most important operation that NavPower does.Naturally we load and unload the nav mesh. The nav mesh is split into a grid to support incremental rebuilds.We can add and remove obstacles that actually cut up the nav mesh at run time. We use it for slow moving vehicles &amp; bangers so bots can walk around them. We might use them for destruction too, but pretty heavy operation. We detect if a path has gotten blocked by an obstacle, so we can pathfind againWe ask NavPower if it’s possible to go from point A to point B. When AI needs to select a random position he can first test and see that he can reach it before he pathfinds. We also perform a kind of ray casts, and tests to see if circles and triangles can fit onto the nav mesh.Now, to get good instruction and data cache locality inside NavPower we want to collect these operations and process them in a batch.Each frame we collect all pathfinding requests and process them together, collect all obstacles you want to add and feed them to NavPower.
  10. When we changed our pathfinding implementation ...I started by goiing through all AI code and looked at how we used pathfinding. I simplified some things, disabled some others (frontline cover search) and abstracted the remaining use cases into three thingsFirst we have the pathfinder. It allows you to find paths, keeps track that they don’t get invalidated and they also build the corridors.Then there’s the random position generator. Each bot keeps a few randomized positions around that it know it can reach. Finally we have the global manager. It loads &amp;unloads nav meshes. It creates&amp;removes obstacles, it’ll handle destruction, also updates the other thingiesFew synchronous raycasts in some AI behaviours that was a bit tricky to collect and batch process. They didn’t run very often, just not worth the worth the effort, let them be synchronous
  11. The patfindiner gives you a path from start to end and you can optionally build a corridor around it. It returns a handle which we will look at soonThen there is a more efficient versions which continues to search from the end of a previous path. When you’ve reached your destination you release your path and the pathfinder will stop checking if the path has been invalidated. Finally I’ve exposed these synchronous ray cast that some behaviours needed here.
  12. The path handle is just a struct. It consists of a bunch of waypoints, the radii of the corridor and a state. Pretty typical pattern. You have a fixed set of handles that you reuse, so you don’t need to do any memory allocations. Ask for a handle, communicate by both parties polling and writing to the handle.But in this case we have an OO-style listener? Why don’t I poll state variable for updates?Well, I want to minimize latency and make sure that the animation system gets the result as soon as possible. But it’s not too bad, I collect and call all onStateChanged calls at the same time = good cache coherency
  13. Fixed_vectors here are growable. If there’s less than 16 waypoints, which it is in 98% of the cases, they will use the memory allocated inside the path handle. If 16 not enough, this space is wasted because they need to allocate a contigous chunk of memory elsewhere. If it overshoots, allocate memory inside the pathfindingArena(). This is good because we won’t fragment other systems. We can more easily track memory usage and fragmentation one system at a time. These allocations have nasty life time 2-10 seconds -&gt; causes a lot of fragmentation
  14. Let’s look at the pathfinder implementation.The updatePaths function polls all navpower paths, creates the corridor for them and then copies the result to the PathHandles. notifyPathListeners simply notifies all path listeners whose path handles have changed state.It keeps an array of all the NavPower paths it needs.It a number of PathHandles and pointers to path handle listeners too.You use the same index into all of these containers, i.e. The NavPower path number 4 is associated with PathHandle 4 and PathHandle listener nr 4.There is a bitmask which says which of these indices in currently use.There are also some _non-growable_ fixed_vectors that contain all the paths that has been update this frame.All of these containers store their contents inside NavPowerPathfinder. Their storage is pre-allocated, sizes are fixed. You overshoot, you crash. The Full control over memory usage, no allocations, no fragmentation and very good data locality.But you should be careful so you don’t consume too much memory. It’s good practice to do a rough estimate on how big these containers are. Sizeof(NavPowerPathfinder) ~ 25kb
  15. Let’s go a bit deeper and look at the corridor. It does four things:It copies all new navpower paths to an intermediate representation suited for corridor calculations.For each path we then it drops all of those extra points that NavPower generated each time we crossed a nav mesh polygonNext, we create the actual corridor for the paths that supplied the optional corridor radiusFinally we copy the results to the PathHandlesNow, ordinary Heap allocations are pretty expensive. They have to be threadsafe _and_ they have to find a good slot in the perhaps fragmented memory you have left. In this case we just want some temporary memory, use it a short while, and then throw it away.And that’s exactly what the scratch pad is for. The scratch pad is a chunk of memory we’ve set aside for short lived allocations. It uses a simple &amp; cheap linear allocator. It allocates a fairly large block, I think it’s 128kb, when you create a ScratchPadArena. Whenever you allocate something it just increments a pointer. And when it goes out of scope, it’s destructed will return the entire block in one call. It never tries to reclaim the memory you release, so if you new and immediately delete a pointer that memory wont be released until you destroy the scratchpadarena.A typical use case is to create a ScratchPadArena on the stack and pass it to a container constructor. This container will then use this allocator you gave it when you call push_back/insert/resize or other operations that needs to allocate memory.Step number one will create several corridors on the scratch pad. Let’s look at the code for step 2,3 and 4
  16. We have two vectors, one contain all of the paths in this intermediate corridor representation. The other contain pointers to all of corridors that need adjustment.Then we just loop over all of the corridors and do one operation at a time.One of these corridors might look like this. We have a start point and an end point and a bunch of intermediate points with the corridor radius set originally.First we drop all intermediate points for all corridors..Shrink. Haven’t actually implemented yetThe good thing about doing it this way is that we do all circle test at the same time, then we do all corner displacements and so on.Writing the code this way is not a whole lot more complicated, you just add some extra for loops
  17. Let’s zoom out and what the manager does each updateAdds and removes all obstaclesThis call does we pathfinding&amp;string-pulingThen we poll the pathfinding handles and do the corridor adjustments We have several pathfinders, on for the infantry nav mesh, one for a tank nav meshThen we update all path listenersThen we generate random positions. So they will be available
  18. The biggest performance benefit of doing calculation this way is on heavy frames. It’ll be much cache friendlier to handle a frame where you spawn 10 vehicles and they all create an obstacle each.You keep running the same code over and over and it’s hot. If you instead would add an obstacle immediately when you spawn a vehicle, you would go deep into NavPower, run into lots of cache misses and once you return back to spawn you might have evicted most spawn related code and data because you touched so much code and data inside NavPower.Even if you just have say two path requests, one destruction event and some random positions to generate. Well then you will keep generic NavPower system code hot if you execute them together. And more importantly, you won’t make AI decision making code&amp;data cold by taking deep dives into a call stack.Easier to jobify/timesilceNot a lot of extra work to write code this way, sometimes it’s even simpler and takes less code. I.e. AI decision making is easy to understand if we can see all its inputs and all its outputs.
  19. All pathfinding abstraction are asynchronous, but in different waysMost of what the manager does is pretty natural to do once per frame. One thing it does it collect destruction messages and then batch processRandom position generator runs about We’ve looked at how the pathfinder is implemented but we haven’t talked about how it’s used.AI Decision making decides it want to go somewhere, goes into its movement behaviour and happily assumes it moves. And in 99% of the cases it will work, cause either scripted waypoints or randomly selected positions we can reach. In the cases it doesn’t, well the AI will think he’s moving for a frame or two but that’snot really a problem.
  20. If you want to look at the real code there’s a bit more functionality and layers you should know about.You can input scripted sequences, there is a path following layer, you can steer both vehicles and infantry.We use a server-client model and we only run AI and pathfinding on the server. Beside from actual waypoints we have the corridor radius and scripted data. The scripted data informs the bot that this waypoint is a vault point or that the bot should stop and pause a few seconds.We don’t really use them until in the locomotion code. So each step here only works with the data it needs.Even in the object oriented part of the code, where there is one instance per bot, the data is represented as three separate vectors and each step only touches the information it needs.Pathfinding only takes waypoints as input in the form of start and ends of a scripted segment. And it returns new waypoints and radii. These radii are just passed on to the locomotion client.When you have this many steps and you start making them asynchronous you have to be careful to not introduce needless latency.
  21. Each server tick we first let all AI think which may result in path requests Directly afterwards we update the pathfinding manager.It will process all pathfinding requests, then do all corridor adjustments, then do all path handle notifications.These are OO-style synchronous callbacks, so they will immediately go down thorugh the path following layer and into the server locomotion component and set data. Go back and forth up and down. Not a problem, small often identical stack, cache will be hot!The network pulse will send the data off to the client side.So there is no extra latency involved here
  22. Let’s recap on some of the super simple patterns we’ve seen.Callbacks are the classical OO async mechanism. When we use them we do not have to fire them immediately. If you expect several of the same type to happen each frame or you know they will dive into a really deep callstack or touch a lot of data, it can be worthwhile to delay them.You can use handles and polling instead of callbacks. Checking a flag is much cheaper than a virtual callback.Similar for messages, you do not have to act immediately.If it’s not too difficult to recover from failure, you can just assume an operation succeeds if you need to make it asynchronousIn some cases you can even pre-calculate information you’re likely to need. Can’t place break point and get vertical slice of 10 systems... But...can we really afford such deep calls given the price of memory access?
  23. Other than pre-calculating things you should also pre-fetch it.When you’re writing data-oriented code you have a clear set of inputs and you make sure you have them available before you start working. We can often do the same thing in OO code.For instance we need to use a PathFollower in basically every frame in AI decision making code. It’s hidden deep in the component hiearchy. So instead of digging it out each time we need it, we do it once when the bot changes vehicle and the AI code will then use this reference to access the pathfollower
  24. New/push_back(): Good place to stop and thinkWhere is the memory allocated? Did I specify an arena?Can I use pre-allocated containers and skip allocations alltogether?If not, can I use the scratch pad?Can I resize or reserve the memory immediately, so I don’t have to grow it incrementally and make many small allocations.Optional is a preallocated container with 0 or 1 element, can I use that instead of a ScopedPtr and save a dynamic allocation?Once you’ve done this 5 times you will do it in your sleep 
  25. We first looked at how AI decision making, pathfinding &amp; animation worked togetherWe saw how the pathfinding use cases were grouped into some async abstractionsWe looked at a lot of codeWe saw a latency analysis