SlideShare a Scribd company logo
1 of 175
Download to read offline
Как мы делали
многопользовательскую
браузерную игру для HL++ с
воксельной графикой
Александр Хаёров / Unit Manager /
t.me/hayorov
difficulty level
Ad Voxel Art Designer Wanted
https://urbn.odn.pw
x
difficulty level
Ad Voxel Art Designer Wanted
https://urbn.odn.pw
x
Who Are Indie Game Developers?
Source: somewhere from the Internet
Who Are Indie Game Developers?
Source: somewhere from the Internet
Indie is a shortform of "independent"
Who Are Indie Game Developers?
97% men
Source: somewhere from the Internet
Indie is a shortform of "independent"
Who Are Indie Game Developers?
97% men
60% singles
Source: somewhere from the Internet
Indie is a shortform of "independent"
Who Are Indie Game Developers?
97% men
60% singles
1-3 months/game
Source: somewhere from the Internet
Indie is a shortform of "independent"
Who We Are
Who We Are
Alex Khaerov
a Unit Manager at Ingram Micro Cloud
Who We Are
and the Great Team of Engineers
Alex Khaerov
a Unit Manager at Ingram Micro Cloud
Who We Are
and the Great Team of Engineers
@themaxbelov @ToxicWar @weglov@spukst3r
Alex Khaerov
a Unit Manager at Ingram Micro Cloud
Who We Are
@themaxbelov @ToxicWar @weglov
and the Great Team of voxel jedis, optimisation masters, gurus of the 3d, lords of the big data
@spukst3r
Alex Khaerov
a Unit Manager at Ingram Micro Cloud
Background
Background
Exhibition stand at HL++2017
Background
Exhibition stand at HL++2017
Reddit r/Place influence
/r/Place
a social experiment by Reddit
/r/Place
1,000 x 1,000 px canvas
a social experiment by Reddit
/r/Place
1,000 x 1,000 px canvas
pixel * user per 5 min
a social experiment by Reddit
/r/Place
1,000 x 1,000 px canvas
pixel * user per 5 min
72 hours of fun
a social experiment by Reddit
/r/Place
1,000 x 1,000 px canvas
pixel * user per 5 min
72 hours of fun
a social experiment by Reddit
/r/Place
1,000 x 1,000 px canvas
pixel * user per 5 min
72 hours of fun
a social experiment by Reddit
/r/Place
1,000 x 1,000 px canvas
pixel * user per 5 min
72 hours of fun
> 1M players
a social experiment by Reddit
/r/Place
1,000 x 1,000 px canvas
pixel * user per 5 min
72 hours of fun
> 1M players
a social experiment by Reddit
90K simultaneously
Background
Exhibition stand at HL++2017
Reddit r/Place influence
Background
Exhibition stand at HL++2017
Reddit r/Place influence
Games are full of fun
Background
Exhibition stand at HL++2017
Reddit r/Place influence
Games are full of fun
A new dev experience
The Game
Features
The Game
multi-player
Features
The Game
multi-player
Features
multi-player and networked
The Game
multi-player
2D computer graphics
Features
multi-player and networked
The Game
multi-player
2D 3D computer graphics
Features
multi-player and networked
The Game
multi-player
2D 3D computer graphics
hyped tech
Features
multi-player and networked
The Game
multi-player
2D 3D computer graphics
hyped Virtual Reality tech
Features
multi-player and networked
The Game
multi-player
2D computer graphics2D 3D computer graphics
hyped techhyped Virtual Reality tech
Features
multi-player and networked
The Game
multi-player
2D computer graphics2D 3D computer graphics
hyped techhyped Virtual Reality tech
Features Concessions
multi-player and networked
The Game
multi-player
2D computer graphics2D 3D computer graphics
hyped techhyped Virtual Reality tech
client-based
Features Concessions
multi-player and networked
The Game
multi-player
2D computer graphics2D 3D computer graphics
hyped techhyped Virtual Reality tech
client-based Browser
Features Concessions
multi-player and networked
The Game
multi-player
2D computer graphics2D 3D computer graphics
hyped techhyped Virtual Reality tech
client-based Browser
voxel “block-style” objects
Features Concessions
multi-player and networked
The Game
multi-player
2D computer graphics2D 3D computer graphics
hyped techhyped Virtual Reality tech
client-based Browser
voxel “block-style” objects
Features Concessions
multi-player and networked
The Game
multi-player
2D computer graphics2D 3D computer graphics
hyped techhyped Virtual Reality tech
client-based Browser
voxel “block-style” objects
Features Concessions
multi-player and networked
The Game
multi-player
2D computer graphics2D 3D computer graphics
hyped techhyped Virtual Reality tech
client-based Browser
voxel “block-style” objects
Features Concessions
world size 1000x1000x200
multi-player and networked
The Game
Gameplay and rules
Gameplay and rules
find spots with the flag
Gameplay and rules
capture flags
find spots with the flag
Gameplay and rules
capture flags
hold and earn scores
find spots with the flag
Gameplay and rules
capture flags
hold and earn scores
find spots with the flag
win a prize
Enterprise architecture
Enterprise architecture
Enterprise architecture
+
Enterprise architecture
game-frontend
+
Enterprise architecture
game-storagegame-frontend
+
Enterprise architecture
game-storagegame-frontend
+
Enterprise architecture
game-storagegame-frontend
+
?
Replication problem
Replication problem
Replication problem
Replication problem
Active
Active Passive
Replication problem
Active Passive
Replication problem
Active Passive
Replication problem
Active Passive
+ Easy to understand
Replication problem
Active Passive
+ Easy to understand
+ More efficient
Replication problem
Active Passive
+ Easy to understand
+ More efficient
- Fragile
Replication problem
Active Passive
+ Robust to de-sync+ Easy to understand
+ More efficient
- Fragile
Replication problem
Active Passive
+ Robust to de-sync+ Easy to understand
+ More efficient
- Fragile
+ Easier to secure
Replication problem
Active Passive
+ Robust to de-sync+ Easy to understand
+ More efficient
- Fragile - Single point of failure
+ Easier to secure
Replication problem
Active Passive
+ Robust to de-sync+ Easy to understand
+ More efficient
- Fragile - Single point of failure
+ Easier to secure
✔
Replication problem
Architecture
game-storagegame-frontend
+
Architecture
game-storagegame-backendgame-frontend
+
Architecture
game-storagegame-backendgame-frontend
+
?
Data Structure
“flat array”
Data Structure
“flat array”
+ read/write = const
Data Structure
“flat array”
+ read/write = const
- memory = L^3
Data Structure
“flat array” octree
+ read/write = const
- memory = L^3
Data Structure
“flat array” octree
+ read/write = const
- memory = L^3
Data Structure
“flat array” octree
+ read/write = const
- memory = L^3
Data Structure
“flat array” octree
+ read/write = const
- memory = L^3
+ lean
Data Structure
“flat array” octree
+ read/write = const
- slower than flat- memory = L^3
+ lean
Data Structure
“flat array” octree pages/chunks
+ read/write = const
- slower than flat- memory = L^3
+ lean
Data Structure
“flat array” octree pages/chunks
+ read/write = const + lazily initialized
- slower than flat- memory = L^3
+ lean
Data Structure
“flat array” octree pages/chunks
+ read/write = const + lazily initialized
- slower than flat- memory = L^3
+ lean
- more complicated
Data Structure
“flat array” octree
+ Read/Write = const + lazily initialized
- slower than flat- Memory = L^3
+ lean
- more complicated
Data Structure
pages/chunks
“flat array” octree
+ Read/Write = const + lazily initialized
- slower than flat- Memory = L^3
+ lean
- more complicated
Data Structure
pages/chunks✔
Architecture
game-backendgame-frontend
+
?
Architecture
MongoDBgame-backendgame-frontend
+
Architecture
MongoDBgame-backendgame-frontend
+
? ?
Protocol
Protocol
1 2 3 …
N
game-frontend
Protocol
1 2 3 …
N32
32
game-frontend
Protocol
1 2 3 …
N32
32
game-frontend mongoDB > data
(1) ObjectId() { 7 fields } Object
(2) ObjectId() { 7 fields } Object
(3) ObjectId() { 7 fields } Object
(4) ObjectId() { 7 fields } Object
(5) ObjectId() { 7 fields } Object
(6) ObjectId() { 7 fields } Object
(7) ObjectId() { 7 fields } Object
(8) ObjectId() { 7 fields } Object
Protocol
1 2 3 …
N32
32
game-frontend mongoDB > data
(1) ObjectId() { 7 fields } Object
(2) ObjectId() { 7 fields } Object
(3) ObjectId() { 7 fields } Object
(4) ObjectId() { 7 fields } Object
(5) ObjectId() { 7 fields } Object
(6) ObjectId() { 7 fields } Object
(7) ObjectId() { 7 fields } Object
(8) ObjectId() { 7 fields } Object
{	
				"_id"	:	ObjectId(),	
				"x"	:	435,	
				"y"	:	377,	
				"z"	:	0,	
				“color"	:	"#5b8c9c",	
				"name"	:	null,	
				"updated"	:	ISODate()	
}
Protocol
1 2 3 …
N32
32
game-frontend mongoDB > data
(1) ObjectId() { 7 fields } Object
(2) ObjectId() { 7 fields } Object
(3) ObjectId() { 7 fields } Object
(4) ObjectId() { 7 fields } Object
(5) ObjectId() { 7 fields } Object
(6) ObjectId() { 7 fields } Object
(7) ObjectId() { 7 fields } Object
(8) ObjectId() { 7 fields } Object
{	
				"_id"	:	ObjectId(),	
				"x"	:	435,	
				"y"	:	377,	
				"z"	:	0,	
				“color"	:	"#5b8c9c",	
				"name"	:	null,	
				"updated"	:	ISODate()	
}
Protocol
1 2 3 …
N32
32
game-frontend mongoDB > data
(1) ObjectId() { 7 fields } Object
(2) ObjectId() { 7 fields } Object
(3) ObjectId() { 7 fields } Object
(4) ObjectId() { 7 fields } Object
(5) ObjectId() { 7 fields } Object
(6) ObjectId() { 7 fields } Object
(7) ObjectId() { 7 fields } Object
(8) ObjectId() { 7 fields } Object
{	
				"_id"	:	ObjectId(),	
				"x"	:	435,	
				"y"	:	377,	
				"z"	:	0,	
				“color"	:	"#5b8c9c",	
				"name"	:	null,	
				"updated"	:	ISODate()	
}
Protocol
1 2 3 …
N32
32
game-frontend mongoDB > data
(1) ObjectId() { 7 fields } Object
(2) ObjectId() { 7 fields } Object
(3) ObjectId() { 7 fields } Object
(4) ObjectId() { 7 fields } Object
(5) ObjectId() { 7 fields } Object
(6) ObjectId() { 7 fields } Object
(7) ObjectId() { 7 fields } Object
(8) ObjectId() { 7 fields } Object
{	
				"_id"	:	ObjectId(),	
				"x"	:	435,	
				"y"	:	377,	
				"z"	:	0,	
				“color"	:	"#5b8c9c",	
				"name"	:	null,	
				"updated"	:	ISODate()	
}
r
Protocol
1 2 3 …
N32
32
game-frontend mongoDB > data
(1) ObjectId() { 7 fields } Object
(2) ObjectId() { 7 fields } Object
(3) ObjectId() { 7 fields } Object
(4) ObjectId() { 7 fields } Object
(5) ObjectId() { 7 fields } Object
(6) ObjectId() { 7 fields } Object
(7) ObjectId() { 7 fields } Object
(8) ObjectId() { 7 fields } Object
game-backend
{	
				"_id"	:	ObjectId(),	
				"x"	:	435,	
				"y"	:	377,	
				"z"	:	0,	
				“color"	:	"#5b8c9c",	
				"name"	:	null,	
				"updated"	:	ISODate()	
}
get(x, y, z, r)
r
Protocol
1 2 3 …
N32
32
game-frontend mongoDB > data
(1) ObjectId() { 7 fields } Object
(2) ObjectId() { 7 fields } Object
(3) ObjectId() { 7 fields } Object
(4) ObjectId() { 7 fields } Object
(5) ObjectId() { 7 fields } Object
(6) ObjectId() { 7 fields } Object
(7) ObjectId() { 7 fields } Object
(8) ObjectId() { 7 fields } Object
game-backend
{	
				"_id"	:	ObjectId(),	
				"x"	:	435,	
				"y"	:	377,	
				"z"	:	0,	
				“color"	:	"#5b8c9c",	
				"name"	:	null,	
				"updated"	:	ISODate()	
}
get(x, y, z, r)
set(x, y, z)
r
Protocol
1 2 3 …
N32
32
game-frontend mongoDB > data
(1) ObjectId() { 7 fields } Object
(2) ObjectId() { 7 fields } Object
(3) ObjectId() { 7 fields } Object
(4) ObjectId() { 7 fields } Object
(5) ObjectId() { 7 fields } Object
(6) ObjectId() { 7 fields } Object
(7) ObjectId() { 7 fields } Object
(8) ObjectId() { 7 fields } Object
game-backend
{	
				"_id"	:	ObjectId(),	
				"x"	:	435,	
				"y"	:	377,	
				"z"	:	0,	
				“color"	:	"#5b8c9c",	
				"name"	:	null,	
				"updated"	:	ISODate()	
}
get(x, y, z, r)
set(x, y, z)
r
Protocol
1 2 3 …
N32
32
game-frontend mongoDB > data
(1) ObjectId() { 7 fields } Object
(2) ObjectId() { 7 fields } Object
(3) ObjectId() { 7 fields } Object
(4) ObjectId() { 7 fields } Object
(5) ObjectId() { 7 fields } Object
(6) ObjectId() { 7 fields } Object
(7) ObjectId() { 7 fields } Object
(8) ObjectId() { 7 fields } Object
game-backend
{	
				"_id"	:	ObjectId(),	
				"x"	:	435,	
				"y"	:	377,	
				"z"	:	0,	
				“color"	:	"#5b8c9c",	
				"name"	:	null,	
				"updated"	:	ISODate()	
}
get(x, y, z, r)
set(x, y, z)
r
Protocol
1 2 3 …
N32
32
game-frontend mongoDB > data
(1) ObjectId() { 7 fields } Object
(2) ObjectId() { 7 fields } Object
(3) ObjectId() { 7 fields } Object
(4) ObjectId() { 7 fields } Object
(5) ObjectId() { 7 fields } Object
(6) ObjectId() { 7 fields } Object
(7) ObjectId() { 7 fields } Object
(8) ObjectId() { 7 fields } Object
game-backend
updated()
(1) ObjectId() { 7 fields } Object
(2) ObjectId() { 7 fields } Object
{	
				"_id"	:	ObjectId(),	
				"x"	:	435,	
				"y"	:	377,	
				"z"	:	0,	
				“color"	:	"#5b8c9c",	
				"name"	:	null,	
				"updated"	:	ISODate()	
}
get(x, y, z, r)
set(x, y, z)
r
Protocol
1 2 3 …
N32
32
game-frontend mongoDB > data
(1) ObjectId() { 7 fields } Object
(2) ObjectId() { 7 fields } Object
(3) ObjectId() { 7 fields } Object
(4) ObjectId() { 7 fields } Object
(5) ObjectId() { 7 fields } Object
(6) ObjectId() { 7 fields } Object
(7) ObjectId() { 7 fields } Object
(8) ObjectId() { 7 fields } Object
game-backend
updated()
(1) ObjectId() { 7 fields } Object
(2) ObjectId() { 7 fields } Object
userActivity()
“{Username} joined the game” String
{	
				"_id"	:	ObjectId(),	
				"x"	:	435,	
				"y"	:	377,	
				"z"	:	0,	
				“color"	:	"#5b8c9c",	
				"name"	:	null,	
				"updated"	:	ISODate()	
}
get(x, y, z, r)
set(x, y, z)
r
Architecture
MongoDBgame-backendgame-frontend
+
Architecture
MongoDBgame-backendgame-frontend
WebSocket
+
Architecture
MongoDBgame-backendgame-frontend
WebSocket
+
+
Architecture
MongoDBgame-backendgame-frontend
WebSocket
+
+
HTTP
Architecture
MongoDBgame-backendgame-frontend
WebSocket
+
+
HTTP
Game-backend
Game-backend
Python 3.6 + aiohttp
Game-backend
Python 3.6 + aiohttp
uvloop
implemented in Cython and uses libuv
Game-backend
Python 3.6 + aiohttp
uvloop
implemented in Cython and uses libuv
motor
full-featured, non-blocking MongoDB driver for Python
Game-backend
Python 3.6 + aiohttp
uvloop
implemented in Cython and uses libuv
motor
full-featured, non-blocking MongoDB driver for Python
gunicorn
Python WSGI HTTP Server for UNIX
MongoDBgame-backendgame-frontend
WebSocket
+
+
HTTP
Architecture
MongoDBgame-backendgame-frontend
WebSocket
+
+
HTTP
Architecture
Game-frontend
Game-frontend
Native JavaScript and WebGL?
Game-frontend
Native JavaScript and WebGL?Native JavaScript and WebGL?
Game-frontend
Native JavaScript and WebGL?Native JavaScript and WebGL?
Voxel.js
an open source voxel game building toolkit for modern web browsers
Game-frontend
Native JavaScript and WebGL?Native JavaScript and WebGL?
Voxel.js
an open source voxel game building toolkit for modern web browsers
a-la minecraft world (X, Y, Z)
Game-frontend
Native JavaScript and WebGL?Native JavaScript and WebGL?
Voxel.js
an open source voxel game building toolkit for modern web browsers
a-la minecraft world (X, Y, Z)
voxels (blocks) / chunks
Game-frontend
Native JavaScript and WebGL?Native JavaScript and WebGL?
Voxel.js
an open source voxel game building toolkit for modern web browsers
a-la minecraft world (X, Y, Z)
voxels (blocks) / chunks
AABB: Bounding volume
Game-frontend
Native JavaScript and WebGL?Native JavaScript and WebGL?
Voxel.js
an open source voxel game building toolkit for modern web browsers
a-la minecraft world (X, Y, Z)
voxels (blocks) / chunks
AABB: Bounding volume
A 3D model with its bounding box drawn in dashed lines.
Game-frontend
Native JavaScript and WebGL?Native JavaScript and WebGL?
Voxel.js
an open source voxel game building toolkit for modern web browsers
a-la minecraft world (X, Y, Z)
voxels (blocks) / chunks
AABB: Bounding volume
Game-frontend
Native JavaScript and WebGL?Native JavaScript and WebGL?
Voxel.js
an open source voxel game building toolkit for modern web browsers
a-la minecraft world (X, Y, Z)
voxels (blocks) / chunks
Ray castingAABB: Bounding volume
Game-frontend
Native JavaScript and WebGL?Native JavaScript and WebGL?
Voxel.js
an open source voxel game building toolkit for modern web browsers
a-la minecraft world (X, Y, Z)
voxels (blocks) / chunks
Ray castingAABB: Bounding volume
Ray casting
Game-frontend
Native JavaScript and WebGL?Native JavaScript and WebGL?
Voxel.js
an open source voxel game building toolkit for modern web browsers
a-la minecraft world (X, Y, Z)
voxels (blocks) / chunks
Ray castingAABB: Bounding volume
Game-frontend
Native JavaScript and WebGL?Native JavaScript and WebGL?
Voxel.js
an open source voxel game building toolkit for modern web browsers
a-la minecraft world (X, Y, Z)
voxels (blocks) / chunks
Ray castingAABB: Bounding volume Textures
Game-frontend
Native JavaScript and WebGL?Native JavaScript and WebGL?
Voxel.js
an open source voxel game building toolkit for modern web browsers
a-la minecraft world (X, Y, Z)
voxels (blocks) / chunks
Ray castingAABB: Bounding volume
player with controls
Textures
Game-frontend
Native JavaScript and WebGL?Native JavaScript and WebGL?
Voxel.js
an open source voxel game building toolkit for modern web browsers
a-la minecraft world (X, Y, Z)
voxels (blocks) / chunks
Ray casting
game events (tick/setBlock/collision/renderChunk)
AABB: Bounding volume
player with controls
Textures
Game-frontend
voxel.js
your
code
Game-frontend
voxel.js
your
code
three.js
Game-frontend
voxel.js
your
code
three.js WebGL
Browser
Game-frontend
voxel.js
your
code
three.js WebGL
Browser
Hardware OpenGL
Driver
Display Mngt System
Game-frontend
voxel.js
your
code
three.js WebGL
Browser
Hardware OpenGL
Driver
Display Mngt System
Creating the scene
Game-frontend
voxel.js
your
code
three.js WebGL
Browser
Hardware OpenGL
Driver
Display Mngt System
Creating the scene
var	scene	=	new	THREE.Scene();	
var	camera	=	new	THREE.PerspectiveCamera(	75,	window.innerWidth	/	
window.innerHeight,	0.1,	1000	);	
var	renderer	=	new	THREE.WebGLRenderer();	
renderer.setSize(	window.innerWidth,	window.innerHeight	);	
document.body.appendChild(	renderer.domElement	);	
var	geometry	=	new	THREE.BoxGeometry(	1,	1,	1	);	
var	material	=	new	THREE.MeshBasicMaterial(	{	color:	0x00ff00	}	);	
var	cube	=	new	THREE.Mesh(	geometry,	material	);	
scene.add(	cube	);	
function	animate()	{	
	 requestAnimationFrame(	animate	);	
	 renderer.render(	scene,	camera	);	
}
Game-frontend
voxel.js
your
code
three.js WebGL
Browser
Hardware OpenGL
Driver
Display Mngt System
Creating the scene
var	scene	=	new	THREE.Scene();	
var	camera	=	new	THREE.PerspectiveCamera(	75,	window.innerWidth	/	
window.innerHeight,	0.1,	1000	);	
var	renderer	=	new	THREE.WebGLRenderer();	
renderer.setSize(	window.innerWidth,	window.innerHeight	);	
document.body.appendChild(	renderer.domElement	);	
var	geometry	=	new	THREE.BoxGeometry(	1,	1,	1	);	
var	material	=	new	THREE.MeshBasicMaterial(	{	color:	0x00ff00	}	);	
var	cube	=	new	THREE.Mesh(	geometry,	material	);	
scene.add(	cube	);	
function	animate()	{	
	 requestAnimationFrame(	animate	);	
	 renderer.render(	scene,	camera	);	
}
Game-frontend
voxel.js
your
code
three.js WebGL
Browser
Hardware OpenGL
Driver
Display Mngt System
Creating the scene
var	scene	=	new	THREE.Scene();	
var	camera	=	new	THREE.PerspectiveCamera(	75,	window.innerWidth	/	
window.innerHeight,	0.1,	1000	);	
var	renderer	=	new	THREE.WebGLRenderer();	
renderer.setSize(	window.innerWidth,	window.innerHeight	);	
document.body.appendChild(	renderer.domElement	);	
var	geometry	=	new	THREE.BoxGeometry(	1,	1,	1	);	
var	material	=	new	THREE.MeshBasicMaterial(	{	color:	0x00ff00	}	);	
var	cube	=	new	THREE.Mesh(	geometry,	material	);	
scene.add(	cube	);	
function	animate()	{	
	 requestAnimationFrame(	animate	);	
	 renderer.render(	scene,	camera	);	
}
Game-frontend
voxel.js
your
code
three.js WebGL
Browser
Hardware OpenGL
Driver
Display Mngt System
Creating the scene
var	scene	=	new	THREE.Scene();	
var	camera	=	new	THREE.PerspectiveCamera(	75,	window.innerWidth	/	
window.innerHeight,	0.1,	1000	);	
var	renderer	=	new	THREE.WebGLRenderer();	
renderer.setSize(	window.innerWidth,	window.innerHeight	);	
document.body.appendChild(	renderer.domElement	);	
var	geometry	=	new	THREE.BoxGeometry(	1,	1,	1	);	
var	material	=	new	THREE.MeshBasicMaterial(	{	color:	0x00ff00	}	);	
var	cube	=	new	THREE.Mesh(	geometry,	material	);	
scene.add(	cube	);	
function	animate()	{	
	 requestAnimationFrame(	animate	);	
	 renderer.render(	scene,	camera	);	
}
Game-frontend
voxel.js
your
code
three.js WebGL
Browser
Hardware OpenGL
Driver
Display Mngt System
Creating the scene
var	scene	=	new	THREE.Scene();	
var	camera	=	new	THREE.PerspectiveCamera(	75,	window.innerWidth	/	
window.innerHeight,	0.1,	1000	);	
var	renderer	=	new	THREE.WebGLRenderer();	
renderer.setSize(	window.innerWidth,	window.innerHeight	);	
document.body.appendChild(	renderer.domElement	);	
var	geometry	=	new	THREE.BoxGeometry(	1,	1,	1	);	
var	material	=	new	THREE.MeshBasicMaterial(	{	color:	0x00ff00	}	);	
var	cube	=	new	THREE.Mesh(	geometry,	material	);	
scene.add(	cube	);	
function	animate()	{	
	 requestAnimationFrame(	animate	);	
	 renderer.render(	scene,	camera	);	
}
Game-frontend
voxel.js
your
code
three.js WebGL
Browser
Hardware OpenGL
Driver
Display Mngt System
Creating the scene
var	scene	=	new	THREE.Scene();	
var	camera	=	new	THREE.PerspectiveCamera(	75,	window.innerWidth	/	
window.innerHeight,	0.1,	1000	);	
var	renderer	=	new	THREE.WebGLRenderer();	
renderer.setSize(	window.innerWidth,	window.innerHeight	);	
document.body.appendChild(	renderer.domElement	);	
var	geometry	=	new	THREE.BoxGeometry(	1,	1,	1	);	
var	material	=	new	THREE.MeshBasicMaterial(	{	color:	0x00ff00	}	);	
var	cube	=	new	THREE.Mesh(	geometry,	material	);	
scene.add(	cube	);	
function	animate()	{	
	 requestAnimationFrame(	animate	);	
	 renderer.render(	scene,	camera	);	
}
AR VR
AR VR
AR VR
AR VR
AR VR
Oculus Rift CV1
Oculus Rift
Oculus Rift
+ it’s true VR
Oculus Rift
+ resolution and refresh rate
+ it’s true VR
Oculus Rift
+ resolution and refresh rate
+ it’s true VR
+ very comfortable
Oculus Rift
- too numerous wires
+ resolution and refresh rate
+ it’s true VR
+ very comfortable
Oculus Rift
- no SDK for macOS/Linux
- too numerous wires
+ resolution and refresh rate
+ it’s true VR
+ very comfortable
Oculus Rift
- no SDK for macOS/Linux
- NVIDIA GTX 970 / AMD 290 +
- too numerous wires
+ resolution and refresh rate
+ it’s true VR
+ very comfortable
A-Frame
virtual reality framework
A-Frame
virtual reality framework
works on Vive, Rift, Daydream, GearVR, desktop
A-Frame
virtual reality framework
works on Vive, Rift, Daydream, GearVR, desktop
based on top of HTML
A-Frame
virtual reality framework
works on Vive, Rift, Daydream, GearVR, desktop
based on top of HTML
<html>	
		<head>	
				<script	src="https://aframe.io/releases/0.7.0/aframe.min.js"></script>	
		</head>	
		<body>	
				<a-scene>	
						<a-box	position="-1	0.5	-3"	rotation="0	45	0"	color="#4CC3D9"></a-box>	
						<a-sphere	position="0	1.25	-5"	radius="1.25"	color="#EF2D5E"></a-sphere>	
						<a-cylinder	position="1	0.75	-3"	radius="0.5"	height="1.5"	color="#FFC65D"></a-cylinder>	
						<a-plane	position="0	0	-4"	rotation="-90	0	0"	width="4"	height="4"	color="#7BC8A4"></a-plane>	
						<a-sky	color="#ECECEC"></a-sky>	
				</a-scene>	
		</body>	
</html>
A-Frame
virtual reality framework
works on Vive, Rift, Daydream, GearVR, desktop
based on top of HTML
<html>	
		<head>	
				<script	src="https://aframe.io/releases/0.7.0/aframe.min.js"></script>	
		</head>	
		<body>	
				<a-scene>	
						<a-box	position="-1	0.5	-3"	rotation="0	45	0"	color="#4CC3D9"></a-box>	
						<a-sphere	position="0	1.25	-5"	radius="1.25"	color="#EF2D5E"></a-sphere>	
						<a-cylinder	position="1	0.75	-3"	radius="0.5"	height="1.5"	color="#FFC65D"></a-cylinder>	
						<a-plane	position="0	0	-4"	rotation="-90	0	0"	width="4"	height="4"	color="#7BC8A4"></a-plane>	
						<a-sky	color="#ECECEC"></a-sky>	
				</a-scene>	
		</body>	
</html>
MongoDBgame-backendgame-frontend
WebSocket
+
+
Architecture
MongoDBgame-backendgame-frontend
WebSocket
+
Architecture
MongoDBgame-backendgame-frontend
WebSocket
+
Architecture
+
MongoDBgame-backendgame-frontend
WebSocket
+
Architecture
+
game-frontend-vr
WebSocket
MongoDBgame-backendgame-frontend
WebSocket
+
Architecture
+
game-frontend-vr
WebSocket
firebase-auth
HTTP
MongoDBgame-backendgame-frontend
WebSocket
+
Architecture
+
game-frontend-vr
WebSocket
firebase-auth
HTTP
Auth
Auth
Optimizations
Optimizations
Pre-process voxel models
Voxels count ↓ (-78%)
Optimizations
Use Mesher
FPS ↑
Pre-process voxel models
Voxels count ↓ (-78%)
Optimizations
Use Mesher
FPS ↑
Enable compression for WebSocket (RFC 7692)
Traffic ↓ (5MB -> 1.8MB)
Pre-process voxel models
Voxels count ↓ (-78%)
urbn.odn.pwplay
Alex Khaerov
t.me/hayorov
code github.com/TheURBN
try new and have fun
Phew,
Questions?
urbn.odn.pwplay
Alex Khaerov
t.me/hayorov
code github.com/TheURBN
try new and have fun

More Related Content

Similar to Как мы сделали многопользовательскую браузерную игру для HL++ с воксельной графикой / Александр Хаеров (Ingram Micro)

Low Level Graphics & OpenGL
Low Level Graphics & OpenGLLow Level Graphics & OpenGL
Low Level Graphics & OpenGLDominic Farolino
 
Ultizen Presentation
Ultizen PresentationUltizen Presentation
Ultizen Presentationdorrit
 
Knock Knock on GameDev Gate
Knock Knock on GameDev GateKnock Knock on GameDev Gate
Knock Knock on GameDev GateBeMyApp
 
Web Game Development
Web Game DevelopmentWeb Game Development
Web Game DevelopmentSabin Buraga
 
Beyond php - it's not (just) about the code
Beyond php - it's not (just) about the codeBeyond php - it's not (just) about the code
Beyond php - it's not (just) about the codeWim Godden
 
Knock knock on GameDev gateway! - Introduction to Game development
Knock knock on GameDev gateway! - Introduction to Game developmentKnock knock on GameDev gateway! - Introduction to Game development
Knock knock on GameDev gateway! - Introduction to Game developmentMamdouh Tarabishi
 
Intro to Indie Game Development
Intro to Indie Game DevelopmentIntro to Indie Game Development
Intro to Indie Game DevelopmentShahed Chowdhuri
 
Game accessibility at hanze hogeschool
Game accessibility at hanze hogeschoolGame accessibility at hanze hogeschool
Game accessibility at hanze hogeschoolEelke Folmer
 
Letswift18 워크숍#1 스위프트 클린코드와 코드리뷰
Letswift18 워크숍#1 스위프트 클린코드와 코드리뷰Letswift18 워크숍#1 스위프트 클린코드와 코드리뷰
Letswift18 워크숍#1 스위프트 클린코드와 코드리뷰Jung Kim
 
Eight Rules for Making Your First Great Game
Eight Rules for Making Your First Great GameEight Rules for Making Your First Great Game
Eight Rules for Making Your First Great GameNick Pruehs
 
Beyond php it's not (just) about the code
Beyond php   it's not (just) about the codeBeyond php   it's not (just) about the code
Beyond php it's not (just) about the codeWim Godden
 
A search engine in a world of events and microservices - SF Pot @Meetic
A search engine in a world of events and microservices - SF Pot @MeeticA search engine in a world of events and microservices - SF Pot @Meetic
A search engine in a world of events and microservices - SF Pot @MeeticmeeticTech
 
Landscape Of Virtual World Systems
Landscape Of Virtual World SystemsLandscape Of Virtual World Systems
Landscape Of Virtual World SystemsTim Holt
 
MongoDB for Analytics
MongoDB for AnalyticsMongoDB for Analytics
MongoDB for AnalyticsMongoDB
 
Keynote at the 2018 SIGGRAPH Conference on Motion, Interaction and Games
Keynote at the 2018 SIGGRAPH Conference on Motion, Interaction and GamesKeynote at the 2018 SIGGRAPH Conference on Motion, Interaction and Games
Keynote at the 2018 SIGGRAPH Conference on Motion, Interaction and GamesRogelio E. Cardona-Rivera
 

Similar to Как мы сделали многопользовательскую браузерную игру для HL++ с воксельной графикой / Александр Хаеров (Ingram Micro) (20)

Low Level Graphics & OpenGL
Low Level Graphics & OpenGLLow Level Graphics & OpenGL
Low Level Graphics & OpenGL
 
Unity
UnityUnity
Unity
 
Ultizen Presentation
Ultizen PresentationUltizen Presentation
Ultizen Presentation
 
Knock Knock on GameDev Gate
Knock Knock on GameDev GateKnock Knock on GameDev Gate
Knock Knock on GameDev Gate
 
Web Game Development
Web Game DevelopmentWeb Game Development
Web Game Development
 
Beyond php - it's not (just) about the code
Beyond php - it's not (just) about the codeBeyond php - it's not (just) about the code
Beyond php - it's not (just) about the code
 
Knock knock on GameDev gateway! - Introduction to Game development
Knock knock on GameDev gateway! - Introduction to Game developmentKnock knock on GameDev gateway! - Introduction to Game development
Knock knock on GameDev gateway! - Introduction to Game development
 
Intro to Indie Game Development
Intro to Indie Game DevelopmentIntro to Indie Game Development
Intro to Indie Game Development
 
Game accessibility at hanze hogeschool
Game accessibility at hanze hogeschoolGame accessibility at hanze hogeschool
Game accessibility at hanze hogeschool
 
Letswift18 워크숍#1 스위프트 클린코드와 코드리뷰
Letswift18 워크숍#1 스위프트 클린코드와 코드리뷰Letswift18 워크숍#1 스위프트 클린코드와 코드리뷰
Letswift18 워크숍#1 스위프트 클린코드와 코드리뷰
 
Intro
IntroIntro
Intro
 
Eight Rules for Making Your First Great Game
Eight Rules for Making Your First Great GameEight Rules for Making Your First Great Game
Eight Rules for Making Your First Great Game
 
Beyond php it's not (just) about the code
Beyond php   it's not (just) about the codeBeyond php   it's not (just) about the code
Beyond php it's not (just) about the code
 
A search engine in a world of events and microservices - SF Pot @Meetic
A search engine in a world of events and microservices - SF Pot @MeeticA search engine in a world of events and microservices - SF Pot @Meetic
A search engine in a world of events and microservices - SF Pot @Meetic
 
Landscape Of Virtual World Systems
Landscape Of Virtual World SystemsLandscape Of Virtual World Systems
Landscape Of Virtual World Systems
 
Learning with F#
Learning with F#Learning with F#
Learning with F#
 
Intro to Python
Intro to PythonIntro to Python
Intro to Python
 
MongoDB for Analytics
MongoDB for AnalyticsMongoDB for Analytics
MongoDB for Analytics
 
Programmers guide
Programmers guideProgrammers guide
Programmers guide
 
Keynote at the 2018 SIGGRAPH Conference on Motion, Interaction and Games
Keynote at the 2018 SIGGRAPH Conference on Motion, Interaction and GamesKeynote at the 2018 SIGGRAPH Conference on Motion, Interaction and Games
Keynote at the 2018 SIGGRAPH Conference on Motion, Interaction and Games
 

More from Ontico

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...Ontico
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Ontico
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Ontico
 

More from Ontico (20)

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 

Recently uploaded

Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...Call Girls in Nagpur High Profile
 
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur EscortsHigh Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur High Profile
 
UNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its PerformanceUNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its Performancesivaprakash250
 
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...roncy bisnoi
 
AKTU Computer Networks notes --- Unit 3.pdf
AKTU Computer Networks notes ---  Unit 3.pdfAKTU Computer Networks notes ---  Unit 3.pdf
AKTU Computer Networks notes --- Unit 3.pdfankushspencer015
 
The Most Attractive Pune Call Girls Manchar 8250192130 Will You Miss This Cha...
The Most Attractive Pune Call Girls Manchar 8250192130 Will You Miss This Cha...The Most Attractive Pune Call Girls Manchar 8250192130 Will You Miss This Cha...
The Most Attractive Pune Call Girls Manchar 8250192130 Will You Miss This Cha...ranjana rawat
 
Coefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptxCoefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptxAsutosh Ranjan
 
Processing & Properties of Floor and Wall Tiles.pptx
Processing & Properties of Floor and Wall Tiles.pptxProcessing & Properties of Floor and Wall Tiles.pptx
Processing & Properties of Floor and Wall Tiles.pptxpranjaldaimarysona
 
result management system report for college project
result management system report for college projectresult management system report for college project
result management system report for college projectTonystark477637
 
MANUFACTURING PROCESS-II UNIT-1 THEORY OF METAL CUTTING
MANUFACTURING PROCESS-II UNIT-1 THEORY OF METAL CUTTINGMANUFACTURING PROCESS-II UNIT-1 THEORY OF METAL CUTTING
MANUFACTURING PROCESS-II UNIT-1 THEORY OF METAL CUTTINGSIVASHANKAR N
 
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...Christo Ananth
 
MANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLS
MANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLSMANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLS
MANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLSSIVASHANKAR N
 
College Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service NashikCollege Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service NashikCall Girls in Nagpur High Profile
 
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur High Profile
 
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...Dr.Costas Sachpazis
 
Call Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service Nashik
Call Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service NashikCall Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service Nashik
Call Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service NashikCall Girls in Nagpur High Profile
 
UNIT-II FMM-Flow Through Circular Conduits
UNIT-II FMM-Flow Through Circular ConduitsUNIT-II FMM-Flow Through Circular Conduits
UNIT-II FMM-Flow Through Circular Conduitsrknatarajan
 
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur EscortsHigh Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escortsranjana rawat
 

Recently uploaded (20)

Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...
 
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur EscortsHigh Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur Escorts
 
UNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its PerformanceUNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its Performance
 
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
 
AKTU Computer Networks notes --- Unit 3.pdf
AKTU Computer Networks notes ---  Unit 3.pdfAKTU Computer Networks notes ---  Unit 3.pdf
AKTU Computer Networks notes --- Unit 3.pdf
 
The Most Attractive Pune Call Girls Manchar 8250192130 Will You Miss This Cha...
The Most Attractive Pune Call Girls Manchar 8250192130 Will You Miss This Cha...The Most Attractive Pune Call Girls Manchar 8250192130 Will You Miss This Cha...
The Most Attractive Pune Call Girls Manchar 8250192130 Will You Miss This Cha...
 
Coefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptxCoefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptx
 
Processing & Properties of Floor and Wall Tiles.pptx
Processing & Properties of Floor and Wall Tiles.pptxProcessing & Properties of Floor and Wall Tiles.pptx
Processing & Properties of Floor and Wall Tiles.pptx
 
DJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINE
DJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINEDJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINE
DJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINE
 
result management system report for college project
result management system report for college projectresult management system report for college project
result management system report for college project
 
MANUFACTURING PROCESS-II UNIT-1 THEORY OF METAL CUTTING
MANUFACTURING PROCESS-II UNIT-1 THEORY OF METAL CUTTINGMANUFACTURING PROCESS-II UNIT-1 THEORY OF METAL CUTTING
MANUFACTURING PROCESS-II UNIT-1 THEORY OF METAL CUTTING
 
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
 
MANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLS
MANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLSMANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLS
MANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLS
 
College Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service NashikCollege Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
 
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
 
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
 
Call Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service Nashik
Call Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service NashikCall Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service Nashik
Call Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service Nashik
 
UNIT-II FMM-Flow Through Circular Conduits
UNIT-II FMM-Flow Through Circular ConduitsUNIT-II FMM-Flow Through Circular Conduits
UNIT-II FMM-Flow Through Circular Conduits
 
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur EscortsHigh Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
 
Water Industry Process Automation & Control Monthly - April 2024
Water Industry Process Automation & Control Monthly - April 2024Water Industry Process Automation & Control Monthly - April 2024
Water Industry Process Automation & Control Monthly - April 2024
 

Как мы сделали многопользовательскую браузерную игру для HL++ с воксельной графикой / Александр Хаеров (Ingram Micro)