SlideShare a Scribd company logo
1 of 60
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

Pixelplant - WebDev Meetup Salzburg
Pixelplant - WebDev Meetup SalzburgPixelplant - WebDev Meetup Salzburg
Pixelplant - WebDev Meetup Salzburg
wolframkriesing
 

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

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_ Dong Son Art style 2013_ Mr Alviss Ha
OGDC2013_ Dong Son Art style 2013_ Mr Alviss HaOGDC2013_ Dong Son Art style 2013_ Mr Alviss Ha
OGDC2013_ Dong Son Art style 2013_ Mr Alviss Ha
 
OGDC2013_ Sekmeth drawing process_ Mr Nguyen Huy Thien
OGDC2013_ Sekmeth drawing process_ Mr Nguyen Huy ThienOGDC2013_ Sekmeth drawing process_ Mr Nguyen Huy Thien
OGDC2013_ Sekmeth drawing process_ Mr Nguyen Huy Thien
 
OGDC2013_Prototyping mobile games_Mr Chris Morrison
OGDC2013_Prototyping mobile games_Mr Chris MorrisonOGDC2013_Prototyping mobile games_Mr Chris Morrison
OGDC2013_Prototyping mobile games_Mr Chris Morrison
 
OGDC2013_ Farmery2_ Mr Nguyen Quang Lam
OGDC2013_ Farmery2_ Mr Nguyen Quang LamOGDC2013_ Farmery2_ Mr Nguyen Quang Lam
OGDC2013_ Farmery2_ Mr Nguyen Quang Lam
 
Ogdc 2013 psychology applied 2013
Ogdc 2013 psychology applied 2013Ogdc 2013 psychology applied 2013
Ogdc 2013 psychology applied 2013
 

Similar to OGDC2013_Lets remake the wheel_ Mr Nguyen Trung Hung

ECMAScript 6 major changes
ECMAScript 6 major changesECMAScript 6 major changes
ECMAScript 6 major changes
hayato
 
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
 
An Introduction to Tinkerpop
An Introduction to TinkerpopAn Introduction to Tinkerpop
An Introduction to Tinkerpop
Takahiro 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
 
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 montage
Kris Kowal
 

Similar to OGDC2013_Lets remake the wheel_ Mr Nguyen Trung Hung (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 ogdc

OGDC 2014_Entity system in mobile game development_Mr. Cody nguyen
OGDC 2014_Entity system in mobile game development_Mr. Cody nguyenOGDC 2014_Entity system in mobile game development_Mr. Cody nguyen
OGDC 2014_Entity system in mobile game development_Mr. Cody nguyen
ogdc
 
OGDC 2014_Sky Garden Mobile conceptualization: From PC to Mobile_Mr. Luc Hoan...
OGDC 2014_Sky Garden Mobile conceptualization: From PC to Mobile_Mr. Luc Hoan...OGDC 2014_Sky Garden Mobile conceptualization: From PC to Mobile_Mr. Luc Hoan...
OGDC 2014_Sky Garden Mobile conceptualization: From PC to Mobile_Mr. Luc Hoan...
ogdc
 
OGDC 2014_Creativity in Game Design - Case Study: Famous Vietnamese mobile ga...
OGDC 2014_Creativity in Game Design - Case Study: Famous Vietnamese mobile ga...OGDC 2014_Creativity in Game Design - Case Study: Famous Vietnamese mobile ga...
OGDC 2014_Creativity in Game Design - Case Study: Famous Vietnamese mobile ga...
ogdc
 
OGDC 2014_Vietnam Mobile Internet 2014: A focus in smartphone game and compar...
OGDC 2014_Vietnam Mobile Internet 2014: A focus in smartphone game and compar...OGDC 2014_Vietnam Mobile Internet 2014: A focus in smartphone game and compar...
OGDC 2014_Vietnam Mobile Internet 2014: A focus in smartphone game and compar...
ogdc
 
OGDC 2014_Vietnam Smartphone game market 2013 overview. From vision to action...
OGDC 2014_Vietnam Smartphone game market 2013 overview. From vision to action...OGDC 2014_Vietnam Smartphone game market 2013 overview. From vision to action...
OGDC 2014_Vietnam Smartphone game market 2013 overview. From vision to action...
ogdc
 
OGDC 2014_User segmentation and Monetization_Mr. Phat hoang
OGDC 2014_User segmentation and Monetization_Mr. Phat hoangOGDC 2014_User segmentation and Monetization_Mr. Phat hoang
OGDC 2014_User segmentation and Monetization_Mr. Phat hoang
ogdc
 
OGDC 2014_Animation workflow with Spine in Tiny Busters_Mr. Huynh Dong Hai
OGDC 2014_Animation workflow with Spine in Tiny Busters_Mr. Huynh Dong HaiOGDC 2014_Animation workflow with Spine in Tiny Busters_Mr. Huynh Dong Hai
OGDC 2014_Animation workflow with Spine in Tiny Busters_Mr. Huynh Dong Hai
ogdc
 
OGDC 2014_Speed Up and make quality 3D game models_Mr. Pham Duc Duy
OGDC 2014_Speed Up and make quality 3D game models_Mr. Pham Duc DuyOGDC 2014_Speed Up and make quality 3D game models_Mr. Pham Duc Duy
OGDC 2014_Speed Up and make quality 3D game models_Mr. Pham Duc Duy
ogdc
 
OGDC 2014_Architecting Games in Unity_Mr. Rustum Scammell
OGDC 2014_Architecting Games in Unity_Mr. Rustum ScammellOGDC 2014_Architecting Games in Unity_Mr. Rustum Scammell
OGDC 2014_Architecting Games in Unity_Mr. Rustum Scammell
ogdc
 
OGDC 2014_One-Man Studio: How to make a game prototype_Mr. Le Vo Tien Giang
OGDC 2014_One-Man Studio: How to make a game prototype_Mr. Le Vo Tien GiangOGDC 2014_One-Man Studio: How to make a game prototype_Mr. Le Vo Tien Giang
OGDC 2014_One-Man Studio: How to make a game prototype_Mr. Le Vo Tien Giang
ogdc
 
OGDC 2014_Hands on experience with Cocos2dx in cross-platform with Farmery_Mr...
OGDC 2014_Hands on experience with Cocos2dx in cross-platform with Farmery_Mr...OGDC 2014_Hands on experience with Cocos2dx in cross-platform with Farmery_Mr...
OGDC 2014_Hands on experience with Cocos2dx in cross-platform with Farmery_Mr...
ogdc
 
OGDC 2014_Optimize or Die: Key disciplines to optimize your mobile game_Mr. P...
OGDC 2014_Optimize or Die: Key disciplines to optimize your mobile game_Mr. P...OGDC 2014_Optimize or Die: Key disciplines to optimize your mobile game_Mr. P...
OGDC 2014_Optimize or Die: Key disciplines to optimize your mobile game_Mr. P...
ogdc
 
OGDC 2014_Why choosing 2D animation for Mobile Game?_Mr. Joe Tran
OGDC 2014_Why choosing 2D animation for Mobile Game?_Mr. Joe TranOGDC 2014_Why choosing 2D animation for Mobile Game?_Mr. Joe Tran
OGDC 2014_Why choosing 2D animation for Mobile Game?_Mr. Joe Tran
ogdc
 
OGDC 2014_ An artist's story_Mr. Vu Cam Cong Danh
OGDC 2014_ An artist's story_Mr. Vu Cam Cong DanhOGDC 2014_ An artist's story_Mr. Vu Cam Cong Danh
OGDC 2014_ An artist's story_Mr. Vu Cam Cong Danh
ogdc
 
OGDC 2014_Tips and Tricks for seasonal events and community building in Drago...
OGDC 2014_Tips and Tricks for seasonal events and community building in Drago...OGDC 2014_Tips and Tricks for seasonal events and community building in Drago...
OGDC 2014_Tips and Tricks for seasonal events and community building in Drago...
ogdc
 
OGDC 2014_Cross platform mobile game application development_Mr. Makku J.Kero
OGDC 2014_Cross platform mobile game application development_Mr. Makku J.KeroOGDC 2014_Cross platform mobile game application development_Mr. Makku J.Kero
OGDC 2014_Cross platform mobile game application development_Mr. Makku J.Kero
ogdc
 
OGDC 2014_Tips and Tricks for seasonal events and community building in Drago...
OGDC 2014_Tips and Tricks for seasonal events and community building in Drago...OGDC 2014_Tips and Tricks for seasonal events and community building in Drago...
OGDC 2014_Tips and Tricks for seasonal events and community building in Drago...
ogdc
 
OGDC 2014_Business design is game design: 10 bits of business/design wisdom_M...
OGDC 2014_Business design is game design: 10 bits of business/design wisdom_M...OGDC 2014_Business design is game design: 10 bits of business/design wisdom_M...
OGDC 2014_Business design is game design: 10 bits of business/design wisdom_M...
ogdc
 
OGDC 2014_Build your own Particle System_Mr. Nguyen Dang Quang
OGDC 2014_Build your own Particle System_Mr. Nguyen Dang QuangOGDC 2014_Build your own Particle System_Mr. Nguyen Dang Quang
OGDC 2014_Build your own Particle System_Mr. Nguyen Dang Quang
ogdc
 
OGDC 2014_ Game Design: 5 years of painful lessons_Mr. Do Van Thanh
OGDC 2014_ Game Design: 5 years of painful lessons_Mr. Do Van ThanhOGDC 2014_ Game Design: 5 years of painful lessons_Mr. Do Van Thanh
OGDC 2014_ Game Design: 5 years of painful lessons_Mr. Do Van Thanh
ogdc
 

More from ogdc (20)

OGDC 2014_Entity system in mobile game development_Mr. Cody nguyen
OGDC 2014_Entity system in mobile game development_Mr. Cody nguyenOGDC 2014_Entity system in mobile game development_Mr. Cody nguyen
OGDC 2014_Entity system in mobile game development_Mr. Cody nguyen
 
OGDC 2014_Sky Garden Mobile conceptualization: From PC to Mobile_Mr. Luc Hoan...
OGDC 2014_Sky Garden Mobile conceptualization: From PC to Mobile_Mr. Luc Hoan...OGDC 2014_Sky Garden Mobile conceptualization: From PC to Mobile_Mr. Luc Hoan...
OGDC 2014_Sky Garden Mobile conceptualization: From PC to Mobile_Mr. Luc Hoan...
 
OGDC 2014_Creativity in Game Design - Case Study: Famous Vietnamese mobile ga...
OGDC 2014_Creativity in Game Design - Case Study: Famous Vietnamese mobile ga...OGDC 2014_Creativity in Game Design - Case Study: Famous Vietnamese mobile ga...
OGDC 2014_Creativity in Game Design - Case Study: Famous Vietnamese mobile ga...
 
OGDC 2014_Vietnam Mobile Internet 2014: A focus in smartphone game and compar...
OGDC 2014_Vietnam Mobile Internet 2014: A focus in smartphone game and compar...OGDC 2014_Vietnam Mobile Internet 2014: A focus in smartphone game and compar...
OGDC 2014_Vietnam Mobile Internet 2014: A focus in smartphone game and compar...
 
OGDC 2014_Vietnam Smartphone game market 2013 overview. From vision to action...
OGDC 2014_Vietnam Smartphone game market 2013 overview. From vision to action...OGDC 2014_Vietnam Smartphone game market 2013 overview. From vision to action...
OGDC 2014_Vietnam Smartphone game market 2013 overview. From vision to action...
 
OGDC 2014_User segmentation and Monetization_Mr. Phat hoang
OGDC 2014_User segmentation and Monetization_Mr. Phat hoangOGDC 2014_User segmentation and Monetization_Mr. Phat hoang
OGDC 2014_User segmentation and Monetization_Mr. Phat hoang
 
OGDC 2014_Animation workflow with Spine in Tiny Busters_Mr. Huynh Dong Hai
OGDC 2014_Animation workflow with Spine in Tiny Busters_Mr. Huynh Dong HaiOGDC 2014_Animation workflow with Spine in Tiny Busters_Mr. Huynh Dong Hai
OGDC 2014_Animation workflow with Spine in Tiny Busters_Mr. Huynh Dong Hai
 
OGDC 2014_Speed Up and make quality 3D game models_Mr. Pham Duc Duy
OGDC 2014_Speed Up and make quality 3D game models_Mr. Pham Duc DuyOGDC 2014_Speed Up and make quality 3D game models_Mr. Pham Duc Duy
OGDC 2014_Speed Up and make quality 3D game models_Mr. Pham Duc Duy
 
OGDC 2014_Architecting Games in Unity_Mr. Rustum Scammell
OGDC 2014_Architecting Games in Unity_Mr. Rustum ScammellOGDC 2014_Architecting Games in Unity_Mr. Rustum Scammell
OGDC 2014_Architecting Games in Unity_Mr. Rustum Scammell
 
OGDC 2014_One-Man Studio: How to make a game prototype_Mr. Le Vo Tien Giang
OGDC 2014_One-Man Studio: How to make a game prototype_Mr. Le Vo Tien GiangOGDC 2014_One-Man Studio: How to make a game prototype_Mr. Le Vo Tien Giang
OGDC 2014_One-Man Studio: How to make a game prototype_Mr. Le Vo Tien Giang
 
OGDC 2014_Hands on experience with Cocos2dx in cross-platform with Farmery_Mr...
OGDC 2014_Hands on experience with Cocos2dx in cross-platform with Farmery_Mr...OGDC 2014_Hands on experience with Cocos2dx in cross-platform with Farmery_Mr...
OGDC 2014_Hands on experience with Cocos2dx in cross-platform with Farmery_Mr...
 
OGDC 2014_Optimize or Die: Key disciplines to optimize your mobile game_Mr. P...
OGDC 2014_Optimize or Die: Key disciplines to optimize your mobile game_Mr. P...OGDC 2014_Optimize or Die: Key disciplines to optimize your mobile game_Mr. P...
OGDC 2014_Optimize or Die: Key disciplines to optimize your mobile game_Mr. P...
 
OGDC 2014_Why choosing 2D animation for Mobile Game?_Mr. Joe Tran
OGDC 2014_Why choosing 2D animation for Mobile Game?_Mr. Joe TranOGDC 2014_Why choosing 2D animation for Mobile Game?_Mr. Joe Tran
OGDC 2014_Why choosing 2D animation for Mobile Game?_Mr. Joe Tran
 
OGDC 2014_ An artist's story_Mr. Vu Cam Cong Danh
OGDC 2014_ An artist's story_Mr. Vu Cam Cong DanhOGDC 2014_ An artist's story_Mr. Vu Cam Cong Danh
OGDC 2014_ An artist's story_Mr. Vu Cam Cong Danh
 
OGDC 2014_Tips and Tricks for seasonal events and community building in Drago...
OGDC 2014_Tips and Tricks for seasonal events and community building in Drago...OGDC 2014_Tips and Tricks for seasonal events and community building in Drago...
OGDC 2014_Tips and Tricks for seasonal events and community building in Drago...
 
OGDC 2014_Cross platform mobile game application development_Mr. Makku J.Kero
OGDC 2014_Cross platform mobile game application development_Mr. Makku J.KeroOGDC 2014_Cross platform mobile game application development_Mr. Makku J.Kero
OGDC 2014_Cross platform mobile game application development_Mr. Makku J.Kero
 
OGDC 2014_Tips and Tricks for seasonal events and community building in Drago...
OGDC 2014_Tips and Tricks for seasonal events and community building in Drago...OGDC 2014_Tips and Tricks for seasonal events and community building in Drago...
OGDC 2014_Tips and Tricks for seasonal events and community building in Drago...
 
OGDC 2014_Business design is game design: 10 bits of business/design wisdom_M...
OGDC 2014_Business design is game design: 10 bits of business/design wisdom_M...OGDC 2014_Business design is game design: 10 bits of business/design wisdom_M...
OGDC 2014_Business design is game design: 10 bits of business/design wisdom_M...
 
OGDC 2014_Build your own Particle System_Mr. Nguyen Dang Quang
OGDC 2014_Build your own Particle System_Mr. Nguyen Dang QuangOGDC 2014_Build your own Particle System_Mr. Nguyen Dang Quang
OGDC 2014_Build your own Particle System_Mr. Nguyen Dang Quang
 
OGDC 2014_ Game Design: 5 years of painful lessons_Mr. Do Van Thanh
OGDC 2014_ Game Design: 5 years of painful lessons_Mr. Do Van ThanhOGDC 2014_ Game Design: 5 years of painful lessons_Mr. Do Van Thanh
OGDC 2014_ Game Design: 5 years of painful lessons_Mr. Do Van Thanh
 

Recently uploaded

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Recently uploaded (20)

DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdf
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 

OGDC2013_Lets remake the wheel_ Mr Nguyen Trung Hung

  • 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