SlideShare a Scribd company logo
Nguyễn Trung Hưng
Firebat Game Studio - VNG
“DON’T RE-INVENT THE WHEEL”
Our old “wheel”: 3D vertex shader
uniform mat4 uVPMatrix;
attribute vec4 aPos;
void main()
{
gl_Position = uVPMatrix * aPos;
}
The old “wheel” was designed for
But we only need
Remake the old “wheel” for 2D
attribute vec2 aPos;
void main()
{
gl_Position = vec4( aPos.x/HALF_WIDTH - 1.0,
1.0 - aPos.y/HALF_HEIGHT,
0.0,
1.0);
}
• Multiply ops: 16
• Add ops: 12
• Total: 28
• Multiply ops: 2
• Add ops: 2
• Total: 4
old “wheel”
28 VS 4
new “wheel”
ETC texture
• Ericsson Texture Compression (ETC)
• 6x compression 0f 24-bit RGB data
• No support images with Alpha component
Source: http://en.wikipedia.org/wiki/Ericsson_Texture_Compression
Old “wheel”: std fragment shader
uniform sampler2D uTexture;
varying mediump vec2 vTexCoord;
void main()
{
gl_FragColor = texture2D(uTexture, vTexCoord);
}
We need a “wheel”
ETC texture + Alpha mask texture = ETC with alpha component
Remake the “wheel” for ETC
uniform sampler2D uTexture;
uniform sampler2D uAlpha;
varying mediump vec2 vTexCoord;
void main()
{
vec4 color = texture2D(uTexture, vTexCoord);
vec4 alpha = texture2D(uAlpha, vTexCoord);
gl_FragColor = vec4(color.rgb, alpha.r);
}
• Texture size: 100M • ETC size: 16.6M
• Alpha mask size: 25M
• Total: 41.6M
old “wheel”
100 VS 42
new “wheel”
How to bind 2 textures
and pass them to
fragment shader ?
Old “wheel” was designed for
But we really need
uniform sampler2D uTexture;
uniform mat4 uColorTransformMatrix;
varying mediump vec2 vTexCoord;
void main()
{
Vector4 color = texture2D(uTexture, vTexCoord);
gl_FragColor = uColorTransformMatrix * color;
}
Remake the old “wheel”
• Textures add: 3 • Textures add: 0
old “wheel”
3 VS 0
new “wheel”
How to make the color
transform matrix?
void CMath::MATRIX_3x3_MULTIPLY(float* A, float* B, float* result)
{
result[0] = A[0]*B[0] +A[3]*B[1] + A[6]*B[2];
result[1] = A[1]*B[0] + A[4]*B[1] + A[7]*B[2];
result[2] = A[2]*B[0]+ A[5]*B[1] + A[8]*B[2];
result[3] = A[0]*B[3]+ A[3]*B[4]+ A[6]*B[5];
result[4] = A[1]*B[3] + A[4]*B[4]+ A[7]*B[5];
result[5] = A[2]*B[3]+ A[5]*B[4]+ A[8]*B[5];
result[6] = A[0]*B[6]+ A[3]*B[7]+ A[6]*B[8];
result[7] = A[1]*B[6] + A[4]*B[7]+ A[7]*B[8];
result[8] = A[2]*B[6]+ A[5]*B[7]+ A[8]*B[8];
}
Our old “wheel”
m11 m12 m13
m21 m22 m23
m31 m32 m33
Old “wheel” was designed for
We only need
m11 m12 m13
m21 m22 m23
0 0 1
Remake the old “wheel”
void CMath::MATRIX_3x3_MULTIPLY(float* A, float* B, float* result)
{
result[0] =A[0]*B[0] + A[3]*B[1] + A[6]*0;
result[1] = A[1]*B[0] + A[4]*B[1] + A[7]*0;
result[2] = 0*B[0] + 0*B[1] + 1*0;
result[3] = A[0]*B[3] + A[3]*B[4] + A[6]*0;
result[4] =A[1]*B[3] + A[4]*B[4] + A[7]*0;
result[5] = 0*B[3] + 0*B[4] + 1*0;
result[6] =A[0]*B[6] + A[3]*B[7] + A[6]*1;
result[7] = A[1]*B[6] + A[4]*B[7] + A[7]*1;
result[8] =0*B[6] + 0*B[7] + 1*1;
}
Remake the old “wheel”
void CMath::MATRIX_3x3_MULTIPLY(float* A, float* B, float* result)
{
result[0] =A[0]*B[0] + A[3]*B[1];
result[1] = A[1]*B[0] + A[4]*B[1];
result[3] = A[0]*B[3] + A[3]*B[4];
result[4] =A[1]*B[3] + A[4]*B[4];
result[6] =A[0]*B[6] + A[3]*B[7] + A[6];
result[7] = A[1]*B[6] + A[4]*B[7] + A[7];
}
• Multiply ops: 27
• Add ops: 18
• Total: 45
• Multiply ops: 12
• Add ops: 8
• Total: 20
old “wheel”
45 VS 20
new “wheel”
1 0 tx
0 1 ty
0 0 1
If the new “wheel” only run on
Remake the old “wheel”
void CMath::MATRIX_3x3_MULTIPLY(float* A, float* B, float* result)
{
result[0] =1*B[0] + 0*B[1];
result[1] = 0*B[0] + 1*B[1];
result[3] = 1*B[3] + 0*B[4];
result[4] =0*B[3] + 1*B[4];
result[6] =1*B[6] + 0*B[7] + A[6];
result[7] = 0*B[6] + 1*B[7] + A[7];
}
Remake the old “wheel”
void CMath::MATRIX_3x3_MULTIPLY(float* A, float* B, float* result)
{
result[0] =B[0];
result[1] = B[1];
result[3] = B[3];
result[4] =B[4];
result[6] =B[6] + A[6];
result[7] = B[7] + A[7];
}
Remake the old “wheel”
void CMath::MATRIX_3x3_TRANSLATE(float* M, float tx, float ty)
{
M[6] += tx;
M[7] += ty;
}
• Multiply ops: 27
• Add ops: 18
• Total: 45
• Multiply ops: 0
• Add ops: 2
• Total: 2
old “wheel”
45 VS 2
new “wheel”
sx 0 0
0 sy 0
0 0 1
If the new “wheel” run on
Remake the old “wheel”
void CMath::MATRIX_3x3_SCALE(float* M, float sx, float sy)
{
M[0] *= sx;
M[1] *= sy;
M[3] *= sx;
M[4] *= sy;
M[6] *= sx;
M[7] *= sy;
}
• Multiply ops: 27
• Add ops: 18
• Total: 45
• Multiply ops: 6
• Add ops: 0
• Total: 6
old “wheel”
45 VS 6
new “wheel”
public float[] MakeImageVertexData(float x, float y, short w, short h)
{
xy[0] = x; xy[1] = y;
xy[2] = x; xy[3] = (h + y);
xy[4] = (w + x); xy[5] = (h + y);
xy[6] = (w + x); xy[7] = y;
}
Our old “wheel”
public void RenderImage(…)
{
glPushMatrix();
glScalef(sx, sy, sz);
glTranslatef(tx, ty, tz);
glRotatef(angle, vx, vy, vz);
…
glVertexPointer(2, GL_FLOAT, 0, vertex_data);
glTexCoordPointer(2, GL_FLOAT, 0, tex_coord);
glDrawElements(GL_TRIANGLES, …);
glPopMatrix();
}
Our old “wheel”
MakeImageVertexData(float x, float y, short w, short h,
float m11, float m12, float m21, float m22)
{
xy[0] = x; xy[1] = y;
xy[2] = h*m12 +x; xy[3] = h*m22 + y;
xy[4] = w*m11 + h*m12 + x; xy[5] = w*m21 + h*m22 + y;
xy[6] = w*m11 + x; xy[7] = w*m21 + y;
}
Remake the old “wheel”
public void RenderImage(…)
{
…
glVertexPointer(2, GL_FLOAT, 0, vertex_data);
glTexCoordPointer(2, GL_FLOAT, 0, tex_coord);
glDrawElements(GL_TRIANGLES, …);
…
}
Remake the old “wheel”
old “wheel”
N VS 0
new “wheel”
Our old “wheel”
• Encode binary content to string (Base64)
• Use HTTP GET method
• Decode url string to binary
Our new “wheel”
• No encode
• Use HTTP POST method
- With “Content-Type: application/octet-stream”
- Maybe with "Content-Encoding: gzip“
- And "Content-MD5: …"
• No decode
HttpURLConnection http_conn = (HttpURLConnection)url.openConnection();
http_conn.setRequestMethod(”POST”);
http_conn.setDoOutput(true);
byte[] final_content = GZIP(_binary_data);
http_conn.setRequestProperty("Content-Type", "application/octet-stream");
http_conn.setRequestProperty("Content-Encoding", "gzip");
http_conn.setRequestProperty("Content-MD5", MD5(final_content));
http_conn.setFixedLengthStreamingMode(final_content.length);
//send the POST content
OutputStream out = http_conn.getOutputStream();
out.write(final_content);
out.close();
old “wheel”
100KB
new “wheel”
48KB
Our old “wheel”
function void UpdateMoney(int delta)
{
int money = ReadDB(“userid_money”);
WriteDB(“userid_money”, money + delta);
}
Old “wheel” was
designed for
single thread
But we need
multi-thread !!!
function void UpdateMoney(int delta)
{
1. int money = ReadDB(“userid_money”);
2. WriteDB(“userid_money”, money + delta);
}
• A:1 => A:2 => B:1 => B:2
• A:1 => B:1 => A:2 => B:2
• A:1 => B:1 => B:2 => A:2
• Thread A: -100$
• Thread B: +100$
class CompareAndSet
{
Object value;
long token;
}
new “wheel”
function boolean UpdateMoney(int delta)
{
1. CAS casMoney = CasReadDB(“userid_money”);
2. return CasWriteDB( “userid_money”,
casMoney.value + delta,
casMoney.token);
}
• A:1(t1) => A:2(t2 = t1++) => B:1(t2) => B:2(t3 = t2++)
• A:1(t1) => B:1(t1) => A:2(t2 = t1++) => B:2(t1 != t2)
new “wheel”
old wheel “earn”
±100$
new wheel “earn”
0$
The “wheel” which
you found on internet,
may be not designed for
your “vehicle”.
My exp
Understand your need if you want to remake your “wheel”.
My exp
Remaking usually helps you get a better result.
My exp
Even when it doesn’t get a better result, it always helps you gain more exp.
My exp

More Related Content

What's hot

The Ring programming language version 1.2 book - Part 48 of 84
The Ring programming language version 1.2 book - Part 48 of 84The Ring programming language version 1.2 book - Part 48 of 84
The Ring programming language version 1.2 book - Part 48 of 84
Mahmoud Samir Fayed
 
The Ring programming language version 1.2 book - Part 46 of 84
The Ring programming language version 1.2 book - Part 46 of 84The Ring programming language version 1.2 book - Part 46 of 84
The Ring programming language version 1.2 book - Part 46 of 84
Mahmoud Samir Fayed
 
The Ring programming language version 1.7 book - Part 72 of 196
The Ring programming language version 1.7 book - Part 72 of 196The Ring programming language version 1.7 book - Part 72 of 196
The Ring programming language version 1.7 book - Part 72 of 196
Mahmoud Samir Fayed
 
The Ring programming language version 1.5.2 book - Part 64 of 181
The Ring programming language version 1.5.2 book - Part 64 of 181The Ring programming language version 1.5.2 book - Part 64 of 181
The Ring programming language version 1.5.2 book - Part 64 of 181
Mahmoud Samir Fayed
 
The Ring programming language version 1.5.3 book - Part 71 of 184
The Ring programming language version 1.5.3 book - Part 71 of 184The Ring programming language version 1.5.3 book - Part 71 of 184
The Ring programming language version 1.5.3 book - Part 71 of 184
Mahmoud Samir Fayed
 
The Ring programming language version 1.2 book - Part 49 of 84
The Ring programming language version 1.2 book - Part 49 of 84The Ring programming language version 1.2 book - Part 49 of 84
The Ring programming language version 1.2 book - Part 49 of 84
Mahmoud Samir Fayed
 
The Ring programming language version 1.8 book - Part 74 of 202
The Ring programming language version 1.8 book - Part 74 of 202The Ring programming language version 1.8 book - Part 74 of 202
The Ring programming language version 1.8 book - Part 74 of 202
Mahmoud Samir Fayed
 
The Ring programming language version 1.2 book - Part 43 of 84
The Ring programming language version 1.2 book - Part 43 of 84The Ring programming language version 1.2 book - Part 43 of 84
The Ring programming language version 1.2 book - Part 43 of 84
Mahmoud Samir Fayed
 
The Ring programming language version 1.5.1 book - Part 60 of 180
The Ring programming language version 1.5.1 book - Part 60 of 180The Ring programming language version 1.5.1 book - Part 60 of 180
The Ring programming language version 1.5.1 book - Part 60 of 180
Mahmoud Samir Fayed
 
The Ring programming language version 1.3 book - Part 43 of 88
The Ring programming language version 1.3 book - Part 43 of 88The Ring programming language version 1.3 book - Part 43 of 88
The Ring programming language version 1.3 book - Part 43 of 88
Mahmoud Samir Fayed
 
The Ring programming language version 1.2 book - Part 47 of 84
The Ring programming language version 1.2 book - Part 47 of 84The Ring programming language version 1.2 book - Part 47 of 84
The Ring programming language version 1.2 book - Part 47 of 84
Mahmoud Samir Fayed
 
MongoDB World 2019: Event Horizon: Meet Albert Einstein As You Move To The Cloud
MongoDB World 2019: Event Horizon: Meet Albert Einstein As You Move To The CloudMongoDB World 2019: Event Horizon: Meet Albert Einstein As You Move To The Cloud
MongoDB World 2019: Event Horizon: Meet Albert Einstein As You Move To The Cloud
MongoDB
 
The Ring programming language version 1.6 book - Part 66 of 189
The Ring programming language version 1.6 book - Part 66 of 189The Ring programming language version 1.6 book - Part 66 of 189
The Ring programming language version 1.6 book - Part 66 of 189
Mahmoud Samir Fayed
 
The Ring programming language version 1.9 book - Part 63 of 210
The Ring programming language version 1.9 book - Part 63 of 210The Ring programming language version 1.9 book - Part 63 of 210
The Ring programming language version 1.9 book - Part 63 of 210
Mahmoud Samir Fayed
 
The Ring programming language version 1.3 book - Part 44 of 88
The Ring programming language version 1.3 book - Part 44 of 88The Ring programming language version 1.3 book - Part 44 of 88
The Ring programming language version 1.3 book - Part 44 of 88
Mahmoud Samir Fayed
 
The Ring programming language version 1.4.1 book - Part 18 of 31
The Ring programming language version 1.4.1 book - Part 18 of 31The Ring programming language version 1.4.1 book - Part 18 of 31
The Ring programming language version 1.4.1 book - Part 18 of 31
Mahmoud Samir Fayed
 
The Ring programming language version 1.2 book - Part 42 of 84
The Ring programming language version 1.2 book - Part 42 of 84The Ring programming language version 1.2 book - Part 42 of 84
The Ring programming language version 1.2 book - Part 42 of 84
Mahmoud Samir Fayed
 
The Ring programming language version 1.9 book - Part 78 of 210
The Ring programming language version 1.9 book - Part 78 of 210The Ring programming language version 1.9 book - Part 78 of 210
The Ring programming language version 1.9 book - Part 78 of 210
Mahmoud Samir Fayed
 
Problem Solving Techniques For Evolutionary Design
Problem Solving Techniques For Evolutionary DesignProblem Solving Techniques For Evolutionary Design
Problem Solving Techniques For Evolutionary Design
Naresh Jain
 
Pixelplant - WebDev Meetup Salzburg
Pixelplant - WebDev Meetup SalzburgPixelplant - WebDev Meetup Salzburg
Pixelplant - WebDev Meetup Salzburgwolframkriesing
 

What's hot (20)

The Ring programming language version 1.2 book - Part 48 of 84
The Ring programming language version 1.2 book - Part 48 of 84The Ring programming language version 1.2 book - Part 48 of 84
The Ring programming language version 1.2 book - Part 48 of 84
 
The Ring programming language version 1.2 book - Part 46 of 84
The Ring programming language version 1.2 book - Part 46 of 84The Ring programming language version 1.2 book - Part 46 of 84
The Ring programming language version 1.2 book - Part 46 of 84
 
The Ring programming language version 1.7 book - Part 72 of 196
The Ring programming language version 1.7 book - Part 72 of 196The Ring programming language version 1.7 book - Part 72 of 196
The Ring programming language version 1.7 book - Part 72 of 196
 
The Ring programming language version 1.5.2 book - Part 64 of 181
The Ring programming language version 1.5.2 book - Part 64 of 181The Ring programming language version 1.5.2 book - Part 64 of 181
The Ring programming language version 1.5.2 book - Part 64 of 181
 
The Ring programming language version 1.5.3 book - Part 71 of 184
The Ring programming language version 1.5.3 book - Part 71 of 184The Ring programming language version 1.5.3 book - Part 71 of 184
The Ring programming language version 1.5.3 book - Part 71 of 184
 
The Ring programming language version 1.2 book - Part 49 of 84
The Ring programming language version 1.2 book - Part 49 of 84The Ring programming language version 1.2 book - Part 49 of 84
The Ring programming language version 1.2 book - Part 49 of 84
 
The Ring programming language version 1.8 book - Part 74 of 202
The Ring programming language version 1.8 book - Part 74 of 202The Ring programming language version 1.8 book - Part 74 of 202
The Ring programming language version 1.8 book - Part 74 of 202
 
The Ring programming language version 1.2 book - Part 43 of 84
The Ring programming language version 1.2 book - Part 43 of 84The Ring programming language version 1.2 book - Part 43 of 84
The Ring programming language version 1.2 book - Part 43 of 84
 
The Ring programming language version 1.5.1 book - Part 60 of 180
The Ring programming language version 1.5.1 book - Part 60 of 180The Ring programming language version 1.5.1 book - Part 60 of 180
The Ring programming language version 1.5.1 book - Part 60 of 180
 
The Ring programming language version 1.3 book - Part 43 of 88
The Ring programming language version 1.3 book - Part 43 of 88The Ring programming language version 1.3 book - Part 43 of 88
The Ring programming language version 1.3 book - Part 43 of 88
 
The Ring programming language version 1.2 book - Part 47 of 84
The Ring programming language version 1.2 book - Part 47 of 84The Ring programming language version 1.2 book - Part 47 of 84
The Ring programming language version 1.2 book - Part 47 of 84
 
MongoDB World 2019: Event Horizon: Meet Albert Einstein As You Move To The Cloud
MongoDB World 2019: Event Horizon: Meet Albert Einstein As You Move To The CloudMongoDB World 2019: Event Horizon: Meet Albert Einstein As You Move To The Cloud
MongoDB World 2019: Event Horizon: Meet Albert Einstein As You Move To The Cloud
 
The Ring programming language version 1.6 book - Part 66 of 189
The Ring programming language version 1.6 book - Part 66 of 189The Ring programming language version 1.6 book - Part 66 of 189
The Ring programming language version 1.6 book - Part 66 of 189
 
The Ring programming language version 1.9 book - Part 63 of 210
The Ring programming language version 1.9 book - Part 63 of 210The Ring programming language version 1.9 book - Part 63 of 210
The Ring programming language version 1.9 book - Part 63 of 210
 
The Ring programming language version 1.3 book - Part 44 of 88
The Ring programming language version 1.3 book - Part 44 of 88The Ring programming language version 1.3 book - Part 44 of 88
The Ring programming language version 1.3 book - Part 44 of 88
 
The Ring programming language version 1.4.1 book - Part 18 of 31
The Ring programming language version 1.4.1 book - Part 18 of 31The Ring programming language version 1.4.1 book - Part 18 of 31
The Ring programming language version 1.4.1 book - Part 18 of 31
 
The Ring programming language version 1.2 book - Part 42 of 84
The Ring programming language version 1.2 book - Part 42 of 84The Ring programming language version 1.2 book - Part 42 of 84
The Ring programming language version 1.2 book - Part 42 of 84
 
The Ring programming language version 1.9 book - Part 78 of 210
The Ring programming language version 1.9 book - Part 78 of 210The Ring programming language version 1.9 book - Part 78 of 210
The Ring programming language version 1.9 book - Part 78 of 210
 
Problem Solving Techniques For Evolutionary Design
Problem Solving Techniques For Evolutionary DesignProblem Solving Techniques For Evolutionary Design
Problem Solving Techniques For Evolutionary Design
 
Pixelplant - WebDev Meetup Salzburg
Pixelplant - WebDev Meetup SalzburgPixelplant - WebDev Meetup Salzburg
Pixelplant - WebDev Meetup Salzburg
 

Viewers also liked

Ogdc 2013 prototyping mobile games
Ogdc 2013 prototyping mobile gamesOgdc 2013 prototyping mobile games
Ogdc 2013 prototyping mobile gamesSon Aris
 
Behind the scene of Cam Gioi's art work
Behind the scene of Cam Gioi's art workBehind the scene of Cam Gioi's art work
Behind the scene of Cam Gioi's art workaction.vn
 
OGDC2013_ How to distribute content to user for social and mobile game_ Mr Gi...
OGDC2013_ How to distribute content to user for social and mobile game_ Mr Gi...OGDC2013_ How to distribute content to user for social and mobile game_ Mr Gi...
OGDC2013_ How to distribute content to user for social and mobile game_ Mr Gi...
ogdc
 
Ogdc 2013 monetization experience
Ogdc 2013 monetization experienceOgdc 2013 monetization experience
Ogdc 2013 monetization experienceSon Aris
 
Ogdc 2013 the importance of in game event
Ogdc 2013 the importance of in game eventOgdc 2013 the importance of in game event
Ogdc 2013 the importance of in game eventSon Aris
 
OGDC2013_Choosing the right database for social & mobile game_Mr Nguyen Thanh...
OGDC2013_Choosing the right database for social & mobile game_Mr Nguyen Thanh...OGDC2013_Choosing the right database for social & mobile game_Mr Nguyen Thanh...
OGDC2013_Choosing the right database for social & mobile game_Mr Nguyen Thanh...
ogdc
 
OGDC2013_ Cross platform game development with html5_ Mr Hoang Dinh Quang
OGDC2013_ Cross platform game development with html5_ Mr Hoang Dinh QuangOGDC2013_ Cross platform game development with html5_ Mr Hoang Dinh Quang
OGDC2013_ Cross platform game development with html5_ Mr Hoang Dinh Quang
ogdc
 
Ogdc 2013 psychology applied 2013
Ogdc 2013 psychology applied 2013Ogdc 2013 psychology applied 2013
Ogdc 2013 psychology applied 2013Son Aris
 

Viewers also liked (8)

Ogdc 2013 prototyping mobile games
Ogdc 2013 prototyping mobile gamesOgdc 2013 prototyping mobile games
Ogdc 2013 prototyping mobile games
 
Behind the scene of Cam Gioi's art work
Behind the scene of Cam Gioi's art workBehind the scene of Cam Gioi's art work
Behind the scene of Cam Gioi's art work
 
OGDC2013_ How to distribute content to user for social and mobile game_ Mr Gi...
OGDC2013_ How to distribute content to user for social and mobile game_ Mr Gi...OGDC2013_ How to distribute content to user for social and mobile game_ Mr Gi...
OGDC2013_ How to distribute content to user for social and mobile game_ Mr Gi...
 
Ogdc 2013 monetization experience
Ogdc 2013 monetization experienceOgdc 2013 monetization experience
Ogdc 2013 monetization experience
 
Ogdc 2013 the importance of in game event
Ogdc 2013 the importance of in game eventOgdc 2013 the importance of in game event
Ogdc 2013 the importance of in game event
 
OGDC2013_Choosing the right database for social & mobile game_Mr Nguyen Thanh...
OGDC2013_Choosing the right database for social & mobile game_Mr Nguyen Thanh...OGDC2013_Choosing the right database for social & mobile game_Mr Nguyen Thanh...
OGDC2013_Choosing the right database for social & mobile game_Mr Nguyen Thanh...
 
OGDC2013_ Cross platform game development with html5_ Mr Hoang Dinh Quang
OGDC2013_ Cross platform game development with html5_ Mr Hoang Dinh QuangOGDC2013_ Cross platform game development with html5_ Mr Hoang Dinh Quang
OGDC2013_ Cross platform game development with html5_ Mr Hoang Dinh Quang
 
Ogdc 2013 psychology applied 2013
Ogdc 2013 psychology applied 2013Ogdc 2013 psychology applied 2013
Ogdc 2013 psychology applied 2013
 

Similar to Ogdc 2013 lets remake the wheel

ECMAScript 6 major changes
ECMAScript 6 major changesECMAScript 6 major changes
ECMAScript 6 major changeshayato
 
Mary Had a Little λ (QCon)
Mary Had a Little λ (QCon)Mary Had a Little λ (QCon)
Mary Had a Little λ (QCon)
Stephen Chin
 
I dont know what is wrong with this roulette program I cant seem.pdf
I dont know what is wrong with this roulette program I cant seem.pdfI dont know what is wrong with this roulette program I cant seem.pdf
I dont know what is wrong with this roulette program I cant seem.pdf
archanaemporium
 
Create a java project that - Draw a circle with three random init.pdf
Create a java project that - Draw a circle with three random init.pdfCreate a java project that - Draw a circle with three random init.pdf
Create a java project that - Draw a circle with three random init.pdf
arihantmobileselepun
 
Planet-HTML5-Game-Engine Javascript Performance Enhancement
Planet-HTML5-Game-Engine Javascript Performance EnhancementPlanet-HTML5-Game-Engine Javascript Performance Enhancement
Planet-HTML5-Game-Engine Javascript Performance Enhancement
up2soul
 
CS101- Introduction to Computing- Lecture 41
CS101- Introduction to Computing- Lecture 41CS101- Introduction to Computing- Lecture 41
CS101- Introduction to Computing- Lecture 41
Bilal Ahmed
 
Scala.io
Scala.ioScala.io
Scala.io
Steve Gury
 
The Ring programming language version 1.5.1 book - Part 28 of 180
The Ring programming language version 1.5.1 book - Part 28 of 180The Ring programming language version 1.5.1 book - Part 28 of 180
The Ring programming language version 1.5.1 book - Part 28 of 180
Mahmoud Samir Fayed
 
An Introduction to Tinkerpop
An Introduction to TinkerpopAn Introduction to Tinkerpop
An Introduction to TinkerpopTakahiro Inoue
 
COMPAPPABCA49085rFunrAP__Practical Number 9 & 10.docx
COMPAPPABCA49085rFunrAP__Practical Number 9 & 10.docxCOMPAPPABCA49085rFunrAP__Practical Number 9 & 10.docx
COMPAPPABCA49085rFunrAP__Practical Number 9 & 10.docx
TashiBhutia12
 
The Ring programming language version 1.5.1 book - Part 44 of 180
The Ring programming language version 1.5.1 book - Part 44 of 180The Ring programming language version 1.5.1 book - Part 44 of 180
The Ring programming language version 1.5.1 book - Part 44 of 180
Mahmoud Samir Fayed
 
Cinemàtica directa e inversa de manipulador
Cinemàtica directa e inversa de manipuladorCinemàtica directa e inversa de manipulador
Cinemàtica directa e inversa de manipulador
c3stor
 
Bindings: the zen of montage
Bindings: the zen of montageBindings: the zen of montage
Bindings: the zen of montageKris Kowal
 
java experiments and programs
java experiments and programsjava experiments and programs
java experiments and programs
Karuppaiyaa123
 
The Ring programming language version 1.5.2 book - Part 29 of 181
The Ring programming language version 1.5.2 book - Part 29 of 181The Ring programming language version 1.5.2 book - Part 29 of 181
The Ring programming language version 1.5.2 book - Part 29 of 181
Mahmoud Samir Fayed
 
Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語
ikdysfm
 
Михаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STLМихаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STL
Sergey Platonov
 
The Ring programming language version 1.7 book - Part 48 of 196
The Ring programming language version 1.7 book - Part 48 of 196The Ring programming language version 1.7 book - Part 48 of 196
The Ring programming language version 1.7 book - Part 48 of 196
Mahmoud Samir Fayed
 
Browsers with Wings
Browsers with WingsBrowsers with Wings
Browsers with Wings
Remy Sharp
 
The Ring programming language version 1.6 book - Part 70 of 189
The Ring programming language version 1.6 book - Part 70 of 189The Ring programming language version 1.6 book - Part 70 of 189
The Ring programming language version 1.6 book - Part 70 of 189
Mahmoud Samir Fayed
 

Similar to Ogdc 2013 lets remake the wheel (20)

ECMAScript 6 major changes
ECMAScript 6 major changesECMAScript 6 major changes
ECMAScript 6 major changes
 
Mary Had a Little λ (QCon)
Mary Had a Little λ (QCon)Mary Had a Little λ (QCon)
Mary Had a Little λ (QCon)
 
I dont know what is wrong with this roulette program I cant seem.pdf
I dont know what is wrong with this roulette program I cant seem.pdfI dont know what is wrong with this roulette program I cant seem.pdf
I dont know what is wrong with this roulette program I cant seem.pdf
 
Create a java project that - Draw a circle with three random init.pdf
Create a java project that - Draw a circle with three random init.pdfCreate a java project that - Draw a circle with three random init.pdf
Create a java project that - Draw a circle with three random init.pdf
 
Planet-HTML5-Game-Engine Javascript Performance Enhancement
Planet-HTML5-Game-Engine Javascript Performance EnhancementPlanet-HTML5-Game-Engine Javascript Performance Enhancement
Planet-HTML5-Game-Engine Javascript Performance Enhancement
 
CS101- Introduction to Computing- Lecture 41
CS101- Introduction to Computing- Lecture 41CS101- Introduction to Computing- Lecture 41
CS101- Introduction to Computing- Lecture 41
 
Scala.io
Scala.ioScala.io
Scala.io
 
The Ring programming language version 1.5.1 book - Part 28 of 180
The Ring programming language version 1.5.1 book - Part 28 of 180The Ring programming language version 1.5.1 book - Part 28 of 180
The Ring programming language version 1.5.1 book - Part 28 of 180
 
An Introduction to Tinkerpop
An Introduction to TinkerpopAn Introduction to Tinkerpop
An Introduction to Tinkerpop
 
COMPAPPABCA49085rFunrAP__Practical Number 9 & 10.docx
COMPAPPABCA49085rFunrAP__Practical Number 9 & 10.docxCOMPAPPABCA49085rFunrAP__Practical Number 9 & 10.docx
COMPAPPABCA49085rFunrAP__Practical Number 9 & 10.docx
 
The Ring programming language version 1.5.1 book - Part 44 of 180
The Ring programming language version 1.5.1 book - Part 44 of 180The Ring programming language version 1.5.1 book - Part 44 of 180
The Ring programming language version 1.5.1 book - Part 44 of 180
 
Cinemàtica directa e inversa de manipulador
Cinemàtica directa e inversa de manipuladorCinemàtica directa e inversa de manipulador
Cinemàtica directa e inversa de manipulador
 
Bindings: the zen of montage
Bindings: the zen of montageBindings: the zen of montage
Bindings: the zen of montage
 
java experiments and programs
java experiments and programsjava experiments and programs
java experiments and programs
 
The Ring programming language version 1.5.2 book - Part 29 of 181
The Ring programming language version 1.5.2 book - Part 29 of 181The Ring programming language version 1.5.2 book - Part 29 of 181
The Ring programming language version 1.5.2 book - Part 29 of 181
 
Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語
 
Михаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STLМихаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STL
 
The Ring programming language version 1.7 book - Part 48 of 196
The Ring programming language version 1.7 book - Part 48 of 196The Ring programming language version 1.7 book - Part 48 of 196
The Ring programming language version 1.7 book - Part 48 of 196
 
Browsers with Wings
Browsers with WingsBrowsers with Wings
Browsers with Wings
 
The Ring programming language version 1.6 book - Part 70 of 189
The Ring programming language version 1.6 book - Part 70 of 189The Ring programming language version 1.6 book - Part 70 of 189
The Ring programming language version 1.6 book - Part 70 of 189
 

More from Son Aris

Main land china mobile app market 2014. what you need to know
Main land china mobile app market 2014. what you need to knowMain land china mobile app market 2014. what you need to know
Main land china mobile app market 2014. what you need to know
Son Aris
 
Vietnam Digital Marketing Market Overview
Vietnam Digital Marketing Market OverviewVietnam Digital Marketing Market Overview
Vietnam Digital Marketing Market OverviewSon Aris
 
Mobile Game In China 2013-2014
Mobile Game In China 2013-2014Mobile Game In China 2013-2014
Mobile Game In China 2013-2014Son Aris
 
Japans social gaming market 2013
Japans social gaming market 2013Japans social gaming market 2013
Japans social gaming market 2013Son Aris
 
In mobi app_insight_report
In mobi app_insight_reportIn mobi app_insight_report
In mobi app_insight_reportSon Aris
 
Ogdc 2013 am i ready to go startup
Ogdc 2013 am i ready to go startupOgdc 2013 am i ready to go startup
Ogdc 2013 am i ready to go startupSon Aris
 
Ogdc 2013 zing me mobile
Ogdc 2013 zing me mobileOgdc 2013 zing me mobile
Ogdc 2013 zing me mobileSon Aris
 
Ogdc 2013 spine anim20131
Ogdc 2013 spine anim20131Ogdc 2013 spine anim20131
Ogdc 2013 spine anim20131Son Aris
 
Ogdc 2013 network stragegy for mmo game
Ogdc 2013 network stragegy for mmo gameOgdc 2013 network stragegy for mmo game
Ogdc 2013 network stragegy for mmo gameSon Aris
 
Ogdc 2013 mobile game trend in southeastasia
Ogdc 2013 mobile game trend in southeastasiaOgdc 2013 mobile game trend in southeastasia
Ogdc 2013 mobile game trend in southeastasiaSon Aris
 
Ogdc 2013 how to distribute content touser for social and mobile game
Ogdc 2013 how to distribute content touser for social and mobile gameOgdc 2013 how to distribute content touser for social and mobile game
Ogdc 2013 how to distribute content touser for social and mobile gameSon Aris
 
Ogdc 2013 how retention rate affects aniworld
Ogdc 2013 how retention rate affects aniworldOgdc 2013 how retention rate affects aniworld
Ogdc 2013 how retention rate affects aniworldSon Aris
 
Ogdc 2013 game design problem solving
Ogdc 2013 game design problem solvingOgdc 2013 game design problem solving
Ogdc 2013 game design problem solvingSon Aris
 
Ogdc 2013 choosing the right database for social mobile game
Ogdc 2013 choosing the right database for social mobile gameOgdc 2013 choosing the right database for social mobile game
Ogdc 2013 choosing the right database for social mobile gameSon Aris
 
Ogdc 2013 cross platform game development with html5
Ogdc 2013 cross platform game development with html5Ogdc 2013 cross platform game development with html5
Ogdc 2013 cross platform game development with html5Son Aris
 
Ogdc 2013 cross platform game development for mobile web
Ogdc 2013 cross platform game development for mobile webOgdc 2013 cross platform game development for mobile web
Ogdc 2013 cross platform game development for mobile webSon Aris
 
Ogdc 2013 2d artist the first steps
Ogdc 2013 2d artist the first stepsOgdc 2013 2d artist the first steps
Ogdc 2013 2d artist the first stepsSon Aris
 
The story inside art of camgioi
The story inside art of camgioiThe story inside art of camgioi
The story inside art of camgioiSon Aris
 
Scrum model in game development
Scrum model in game developmentScrum model in game development
Scrum model in game developmentSon Aris
 
Recruiting and developing hr in o game studio
Recruiting and developing hr in o game studioRecruiting and developing hr in o game studio
Recruiting and developing hr in o game studioSon Aris
 

More from Son Aris (20)

Main land china mobile app market 2014. what you need to know
Main land china mobile app market 2014. what you need to knowMain land china mobile app market 2014. what you need to know
Main land china mobile app market 2014. what you need to know
 
Vietnam Digital Marketing Market Overview
Vietnam Digital Marketing Market OverviewVietnam Digital Marketing Market Overview
Vietnam Digital Marketing Market Overview
 
Mobile Game In China 2013-2014
Mobile Game In China 2013-2014Mobile Game In China 2013-2014
Mobile Game In China 2013-2014
 
Japans social gaming market 2013
Japans social gaming market 2013Japans social gaming market 2013
Japans social gaming market 2013
 
In mobi app_insight_report
In mobi app_insight_reportIn mobi app_insight_report
In mobi app_insight_report
 
Ogdc 2013 am i ready to go startup
Ogdc 2013 am i ready to go startupOgdc 2013 am i ready to go startup
Ogdc 2013 am i ready to go startup
 
Ogdc 2013 zing me mobile
Ogdc 2013 zing me mobileOgdc 2013 zing me mobile
Ogdc 2013 zing me mobile
 
Ogdc 2013 spine anim20131
Ogdc 2013 spine anim20131Ogdc 2013 spine anim20131
Ogdc 2013 spine anim20131
 
Ogdc 2013 network stragegy for mmo game
Ogdc 2013 network stragegy for mmo gameOgdc 2013 network stragegy for mmo game
Ogdc 2013 network stragegy for mmo game
 
Ogdc 2013 mobile game trend in southeastasia
Ogdc 2013 mobile game trend in southeastasiaOgdc 2013 mobile game trend in southeastasia
Ogdc 2013 mobile game trend in southeastasia
 
Ogdc 2013 how to distribute content touser for social and mobile game
Ogdc 2013 how to distribute content touser for social and mobile gameOgdc 2013 how to distribute content touser for social and mobile game
Ogdc 2013 how to distribute content touser for social and mobile game
 
Ogdc 2013 how retention rate affects aniworld
Ogdc 2013 how retention rate affects aniworldOgdc 2013 how retention rate affects aniworld
Ogdc 2013 how retention rate affects aniworld
 
Ogdc 2013 game design problem solving
Ogdc 2013 game design problem solvingOgdc 2013 game design problem solving
Ogdc 2013 game design problem solving
 
Ogdc 2013 choosing the right database for social mobile game
Ogdc 2013 choosing the right database for social mobile gameOgdc 2013 choosing the right database for social mobile game
Ogdc 2013 choosing the right database for social mobile game
 
Ogdc 2013 cross platform game development with html5
Ogdc 2013 cross platform game development with html5Ogdc 2013 cross platform game development with html5
Ogdc 2013 cross platform game development with html5
 
Ogdc 2013 cross platform game development for mobile web
Ogdc 2013 cross platform game development for mobile webOgdc 2013 cross platform game development for mobile web
Ogdc 2013 cross platform game development for mobile web
 
Ogdc 2013 2d artist the first steps
Ogdc 2013 2d artist the first stepsOgdc 2013 2d artist the first steps
Ogdc 2013 2d artist the first steps
 
The story inside art of camgioi
The story inside art of camgioiThe story inside art of camgioi
The story inside art of camgioi
 
Scrum model in game development
Scrum model in game developmentScrum model in game development
Scrum model in game development
 
Recruiting and developing hr in o game studio
Recruiting and developing hr in o game studioRecruiting and developing hr in o game studio
Recruiting and developing hr in o game studio
 

Recently uploaded

Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Product School
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Jeffrey Haguewood
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
ControlCase
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
Jemma Hussein Allen
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
Product School
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Product School
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
Alan Dix
 
Accelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish CachingAccelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish Caching
Thijs Feryn
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Inflectra
 
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Ramesh Iyer
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
RTTS
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
Laura Byrne
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Thierry Lestable
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Product School
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
KatiaHIMEUR1
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
91mobiles
 
UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3
DianaGray10
 

Recently uploaded (20)

Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
 
Accelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish CachingAccelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish Caching
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
 
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
 
UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3
 

Ogdc 2013 lets remake the wheel

  • 1. Nguyễn Trung Hưng Firebat Game Studio - VNG
  • 3.
  • 4.
  • 5.
  • 6. Our old “wheel”: 3D vertex shader uniform mat4 uVPMatrix; attribute vec4 aPos; void main() { gl_Position = uVPMatrix * aPos; }
  • 7. The old “wheel” was designed for
  • 8. But we only need
  • 9. Remake the old “wheel” for 2D attribute vec2 aPos; void main() { gl_Position = vec4( aPos.x/HALF_WIDTH - 1.0, 1.0 - aPos.y/HALF_HEIGHT, 0.0, 1.0); }
  • 10. • Multiply ops: 16 • Add ops: 12 • Total: 28 • Multiply ops: 2 • Add ops: 2 • Total: 4 old “wheel” 28 VS 4 new “wheel”
  • 11.
  • 12. ETC texture • Ericsson Texture Compression (ETC) • 6x compression 0f 24-bit RGB data • No support images with Alpha component Source: http://en.wikipedia.org/wiki/Ericsson_Texture_Compression
  • 13. Old “wheel”: std fragment shader uniform sampler2D uTexture; varying mediump vec2 vTexCoord; void main() { gl_FragColor = texture2D(uTexture, vTexCoord); }
  • 14. We need a “wheel” ETC texture + Alpha mask texture = ETC with alpha component
  • 15. Remake the “wheel” for ETC uniform sampler2D uTexture; uniform sampler2D uAlpha; varying mediump vec2 vTexCoord; void main() { vec4 color = texture2D(uTexture, vTexCoord); vec4 alpha = texture2D(uAlpha, vTexCoord); gl_FragColor = vec4(color.rgb, alpha.r); }
  • 16. • Texture size: 100M • ETC size: 16.6M • Alpha mask size: 25M • Total: 41.6M old “wheel” 100 VS 42 new “wheel”
  • 17. How to bind 2 textures and pass them to fragment shader ?
  • 18.
  • 19. Old “wheel” was designed for
  • 21. uniform sampler2D uTexture; uniform mat4 uColorTransformMatrix; varying mediump vec2 vTexCoord; void main() { Vector4 color = texture2D(uTexture, vTexCoord); gl_FragColor = uColorTransformMatrix * color; } Remake the old “wheel”
  • 22. • Textures add: 3 • Textures add: 0 old “wheel” 3 VS 0 new “wheel”
  • 23. How to make the color transform matrix?
  • 24.
  • 25. void CMath::MATRIX_3x3_MULTIPLY(float* A, float* B, float* result) { result[0] = A[0]*B[0] +A[3]*B[1] + A[6]*B[2]; result[1] = A[1]*B[0] + A[4]*B[1] + A[7]*B[2]; result[2] = A[2]*B[0]+ A[5]*B[1] + A[8]*B[2]; result[3] = A[0]*B[3]+ A[3]*B[4]+ A[6]*B[5]; result[4] = A[1]*B[3] + A[4]*B[4]+ A[7]*B[5]; result[5] = A[2]*B[3]+ A[5]*B[4]+ A[8]*B[5]; result[6] = A[0]*B[6]+ A[3]*B[7]+ A[6]*B[8]; result[7] = A[1]*B[6] + A[4]*B[7]+ A[7]*B[8]; result[8] = A[2]*B[6]+ A[5]*B[7]+ A[8]*B[8]; } Our old “wheel”
  • 26. m11 m12 m13 m21 m22 m23 m31 m32 m33 Old “wheel” was designed for
  • 27. We only need m11 m12 m13 m21 m22 m23 0 0 1
  • 28. Remake the old “wheel” void CMath::MATRIX_3x3_MULTIPLY(float* A, float* B, float* result) { result[0] =A[0]*B[0] + A[3]*B[1] + A[6]*0; result[1] = A[1]*B[0] + A[4]*B[1] + A[7]*0; result[2] = 0*B[0] + 0*B[1] + 1*0; result[3] = A[0]*B[3] + A[3]*B[4] + A[6]*0; result[4] =A[1]*B[3] + A[4]*B[4] + A[7]*0; result[5] = 0*B[3] + 0*B[4] + 1*0; result[6] =A[0]*B[6] + A[3]*B[7] + A[6]*1; result[7] = A[1]*B[6] + A[4]*B[7] + A[7]*1; result[8] =0*B[6] + 0*B[7] + 1*1; }
  • 29. Remake the old “wheel” void CMath::MATRIX_3x3_MULTIPLY(float* A, float* B, float* result) { result[0] =A[0]*B[0] + A[3]*B[1]; result[1] = A[1]*B[0] + A[4]*B[1]; result[3] = A[0]*B[3] + A[3]*B[4]; result[4] =A[1]*B[3] + A[4]*B[4]; result[6] =A[0]*B[6] + A[3]*B[7] + A[6]; result[7] = A[1]*B[6] + A[4]*B[7] + A[7]; }
  • 30. • Multiply ops: 27 • Add ops: 18 • Total: 45 • Multiply ops: 12 • Add ops: 8 • Total: 20 old “wheel” 45 VS 20 new “wheel”
  • 31. 1 0 tx 0 1 ty 0 0 1 If the new “wheel” only run on
  • 32. Remake the old “wheel” void CMath::MATRIX_3x3_MULTIPLY(float* A, float* B, float* result) { result[0] =1*B[0] + 0*B[1]; result[1] = 0*B[0] + 1*B[1]; result[3] = 1*B[3] + 0*B[4]; result[4] =0*B[3] + 1*B[4]; result[6] =1*B[6] + 0*B[7] + A[6]; result[7] = 0*B[6] + 1*B[7] + A[7]; }
  • 33. Remake the old “wheel” void CMath::MATRIX_3x3_MULTIPLY(float* A, float* B, float* result) { result[0] =B[0]; result[1] = B[1]; result[3] = B[3]; result[4] =B[4]; result[6] =B[6] + A[6]; result[7] = B[7] + A[7]; }
  • 34. Remake the old “wheel” void CMath::MATRIX_3x3_TRANSLATE(float* M, float tx, float ty) { M[6] += tx; M[7] += ty; }
  • 35. • Multiply ops: 27 • Add ops: 18 • Total: 45 • Multiply ops: 0 • Add ops: 2 • Total: 2 old “wheel” 45 VS 2 new “wheel”
  • 36. sx 0 0 0 sy 0 0 0 1 If the new “wheel” run on
  • 37. Remake the old “wheel” void CMath::MATRIX_3x3_SCALE(float* M, float sx, float sy) { M[0] *= sx; M[1] *= sy; M[3] *= sx; M[4] *= sy; M[6] *= sx; M[7] *= sy; }
  • 38. • Multiply ops: 27 • Add ops: 18 • Total: 45 • Multiply ops: 6 • Add ops: 0 • Total: 6 old “wheel” 45 VS 6 new “wheel”
  • 39.
  • 40. public float[] MakeImageVertexData(float x, float y, short w, short h) { xy[0] = x; xy[1] = y; xy[2] = x; xy[3] = (h + y); xy[4] = (w + x); xy[5] = (h + y); xy[6] = (w + x); xy[7] = y; } Our old “wheel”
  • 41. public void RenderImage(…) { glPushMatrix(); glScalef(sx, sy, sz); glTranslatef(tx, ty, tz); glRotatef(angle, vx, vy, vz); … glVertexPointer(2, GL_FLOAT, 0, vertex_data); glTexCoordPointer(2, GL_FLOAT, 0, tex_coord); glDrawElements(GL_TRIANGLES, …); glPopMatrix(); } Our old “wheel”
  • 42. MakeImageVertexData(float x, float y, short w, short h, float m11, float m12, float m21, float m22) { xy[0] = x; xy[1] = y; xy[2] = h*m12 +x; xy[3] = h*m22 + y; xy[4] = w*m11 + h*m12 + x; xy[5] = w*m21 + h*m22 + y; xy[6] = w*m11 + x; xy[7] = w*m21 + y; } Remake the old “wheel”
  • 43. public void RenderImage(…) { … glVertexPointer(2, GL_FLOAT, 0, vertex_data); glTexCoordPointer(2, GL_FLOAT, 0, tex_coord); glDrawElements(GL_TRIANGLES, …); … } Remake the old “wheel”
  • 44. old “wheel” N VS 0 new “wheel”
  • 45.
  • 46. Our old “wheel” • Encode binary content to string (Base64) • Use HTTP GET method • Decode url string to binary
  • 47. Our new “wheel” • No encode • Use HTTP POST method - With “Content-Type: application/octet-stream” - Maybe with "Content-Encoding: gzip“ - And "Content-MD5: …" • No decode
  • 48. HttpURLConnection http_conn = (HttpURLConnection)url.openConnection(); http_conn.setRequestMethod(”POST”); http_conn.setDoOutput(true); byte[] final_content = GZIP(_binary_data); http_conn.setRequestProperty("Content-Type", "application/octet-stream"); http_conn.setRequestProperty("Content-Encoding", "gzip"); http_conn.setRequestProperty("Content-MD5", MD5(final_content)); http_conn.setFixedLengthStreamingMode(final_content.length); //send the POST content OutputStream out = http_conn.getOutputStream(); out.write(final_content); out.close();
  • 50.
  • 51. Our old “wheel” function void UpdateMoney(int delta) { int money = ReadDB(“userid_money”); WriteDB(“userid_money”, money + delta); }
  • 52. Old “wheel” was designed for single thread But we need multi-thread !!!
  • 53. function void UpdateMoney(int delta) { 1. int money = ReadDB(“userid_money”); 2. WriteDB(“userid_money”, money + delta); } • A:1 => A:2 => B:1 => B:2 • A:1 => B:1 => A:2 => B:2 • A:1 => B:1 => B:2 => A:2 • Thread A: -100$ • Thread B: +100$
  • 54. class CompareAndSet { Object value; long token; } new “wheel”
  • 55. function boolean UpdateMoney(int delta) { 1. CAS casMoney = CasReadDB(“userid_money”); 2. return CasWriteDB( “userid_money”, casMoney.value + delta, casMoney.token); } • A:1(t1) => A:2(t2 = t1++) => B:1(t2) => B:2(t3 = t2++) • A:1(t1) => B:1(t1) => A:2(t2 = t1++) => B:2(t1 != t2) new “wheel”
  • 56. old wheel “earn” ±100$ new wheel “earn” 0$
  • 57. The “wheel” which you found on internet, may be not designed for your “vehicle”. My exp
  • 58. Understand your need if you want to remake your “wheel”. My exp
  • 59. Remaking usually helps you get a better result. My exp
  • 60. Even when it doesn’t get a better result, it always helps you gain more exp. My exp

Editor's Notes

  1. Vertex Shader - OpenGL ES graphics code for rendering the vertices of a shape.Fragment Shader - OpenGL ES code for rendering the face of a shape with colors or textures.Program - An OpenGL ES object that contains the shaders you want to use for drawing one or more shapes.
  2. What’s ETC ?Why should we use ETC texture ?But ETC don’t support alpha channel !!!
  3. Q&A
  4. Load texturefor (inti = 0 ; i < n ; ++i) { glActiveTexture(GL_TEXTURE0 + i); glBindTexture(GL_TEXTURE_2D, texture_ids[i]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, ...); }Use texturefor (i = 0 ; i < n; ++i) { ... glUniform1i(texture_location, i); ... glDrawElements(...); }
  5. References:http://beesbuzz.biz/code/hsv_color_transforms.phphttp://www.rapidtables.com/convert/color/rgb-to-hsv.htmhttp://www.cs.rit.edu/~ncs/color/t_convert.html