Embed presentation
Downloaded 162 times














![What you might not knowint bufferID = 0; //initializationfor (int i = 0; i < 3; ++i) // allocate data for 3 vbo only, do not upload it{glBindBuffer(vertexBuffer[i]);glBufferData(GL_ARRAY_BUFFER, 0, 0, GL_DYNAMIC_DRAW);}//...glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer[bufferID]);void* ptr = glMapBufferOES(GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES);//update data hereglUnmapBufferOES(GL_ARRAY_BUFFER);++bufferID;if (bufferID == 3) //cycling through 3 buffers{bufferID = 0;}](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2flearniphonegamedevelopment-121008153606-phpapp02%2f75%2fOptimizing-Games-for-Mobiles-15-2048.jpg&f=jpg&w=240)


























![What you might not know• highp – represents 32 bit floating point value• mediump – represents 16 bit floating pointvalue in range of [-65520, 65520]• lowp – 10 bit fixed point values in range of [-2,2] with step of 1/256• Try to give the same precision to all youoperands, because conversion takes some time](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2flearniphonegamedevelopment-121008153606-phpapp02%2f75%2fOptimizing-Games-for-Mobiles-42-2048.jpg&f=jpg&w=240)













![What you might not know__attribute__((always_inline)) void Matrix4ByVec4(constfloat32x4x4_t* __restrict__ mat, const float32x4_t* __restrict__vec, float32x4_t* __restrict__ result){(*result) = vmulq_n_f32((*mat).val[0], (*vec)[0]);(*result) = vmlaq_n_f32((*result), (*mat).val[1], (*vec)[1]);(*result) = vmlaq_n_f32((*result), (*mat).val[2], (*vec)[2]);(*result) = vmlaq_n_f32((*result), (*mat).val[3], (*vec)[3]);}](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2flearniphonegamedevelopment-121008153606-phpapp02%2f75%2fOptimizing-Games-for-Mobiles-56-2048.jpg&f=jpg&w=240)
![What you might not know__attribute__((always_inline)) void Matrix4ByMatrix4(const float32x4x4_t* __restrict__ m1, const float32x4x4_t* __restrict__ m2,float32x4x4_t* __restrict__ r){#ifdef INTRINSICS(*r).val[0] = vmulq_n_f32((*m1).val[0], vgetq_lane_f32((*m2).val[0], 0));(*r).val[1] = vmulq_n_f32((*m1).val[0], vgetq_lane_f32((*m2).val[1], 0));(*r).val[2] = vmulq_n_f32((*m1).val[0], vgetq_lane_f32((*m2).val[2], 0));(*r).val[3] = vmulq_n_f32((*m1).val[0], vgetq_lane_f32((*m2).val[3], 0));(*r).val[0] = vmlaq_n_f32((*r).val[0], (*m1).val[1], vgetq_lane_f32((*m2).val[0], 1));(*r).val[1] = vmlaq_n_f32((*r).val[1], (*m1).val[1], vgetq_lane_f32((*m2).val[1], 1));(*r).val[2] = vmlaq_n_f32((*r).val[2], (*m1).val[1], vgetq_lane_f32((*m2).val[2], 1));(*r).val[3] = vmlaq_n_f32((*r).val[3], (*m1).val[1], vgetq_lane_f32((*m2).val[3], 1));(*r).val[0] = vmlaq_n_f32((*r).val[0], (*m1).val[2], vgetq_lane_f32((*m2).val[0], 2));(*r).val[1] = vmlaq_n_f32((*r).val[1], (*m1).val[2], vgetq_lane_f32((*m2).val[1], 2));(*r).val[2] = vmlaq_n_f32((*r).val[2], (*m1).val[2], vgetq_lane_f32((*m2).val[2], 2));(*r).val[3] = vmlaq_n_f32((*r).val[3], (*m1).val[2], vgetq_lane_f32((*m2).val[3], 2));(*r).val[0] = vmlaq_n_f32((*r).val[0], (*m1).val[3], vgetq_lane_f32((*m2).val[0], 3));(*r).val[1] = vmlaq_n_f32((*r).val[1], (*m1).val[3], vgetq_lane_f32((*m2).val[1], 3));(*r).val[2] = vmlaq_n_f32((*r).val[2], (*m1).val[3], vgetq_lane_f32((*m2).val[2], 3));(*r).val[3] = vmlaq_n_f32((*r).val[3], (*m1).val[3], vgetq_lane_f32((*m2).val[3], 3));}](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2flearniphonegamedevelopment-121008153606-phpapp02%2f75%2fOptimizing-Games-for-Mobiles-57-2048.jpg&f=jpg&w=240)
![What you might not know__asm__ volatile("vldmia %6, { q0-q3 } nt""vldmia %0, { q8-q11 }nt""vmul.f32 q12, q8, d0[0]nt""vmul.f32 q13, q8, d2[0]nt""vmul.f32 q14, q8, d4[0]nt""vmul.f32 q15, q8, d6[0]nt""vmla.f32 q12, q9, d0[1]nt""vmla.f32 q13, q9, d2[1]nt""vmla.f32 q14, q9, d4[1]nt""vmla.f32 q15, q9, d6[1]nt""vmla.f32 q12, q10, d1[0]nt""vmla.f32 q13, q10, d3[0]nt""vmla.f32 q14, q10, d5[0]nt""vmla.f32 q15, q10, d7[0]nt""vmla.f32 q12, q11, d1[1]nt""vmla.f32 q13, q11, d3[1]nt""vmla.f32 q14, q11, d5[1]nt""vmla.f32 q15, q11, d7[1]nt""vldmia %1, { q0-q3 } nt""vmul.f32 q8, q12, d0[0]nt""vmul.f32 q9, q12, d2[0]nt""vmul.f32 q10, q12, d4[0]nt""vmul.f32 q11, q12, d6[0]nt""vmla.f32 q8, q13, d0[1]nt""vmla.f32 q8, q14, d1[0]nt""vmla.f32 q8, q15, d1[1]nt""vmla.f32 q9, q13, d2[1]nt""vmla.f32 q9, q14, d3[0]nt""vmla.f32 q9, q15, d3[1]nt""vmla.f32 q10, q13, d4[1]nt""vmla.f32 q10, q14, d5[0]nt""vmla.f32 q10, q15, d5[1]nt""vmla.f32 q11, q13, d6[1]nt""vmla.f32 q11, q14, d7[0]nt""vmla.f32 q11, q15, d7[1]nt""vstmia %2, { q8 }nt""vstmia %3, { q9 }nt""vstmia %4, { q10 }nt""vstmia %5, { q11 }":: "r" (proj), "r" (squareVertices), "r" (v1), "r" (v2), "r" (v3), "r" (v4), "r" (modelView): "memory", "q0", "q1", "q2", "q3", "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15");](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2flearniphonegamedevelopment-121008153606-phpapp02%2f75%2fOptimizing-Games-for-Mobiles-58-2048.jpg&f=jpg&w=240)

The document discusses optimizing mobile game performance through the understanding of various mobile GPU architectures, including Immediate Mode Rendering (IMR), Tile-Based Rendering (TBR), and Tile-Based Deferred Rendering (TBDR). It offers technical recommendations for rendering techniques, geometry processing, and texture management to enhance efficiency and reduce bandwidth usage. The document further elaborates on best practices for CPU and GPU operations, emphasizing memory management and precision in shader programming.














![What you might not knowint bufferID = 0; //initializationfor (int i = 0; i < 3; ++i) // allocate data for 3 vbo only, do not upload it{glBindBuffer(vertexBuffer[i]);glBufferData(GL_ARRAY_BUFFER, 0, 0, GL_DYNAMIC_DRAW);}//...glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer[bufferID]);void* ptr = glMapBufferOES(GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES);//update data hereglUnmapBufferOES(GL_ARRAY_BUFFER);++bufferID;if (bufferID == 3) //cycling through 3 buffers{bufferID = 0;}](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2flearniphonegamedevelopment-121008153606-phpapp02%2f75%2fOptimizing-Games-for-Mobiles-15-2048.jpg&f=jpg&w=240)


























![What you might not know• highp – represents 32 bit floating point value• mediump – represents 16 bit floating pointvalue in range of [-65520, 65520]• lowp – 10 bit fixed point values in range of [-2,2] with step of 1/256• Try to give the same precision to all youoperands, because conversion takes some time](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2flearniphonegamedevelopment-121008153606-phpapp02%2f75%2fOptimizing-Games-for-Mobiles-42-2048.jpg&f=jpg&w=240)













![What you might not know__attribute__((always_inline)) void Matrix4ByVec4(constfloat32x4x4_t* __restrict__ mat, const float32x4_t* __restrict__vec, float32x4_t* __restrict__ result){(*result) = vmulq_n_f32((*mat).val[0], (*vec)[0]);(*result) = vmlaq_n_f32((*result), (*mat).val[1], (*vec)[1]);(*result) = vmlaq_n_f32((*result), (*mat).val[2], (*vec)[2]);(*result) = vmlaq_n_f32((*result), (*mat).val[3], (*vec)[3]);}](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2flearniphonegamedevelopment-121008153606-phpapp02%2f75%2fOptimizing-Games-for-Mobiles-56-2048.jpg&f=jpg&w=240)
![What you might not know__attribute__((always_inline)) void Matrix4ByMatrix4(const float32x4x4_t* __restrict__ m1, const float32x4x4_t* __restrict__ m2,float32x4x4_t* __restrict__ r){#ifdef INTRINSICS(*r).val[0] = vmulq_n_f32((*m1).val[0], vgetq_lane_f32((*m2).val[0], 0));(*r).val[1] = vmulq_n_f32((*m1).val[0], vgetq_lane_f32((*m2).val[1], 0));(*r).val[2] = vmulq_n_f32((*m1).val[0], vgetq_lane_f32((*m2).val[2], 0));(*r).val[3] = vmulq_n_f32((*m1).val[0], vgetq_lane_f32((*m2).val[3], 0));(*r).val[0] = vmlaq_n_f32((*r).val[0], (*m1).val[1], vgetq_lane_f32((*m2).val[0], 1));(*r).val[1] = vmlaq_n_f32((*r).val[1], (*m1).val[1], vgetq_lane_f32((*m2).val[1], 1));(*r).val[2] = vmlaq_n_f32((*r).val[2], (*m1).val[1], vgetq_lane_f32((*m2).val[2], 1));(*r).val[3] = vmlaq_n_f32((*r).val[3], (*m1).val[1], vgetq_lane_f32((*m2).val[3], 1));(*r).val[0] = vmlaq_n_f32((*r).val[0], (*m1).val[2], vgetq_lane_f32((*m2).val[0], 2));(*r).val[1] = vmlaq_n_f32((*r).val[1], (*m1).val[2], vgetq_lane_f32((*m2).val[1], 2));(*r).val[2] = vmlaq_n_f32((*r).val[2], (*m1).val[2], vgetq_lane_f32((*m2).val[2], 2));(*r).val[3] = vmlaq_n_f32((*r).val[3], (*m1).val[2], vgetq_lane_f32((*m2).val[3], 2));(*r).val[0] = vmlaq_n_f32((*r).val[0], (*m1).val[3], vgetq_lane_f32((*m2).val[0], 3));(*r).val[1] = vmlaq_n_f32((*r).val[1], (*m1).val[3], vgetq_lane_f32((*m2).val[1], 3));(*r).val[2] = vmlaq_n_f32((*r).val[2], (*m1).val[3], vgetq_lane_f32((*m2).val[2], 3));(*r).val[3] = vmlaq_n_f32((*r).val[3], (*m1).val[3], vgetq_lane_f32((*m2).val[3], 3));}](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2flearniphonegamedevelopment-121008153606-phpapp02%2f75%2fOptimizing-Games-for-Mobiles-57-2048.jpg&f=jpg&w=240)
![What you might not know__asm__ volatile("vldmia %6, { q0-q3 } nt""vldmia %0, { q8-q11 }nt""vmul.f32 q12, q8, d0[0]nt""vmul.f32 q13, q8, d2[0]nt""vmul.f32 q14, q8, d4[0]nt""vmul.f32 q15, q8, d6[0]nt""vmla.f32 q12, q9, d0[1]nt""vmla.f32 q13, q9, d2[1]nt""vmla.f32 q14, q9, d4[1]nt""vmla.f32 q15, q9, d6[1]nt""vmla.f32 q12, q10, d1[0]nt""vmla.f32 q13, q10, d3[0]nt""vmla.f32 q14, q10, d5[0]nt""vmla.f32 q15, q10, d7[0]nt""vmla.f32 q12, q11, d1[1]nt""vmla.f32 q13, q11, d3[1]nt""vmla.f32 q14, q11, d5[1]nt""vmla.f32 q15, q11, d7[1]nt""vldmia %1, { q0-q3 } nt""vmul.f32 q8, q12, d0[0]nt""vmul.f32 q9, q12, d2[0]nt""vmul.f32 q10, q12, d4[0]nt""vmul.f32 q11, q12, d6[0]nt""vmla.f32 q8, q13, d0[1]nt""vmla.f32 q8, q14, d1[0]nt""vmla.f32 q8, q15, d1[1]nt""vmla.f32 q9, q13, d2[1]nt""vmla.f32 q9, q14, d3[0]nt""vmla.f32 q9, q15, d3[1]nt""vmla.f32 q10, q13, d4[1]nt""vmla.f32 q10, q14, d5[0]nt""vmla.f32 q10, q15, d5[1]nt""vmla.f32 q11, q13, d6[1]nt""vmla.f32 q11, q14, d7[0]nt""vmla.f32 q11, q15, d7[1]nt""vstmia %2, { q8 }nt""vstmia %3, { q9 }nt""vstmia %4, { q10 }nt""vstmia %5, { q11 }":: "r" (proj), "r" (squareVertices), "r" (v1), "r" (v2), "r" (v3), "r" (v4), "r" (modelView): "memory", "q0", "q1", "q2", "q3", "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15");](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2flearniphonegamedevelopment-121008153606-phpapp02%2f75%2fOptimizing-Games-for-Mobiles-58-2048.jpg&f=jpg&w=240)
