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

Optimizing the Graphics Pipeline with Compute, GDC 2016
Optimizing the Graphics Pipeline with Compute, GDC 2016Optimizing the Graphics Pipeline with Compute, GDC 2016
Optimizing the Graphics Pipeline with Compute, GDC 2016Graham Wihlidal
 
Kernel Recipes 2019 - ftrace: Where modifying a running kernel all started
Kernel Recipes 2019 - ftrace: Where modifying a running kernel all startedKernel Recipes 2019 - ftrace: Where modifying a running kernel all started
Kernel Recipes 2019 - ftrace: Where modifying a running kernel all startedAnne Nicolas
 
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
 
Screen Space Decals in Warhammer 40,000: Space Marine
Screen Space Decals in Warhammer 40,000: Space MarineScreen Space Decals in Warhammer 40,000: Space Marine
Screen Space Decals in Warhammer 40,000: Space MarinePope Kim
 
Killzone Shadow Fall: Threading the Entity Update on PS4
Killzone Shadow Fall: Threading the Entity Update on PS4Killzone Shadow Fall: Threading the Entity Update on PS4
Killzone Shadow Fall: Threading the Entity Update on PS4jrouwe
 
The Guerrilla Guide to Game Code
The Guerrilla Guide to Game CodeThe Guerrilla Guide to Game Code
The Guerrilla Guide to Game CodeGuerrilla
 
Dx11 performancereloaded
Dx11 performancereloadedDx11 performancereloaded
Dx11 performancereloadedmistercteam
 
Multiprocessor Game Loops: Lessons from Uncharted 2: Among Thieves
Multiprocessor Game Loops: Lessons from Uncharted 2: Among ThievesMultiprocessor Game Loops: Lessons from Uncharted 2: Among Thieves
Multiprocessor Game Loops: Lessons from Uncharted 2: Among ThievesNaughty Dog
 
A Deep Dive into Stateful Stream Processing in Structured Streaming with Tath...
A Deep Dive into Stateful Stream Processing in Structured Streaming with Tath...A Deep Dive into Stateful Stream Processing in Structured Streaming with Tath...
A Deep Dive into Stateful Stream Processing in Structured Streaming with Tath...Databricks
 
The Parquet Format and Performance Optimization Opportunities
The Parquet Format and Performance Optimization OpportunitiesThe Parquet Format and Performance Optimization Opportunities
The Parquet Format and Performance Optimization OpportunitiesDatabricks
 
Understanding of linux kernel memory model
Understanding of linux kernel memory modelUnderstanding of linux kernel memory model
Understanding of linux kernel memory modelSeongJae Park
 
The Rendering Pipeline - Challenges & Next Steps
The Rendering Pipeline - Challenges & Next StepsThe Rendering Pipeline - Challenges & Next Steps
The Rendering Pipeline - Challenges & Next StepsJohan Andersson
 
Game Physics Engine Development (게임 물리 엔진 개발)
Game Physics Engine Development (게임 물리 엔진 개발)Game Physics Engine Development (게임 물리 엔진 개발)
Game Physics Engine Development (게임 물리 엔진 개발)Bongseok Cho
 
The Rendering Technology of Killzone 2
The Rendering Technology of Killzone 2The Rendering Technology of Killzone 2
The Rendering Technology of Killzone 2Guerrilla
 
liftIO 2022 quasiquote
liftIO 2022 quasiquoteliftIO 2022 quasiquote
liftIO 2022 quasiquoteHyunseok Cho
 
Tips and experience_of_dx12_engine_development._ver_1.2
Tips and experience_of_dx12_engine_development._ver_1.2Tips and experience_of_dx12_engine_development._ver_1.2
Tips and experience_of_dx12_engine_development._ver_1.2YEONG-CHEON YOU
 
Memory Mapping Implementation (mmap) in Linux Kernel
Memory Mapping Implementation (mmap) in Linux KernelMemory Mapping Implementation (mmap) in Linux Kernel
Memory Mapping Implementation (mmap) in Linux KernelAdrian Huang
 
Efficient Data Storage for Analytics with Apache Parquet 2.0
Efficient Data Storage for Analytics with Apache Parquet 2.0Efficient Data Storage for Analytics with Apache Parquet 2.0
Efficient Data Storage for Analytics with Apache Parquet 2.0Cloudera, Inc.
 

What's hot (20)

Optimizing the Graphics Pipeline with Compute, GDC 2016
Optimizing the Graphics Pipeline with Compute, GDC 2016Optimizing the Graphics Pipeline with Compute, GDC 2016
Optimizing the Graphics Pipeline with Compute, GDC 2016
 
Kernel Recipes 2019 - ftrace: Where modifying a running kernel all started
Kernel Recipes 2019 - ftrace: Where modifying a running kernel all startedKernel Recipes 2019 - ftrace: Where modifying a running kernel all started
Kernel Recipes 2019 - ftrace: Where modifying a running kernel all started
 
Frostbite on Mobile
Frostbite on MobileFrostbite on Mobile
Frostbite on Mobile
 
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
 
Screen Space Decals in Warhammer 40,000: Space Marine
Screen Space Decals in Warhammer 40,000: Space MarineScreen Space Decals in Warhammer 40,000: Space Marine
Screen Space Decals in Warhammer 40,000: Space Marine
 
Killzone Shadow Fall: Threading the Entity Update on PS4
Killzone Shadow Fall: Threading the Entity Update on PS4Killzone Shadow Fall: Threading the Entity Update on PS4
Killzone Shadow Fall: Threading the Entity Update on PS4
 
The Guerrilla Guide to Game Code
The Guerrilla Guide to Game CodeThe Guerrilla Guide to Game Code
The Guerrilla Guide to Game Code
 
Dx11 performancereloaded
Dx11 performancereloadedDx11 performancereloaded
Dx11 performancereloaded
 
Multiprocessor Game Loops: Lessons from Uncharted 2: Among Thieves
Multiprocessor Game Loops: Lessons from Uncharted 2: Among ThievesMultiprocessor Game Loops: Lessons from Uncharted 2: Among Thieves
Multiprocessor Game Loops: Lessons from Uncharted 2: Among Thieves
 
A Deep Dive into Stateful Stream Processing in Structured Streaming with Tath...
A Deep Dive into Stateful Stream Processing in Structured Streaming with Tath...A Deep Dive into Stateful Stream Processing in Structured Streaming with Tath...
A Deep Dive into Stateful Stream Processing in Structured Streaming with Tath...
 
The Parquet Format and Performance Optimization Opportunities
The Parquet Format and Performance Optimization OpportunitiesThe Parquet Format and Performance Optimization Opportunities
The Parquet Format and Performance Optimization Opportunities
 
Understanding of linux kernel memory model
Understanding of linux kernel memory modelUnderstanding of linux kernel memory model
Understanding of linux kernel memory model
 
The Rendering Pipeline - Challenges & Next Steps
The Rendering Pipeline - Challenges & Next StepsThe Rendering Pipeline - Challenges & Next Steps
The Rendering Pipeline - Challenges & Next Steps
 
Game Physics Engine Development (게임 물리 엔진 개발)
Game Physics Engine Development (게임 물리 엔진 개발)Game Physics Engine Development (게임 물리 엔진 개발)
Game Physics Engine Development (게임 물리 엔진 개발)
 
Scope Stack Allocation
Scope Stack AllocationScope Stack Allocation
Scope Stack Allocation
 
The Rendering Technology of Killzone 2
The Rendering Technology of Killzone 2The Rendering Technology of Killzone 2
The Rendering Technology of Killzone 2
 
liftIO 2022 quasiquote
liftIO 2022 quasiquoteliftIO 2022 quasiquote
liftIO 2022 quasiquote
 
Tips and experience_of_dx12_engine_development._ver_1.2
Tips and experience_of_dx12_engine_development._ver_1.2Tips and experience_of_dx12_engine_development._ver_1.2
Tips and experience_of_dx12_engine_development._ver_1.2
 
Memory Mapping Implementation (mmap) in Linux Kernel
Memory Mapping Implementation (mmap) in Linux KernelMemory Mapping Implementation (mmap) in Linux Kernel
Memory Mapping Implementation (mmap) in Linux Kernel
 
Efficient Data Storage for Analytics with Apache Parquet 2.0
Efficient Data Storage for Analytics with Apache Parquet 2.0Efficient Data Storage for Analytics with Apache Parquet 2.0
Efficient Data Storage for Analytics with Apache Parquet 2.0
 

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
 
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
 
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 (13)

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
 
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
 
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
 

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
 
Lighting the City of Glass
Lighting the City of GlassLighting the City of Glass
Lighting the City of Glass
 

Recently uploaded

Statement Of Intent - - Copy.documentfile
Statement Of Intent - - Copy.documentfileStatement Of Intent - - Copy.documentfile
Statement Of Intent - - Copy.documentfilef4ssvxpz62
 
NO1 WorldWide Amil Baba In Karachi Kala Jadu In Karachi Amil baba In Karachi ...
NO1 WorldWide Amil Baba In Karachi Kala Jadu In Karachi Amil baba In Karachi ...NO1 WorldWide Amil Baba In Karachi Kala Jadu In Karachi Amil baba In Karachi ...
NO1 WorldWide Amil Baba In Karachi Kala Jadu In Karachi Amil baba In Karachi ...Amil Baba Dawood bangali
 
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
 
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 Near The Corus Hotel New Delhi 9873777170
Call Girls Near The Corus Hotel New Delhi 9873777170Call Girls Near The Corus Hotel New Delhi 9873777170
Call Girls Near The Corus Hotel New Delhi 9873777170Sonam Pathan
 
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
 
Zoom In Game for ice breaking in a training
Zoom In Game for ice breaking in a trainingZoom In Game for ice breaking in a training
Zoom In Game for ice breaking in a trainingRafik ABDI
 
Call Girl Price Andheri WhatsApp:+91-9833363713
Call Girl Price Andheri WhatsApp:+91-9833363713Call Girl Price Andheri WhatsApp:+91-9833363713
Call Girl Price 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
 
Taken Pilot Episode Story pitch Document
Taken Pilot Episode Story pitch DocumentTaken Pilot Episode Story pitch Document
Taken Pilot Episode Story pitch Documentf4ssvxpz62
 
QUIZ BOLLYWOOD ( weekly quiz ) - SJU quizzers
QUIZ BOLLYWOOD ( weekly quiz ) - SJU quizzersQUIZ BOLLYWOOD ( weekly quiz ) - SJU quizzers
QUIZ BOLLYWOOD ( weekly quiz ) - SJU quizzersSJU Quizzers
 
North Avenue Call Girls Services, Hire Now for Full Fun
North Avenue Call Girls Services, Hire Now for Full FunNorth Avenue Call Girls Services, Hire Now for Full Fun
North Avenue Call Girls Services, Hire Now for Full FunKomal Khan
 
GRADE 7 NEW PPT ENGLISH 1 [Autosaved].pp
GRADE 7 NEW PPT ENGLISH 1 [Autosaved].ppGRADE 7 NEW PPT ENGLISH 1 [Autosaved].pp
GRADE 7 NEW PPT ENGLISH 1 [Autosaved].ppJasmineLinogon
 
原版1:1复刻卡尔加里大学毕业证UC毕业证留信学历认证
原版1:1复刻卡尔加里大学毕业证UC毕业证留信学历认证原版1:1复刻卡尔加里大学毕业证UC毕业证留信学历认证
原版1:1复刻卡尔加里大学毕业证UC毕业证留信学历认证gwhohjj
 
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
 
办理滑铁卢大学毕业证成绩单|购买加拿大文凭证书
办理滑铁卢大学毕业证成绩单|购买加拿大文凭证书办理滑铁卢大学毕业证成绩单|购买加拿大文凭证书
办理滑铁卢大学毕业证成绩单|购买加拿大文凭证书zdzoqco
 
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
 
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
 
ViP Call Girls In Udaipur 9602870969 Gulab Bagh Escorts SeRvIcE
ViP Call Girls In Udaipur 9602870969 Gulab Bagh Escorts SeRvIcEViP Call Girls In Udaipur 9602870969 Gulab Bagh Escorts SeRvIcE
ViP Call Girls In Udaipur 9602870969 Gulab Bagh Escorts SeRvIcEApsara Of India
 

Recently uploaded (20)

Statement Of Intent - - Copy.documentfile
Statement Of Intent - - Copy.documentfileStatement Of Intent - - Copy.documentfile
Statement Of Intent - - Copy.documentfile
 
NO1 WorldWide Amil Baba In Karachi Kala Jadu In Karachi Amil baba In Karachi ...
NO1 WorldWide Amil Baba In Karachi Kala Jadu In Karachi Amil baba In Karachi ...NO1 WorldWide Amil Baba In Karachi Kala Jadu In Karachi Amil baba In Karachi ...
NO1 WorldWide Amil Baba In Karachi Kala Jadu In Karachi Amil baba In Karachi ...
 
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...
 
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 Near The Corus Hotel New Delhi 9873777170
Call Girls Near The Corus Hotel New Delhi 9873777170Call Girls Near The Corus Hotel New Delhi 9873777170
Call Girls Near The Corus Hotel New Delhi 9873777170
 
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
 
Zoom In Game for ice breaking in a training
Zoom In Game for ice breaking in a trainingZoom In Game for ice breaking in a training
Zoom In Game for ice breaking in a training
 
Call Girl Price Andheri WhatsApp:+91-9833363713
Call Girl Price Andheri WhatsApp:+91-9833363713Call Girl Price Andheri WhatsApp:+91-9833363713
Call Girl Price 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...
 
Taken Pilot Episode Story pitch Document
Taken Pilot Episode Story pitch DocumentTaken Pilot Episode Story pitch Document
Taken Pilot Episode Story pitch Document
 
QUIZ BOLLYWOOD ( weekly quiz ) - SJU quizzers
QUIZ BOLLYWOOD ( weekly quiz ) - SJU quizzersQUIZ BOLLYWOOD ( weekly quiz ) - SJU quizzers
QUIZ BOLLYWOOD ( weekly quiz ) - SJU quizzers
 
North Avenue Call Girls Services, Hire Now for Full Fun
North Avenue Call Girls Services, Hire Now for Full FunNorth Avenue Call Girls Services, Hire Now for Full Fun
North Avenue Call Girls Services, Hire Now for Full Fun
 
GRADE 7 NEW PPT ENGLISH 1 [Autosaved].pp
GRADE 7 NEW PPT ENGLISH 1 [Autosaved].ppGRADE 7 NEW PPT ENGLISH 1 [Autosaved].pp
GRADE 7 NEW PPT ENGLISH 1 [Autosaved].pp
 
原版1:1复刻卡尔加里大学毕业证UC毕业证留信学历认证
原版1:1复刻卡尔加里大学毕业证UC毕业证留信学历认证原版1:1复刻卡尔加里大学毕业证UC毕业证留信学历认证
原版1:1复刻卡尔加里大学毕业证UC毕业证留信学历认证
 
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
 
办理滑铁卢大学毕业证成绩单|购买加拿大文凭证书
办理滑铁卢大学毕业证成绩单|购买加拿大文凭证书办理滑铁卢大学毕业证成绩单|购买加拿大文凭证书
办理滑铁卢大学毕业证成绩单|购买加拿大文凭证书
 
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
 
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
 
ViP Call Girls In Udaipur 9602870969 Gulab Bagh Escorts SeRvIcE
ViP Call Girls In Udaipur 9602870969 Gulab Bagh Escorts SeRvIcEViP Call Girls In Udaipur 9602870969 Gulab Bagh Escorts SeRvIcE
ViP Call Girls In Udaipur 9602870969 Gulab Bagh Escorts SeRvIcE
 
Call Girls Koti 7001305949 all area service COD available Any Time
Call Girls Koti 7001305949 all area service COD available Any TimeCall Girls Koti 7001305949 all area service COD available Any Time
Call Girls Koti 7001305949 all area service COD available Any Time
 

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