UnityÏîÄ¿ÓÅ»¯×ܽá

·¢²¼Ê±¼ä : ÐÇÆÚËÄ ÎÄÕÂUnityÏîÄ¿ÓÅ»¯×ܽá¸üÐÂÍê±Ï¿ªÊ¼ÔĶÁ

UnityÏîÄ¿ÓÅ»¯×ܽá

1¡¢IOSÉÁÍËÓÅ»¯

A£ºIOSÉÏC#´úÂëͨ¹ýAOT(Ahead of time)±àÒ룬¶ø²»ÊÇJIT(Just in time)¡£AOTʵÏÖ·´Éä»úÖÆÐèÒªÔ¤ÏÈ·ÖÅäÒ»¿éÄÚ´æ´æÀàµÄÔªÊý¾Ý£¬µ±¹ý¶ÈʹÓ÷ºÐÍʱµ¼ÖÂÀàÔªÊý¾Ý¹ý´ó£¬Ô¤·ÖÅäÄÚ´æ²»¹»¾ÍÉÁÍËÅ׳ö¡°trampoline out of memery¡±Òì³£¡£Ä¬ÈÏnrgctx-trampolines=1024,nimt-trampolines=1024,ntrampolines=512£¬½¨ÒéÓÅ»¯Îªnrgctx-trampolines=2048,nimt-trampolines=2048,ntrampolines=1024¡£ B£ºÂß¼­ÉÏÓÐÒ»Ìõ·¾¶³öÏÖÎÞÏ޵ݹ鵼ÖÂÕ»Òç³öÉÁÍË¡£ C: IOSÉϲ»Ö§³Ö×Ö·û¼¯¡±GBK¡±µ¼ÖÂÉÁÍË£¬¸Ä³É¡°UTF-8¡±¡£ D: ³ÌÐòÂß¼­³öÏÖÁ½¸ö¿ÕÖ¸ÕëÒì³£µ¼ÖÂÉÁÍË¡£

2¡¢ÎÆÀíÓÅ»¯

Ä¿Ç°ÎÆÀí·åÖµÕ¼ÓÃÄܹ»µ½110M£¬ÎÆÀíÆÕ±éѹËõÂʲ»¹»»òûÓÐѹËõ£¬¶øÇÒ³¡¾°Çл»Ò»Ð©×ÊԴδжÔØ£¬µ¼ÖÂÄÚ´æ¸ß¡£ÎÆÀí°üÀ¨ UI ¡¢³¡¾°¡¢ÌØЧ¡¢ÈËÎïÎÆÀíµÈµÈ£¬ÓÅ»¯ºó±£Ö¤ÎÆÀíÔÚ50MÒÔÄÚ£¬ÓÅ»¯·½Ê½ÈçÏ£º

A¡¢ÎÆÀíѹËõ¸ñʽ£º Ä¿Ç°ÎÆÀí¸ñʽҪôûѹËõ£¬ÒªÃ´ÆÕ±é²ÉÓÃAutomatic Compressed£¬Õâ¸ö¸ñʽ½«RGBA 32bitsѹËõΪRGBA16 bits£¬Ñ¹ËõÂʲ»¸ß¡£½¨ÒéÎÆÀíѹËõ¸ñʽÈçÏ£º

Android ƽ̨£º RGBA Compressed ETC1+alpha bits(25%ѹËõÂÊ) IOSƽ̨£º RGBA Compressed PVRTC 4 bits(1/8ѹËõÂÊ)

B¡¢ÎÆÀí»º´æµÄÎÊÌ⣬ Ä¿Ç°³ÌÐòÖ®ÖÐÉèÖõĵ±»úÆ÷¿ÉÓÃÄÚ´æ´óÓÚ50MʱÇл»³¡¾°²»ÊÍ·Å×ÊÔ´£¬µ¼ÖÂһЩ³£×¤ÄÚ´æûÓÐÊÍ·Å¡£½¨Òéµ÷´óÕâ¸ö·§Öµ»òÕßÈ¥µôÕâÖÖ²ßÂÔ¡£ C¡¢½ûÖ¹ÎÆÀíµÄMipMapsÉú³É¡£

D¡¢ÎÆÀí´òͼ¼¯µÄÎÊÌ⣬½¨Òé×°±¸Í¼±êºÍ¼¼ÄÜͼ±ê¶¼´òͼ¼¯£¬½µµÍUI DrawCallºÍIO´ÎÊý¡£²ÉÓÃÎÆÀíѹËõ¸ñʽ£¬Õⲿ·ÖÄÚ´æÕ¼Óò»»áÌ«´ó¡£ ×ܽ᣺ÎÆÀíÓÅ»¯ºó£¬ÎÆÀíÄÚ´æ´Ó72M½µµÍµ½30M¡£

3¡¢ÌØЧÓÅ»¯

Ä¿Ç°Õ½¶·ÌØЧ£¬ÌرðÊÇBOSSµÄÌØЧ£¬ÔÚÁ£×Ó¸öÊý¡¢Á£×Ó·¶Î§¡¢ÌØЧShaderµÈ·½Ãæ×öµÃ±È½ÏºÄ£¬µ¼ÖÂÖ¡ÂÊϽµºÜÀ÷º¦£¬²âÊÔ»úÆ÷ÔÚBOSS·ÅÌØЧʱ´Ó60Ö¡½µµ½ÁË20¶àÖ¡¡£µ¥¸öÁ£×ÓÃæÊý½¨Òé50×óÓÒ£¬Á£×ÓµÄ×ÜÃæÊý400×óÓÒ£¬¾¡Á¿ÉÙÓÃUV¶¯»­ºÍÁ£×ÓÐýת¡£Á£×ÓÊôÓÚ°ë͸£¬ÐèÒª×öAphla Blend£¬Èç¹û·¶Î§¹ý´ó»áµ¼ÖÂÏñËØÌî³äÂÊ(Fill Rate)µÍ£¬Ã¿Ò»Ö¡µÄ´¹Ö±µÈ´ýʱ¼ä³¤£¬½¨ÒéÁ£×Ó·¶Î§²»ÒªÌ«´ó£¬²»Òª¸ãÈ«ÆÁÌØЧ£¬Ò»Ð©±È½Ï¿äÕŵÄЧ¹û¿ÉÒÔͨ¹ýͼÏñºó´¦Àí£¨PostEffect£©ÊµÏÖ¡£ Á£×ÓÌØЧ¹«ÓÃParticles/Addtive Shader ÓÅ»¯½¨ÒéÈçÏÂ:

Shader \Properties {

//_TintColor¿ÉÒÔÓÅ»¯µô

_TintColor (\ _MainTex (\

_InvFade (\

}

SubShader {

Tags { \ Pass {

Tags { \ ZWrite Off Cull Off

Fog {Color (0,0,0,0)} Blend SrcAlpha One

//Alpha Test û±ØÒª£¬¿ÉÓÅ»¯µô AlphaTest Greater 0.01 ColorMask RGB Program \

SubProgram \

Keywords { \\

#ifdef VERTEX

attribute vec4 _glesVertex; attribute vec4 _glesColor;

attribute vec4 _glesMultiTexCoord0; uniform highp mat4 glstate_matrix_mvp;

//¿ØÖÆUV¶¯»­µÄ±äÁ¿£¬ÌØЧÖÐËƺõÒ»°ãÒ²¶¼Ã»Ê¹Óõ½£¬¿ÉÒÔ¿¼ÂÇÓÅ»¯µô uniform highp vec4 _MainTex_ST; varying lowp vec4 xlv_COLOR;

varying highp vec2 xlv_TEXCOORD0; void main () {

gl_Position = (glstate_matrix_mvp * _glesVertex);

xlv_COLOR = _glesColor;

//UV¶¯»­¿ÉÓÅ»¯µô£¬ ÓÅ»¯Îª£ºTEXCOORD0 = _glesMultiTexCoord0.xy

xlv_TEXCOORD0 = ((_glesMultiTexCoord0.xy * _MainTex_ST.xy) + _MainTex_ST.zw); }

#endif

#ifdef FRAGMENT

uniform sampler2D _MainTex; uniform lowp vec4 _TintColor; varying lowp vec4 xlv_COLOR;

varying highp vec2 xlv_TEXCOORD0; void main () {

lowp vec4 tmpvar_1;

// 2.0 * _TintColorĬÈϵÈÓÚVector4.One ¿ÉÓÅ»¯µô£¬Òò´ËÕâÀï3´Î³Ë·¨¿ÉÒÔÓÅ»¯³É1´Î£¬ÓÅ»¯Îª£º //COLOR * texture2D (_MainTex, xlv_TEXCOORD0))

tmpvar_1 = (((2.0 * xlv_COLOR) * _TintColor) * texture2D (_MainTex, xlv_TEXCOORD0)); gl_FragData[0] = tmpvar_1; }

#endif\}

4¡¢Mono¶Ñ³ÌÐòÓÅ»¯

Mono HeapÕ¼ÓõÄÄڴ涼ÊÇC#´úÂëÉêÇëµÄÍйÜÄڴ棬Æä´óСÓë GameObjectÊýÁ¿¡¢×ÊÔ´Á¿Î޹أ¬½öÊÇC#´úÂëÔì³ÉµÄ¡£MonoÏòOSÉêÇëµÄÄÚ´æÔÚ³ÌÐò½áÊøÇ°²»»á»¹¸øOS£¬µ¼ÖÂMono Heap ÎÞ·¨ÊÕËõ£¬²éÔĹٷ½Îĵµ·¢ÏÖÕâ¸öÎÊÌâÊÇÓÉÓÚMonoÔì³ÉµÄ£¬UnityûÓнâ¾ö¡£¶øGfxDriver Õ¼ÓõÄÄÚ´æÊÇÖ¸×ÊÔ´Õ¼ÓõÄÄÚ´æ(Texture£¬Mesh¡¢Vertex

bufferºÍ index buffer)£¬µ±×ÊÔ´ÄÚ´æÊͷźó£¬GfxDriver»á½«Äڴ滹¸øOS£¬´Ó¶øÊÕËõ×Ô

¼º¡£

ÔÚ½øÈëÓÎÏ·ºóÖ÷³¡¾°Mono HeapSize =42M£¬ÆäÖÐUsedHeapSize = 33M, UnUsedHeapSize = 9M¡£Çл»¼¸´Î³¡¾°ºó»Øµ½Ö÷³¡¾°HeapSize = 92.5M£¬ÆäÖÐUsedHeapSize = 45M£¬UnUsedHeapSize = 47.5M¡£µ±OSÄÚ´æ²»¹»£¬¶øMono HeapÄÚ´æ³ä×㣬ÉêÇëеÄ×ÊÔ´ÄÚ´æ»áʧ°Ü£¬Å׳öÄÚ´æ²»×ãÒì³£¡£Òò´Ë£¬Mono HeapÄÚ´æÕ¼ÓÃÐèÒªÓÅ»¯¡£

1¡¢ÔÚ³¡¾°Çл»µÄʱºò£¬ÓÉÓÚ²ÉÓÃSceneResRecords½Å±¾±£´æ³¡¾°×Ô¶¨ÒåÊý¾Ý£¬¸Ã½Å±¾±»¹Òµ½×ÊÔ´PrefabÉÏ£¬ ¶øÆä³ÉÔ±SceneResRecords.bytes[]ÊǸö´óÊý×é´ó¸Å200K×óÓÒ£¬²¢ÇÒ½âÎöÕâ¸öÊý×éµÄ¹ý³ÌÖÐÿ´Î²î²»¶àÒªÉêÇë600~1000¸öDataÁÙʱÀà¶ÔÏó£¬

¿ÉÄܵ¼Ö´óÁ¿ËéƬ£»¼«¶ËÇé¿öÏ´óÊý×éºÍËéƬ»áµ¼ÖÂMono Heap·ÖÅäÄÚ´æʧ°Ü£¬´Ó¶øÏòOSÉêÇë¸ü¶àµÄÄÚ´æ¡£

½¨Ò齫SceneResRecordsÊý¾Ý´Ó³¡¾°AssetBundleÖзÖÀë³öÀ´·ÅÎļþÖУ¬Í¨¹ýÎļþÁ÷µÄ·½Ê½¶ÁÈ¡½âÎö£¬´Ó¶ø±ÜÃâ´óÊý×éµÄÄÚ´æÉêÇë¡£Æä´Î£¬½¨Ò齫DataʵÀý×ö³Ø»¯»º³å£¬¼õÉÙƵ·±Ð¡ÄÚ´æµÄ·ÖÅä²Ù×÷¡£Î´½øÐÐUI²Ù×÷ֻƵ·±Çл»³¡¾°µÄÇé¿öÏ£¬¾­²âÊÔ´Ë´ÎÓÅ»¯£¬Mono HeapÄÚ´æ·åÖµ´Ó92.5M½µµÍµ½70M£¬ÓÅ»¯ÁË23M×óÓÒ¡£

2¡¢AssetBundleLoad. LoadAssetEnd ()º¯Êý¼ÓÔØÿһ¸öAssetBundle¶¼»á·ÖÅä¸ÃÎļþ´óСµÄbyte[]ÁÙʱÊý×飬³¡¾°ÖÐÓÐЩAssetBundle»á´ïµ½¼¸Õ×£¬ÕâÒ²»áµ¼Ö´óÁÙʱÄÚ´æ·ÖÅä¡£½¨Ò齫Byte[]Êý×éÓÅ»¯Îª¾²Ì¬µÄBufferÊý×é½øÐи´Ó㬼õÉÙ´óÊý×éµÄ·ÖÅäÇëÇó¡£StreamingAssetLoad.GetFileBytes()º¯Êý½¨ÒéÓÅ»¯µô£¬¸Ãº¯ÊýÖ±½Ó½«Õû¸öÎļþ¶ÁÈëÄڴ棬»áÉêÇëÎļþ´óСµÄÄÚ´æÊý×顣δ½øÐÐUI²Ù×÷ֻƵ·±Çл»³¡¾°µÄÇé¿öÏ£¬¾­²âÊÔ´Ë´ÎÓÅ»¯ÔÚµÚÒ»²½µÄ»ù´¡ÉÏ´Ó·åÖµ70M½µµÍµ½54M£¬ÓÅ»¯15M×óÓÒ¡£

3¡¢·ÖÎö·¢ÏÖUI×ÊÔ´¶¼´æÔÚ´ËÀàÎÊÌ⣬Ƶ·±µÄ½øÐÐUI²Ù×÷µ¼ÖÂMono Heap±©Ôöµ½112M£¬ ÓÉÓÚUI½Å±¾ÖÐÓдóÊý×é³ÉÔ±£¬²¢ÇÒUI²Ù×÷Ƶ·±µ¼ÖÂMono¶ÑµÄ±©Ôö£¬Õâ¸öÎÊÌâ½â¾ö·½·¨Í¬µÚÒ»¸öÎÊÌâÀàËƽ«UI½Å±¾ÖдóÊý×éÊý¾Ý´ÓAssetBundleÖзÖÀë³öÀ´·ÅÈëÎļþÖУ¬Í¨¹ýÎļþÁ÷µÄ·½Ê½¶ÁÈ¡½âÎö£¬´Ó¶ø±ÜÃâ´óÊý×éµÄÄÚ´æÉêÇë¡£¾­¹ýÉÏÊöÓÅ»¯£¬Æµ·±½øÐÐ UI²Ù×÷ʱMono HeapÄÚ´æ¶Ñ·åÖµ´óСΪ120M£¬ÓÅ»¯ºó½µµÍµ½64.8M¡£

×ܽ᣺ÓÅ»¯Ç°Mono HeapÄÚ´æ¶ÑÔÚUIƵ·±²Ù×÷¼«¶ËÇé¿öÏ»áÕ¼ÓÃ120M£¬ÓÅ»¯ºó½µµÍµ½ÁË64.8M¡£±àд½Å±¾´úÂëʱһ¶¨Òª×¢Òâ½Å±¾Öаüº¬µÄ´óÊý×é³ÉÔ±£¬¾¡Á¿¼õÉÙ´óÊý×é»ò·Ö¸î´óÊý×éΪСÊý×é¡£

5¡¢³¡¾°ÓÅ»¯

1¡¢ÏÈÇ°×ö±¾ÏîÄ¿ÓÅ»¯Ê±¿¼ÂDz»×㣬½«³¡¾°ÖÐËùÓÐMeshͨ¹ýMeshBaker½øÐÐÁ˺ϲ¢ÒÔ½µµÍ³¡¾°µÄDrawcall£¬ËäÈ»³¡¾°ÖÐDrawCall½µµ½10¸ö×óÓÒ£¬µ«ÊÇÒýÈëÁËеÄÎÊÌâ¡£´ó²¿·Ö³¡¾°ÖеĽڵ㶼ÓнøÐи´ÓúÍMeshÊý¾Ý¹²Ïí£¬´Ö±©µÄ½øÐнøÐвÄÖʺÍMeshÊý¾ÝµÄºÏ²¢£¬»áÉú³ÉÒ»·Ý´ó²ÄÖÊ£¬²¢ÇÒÿ·ÝMesh±»¹²Ïí¶àÉٴξͻáÉú³É¶àÉÙCopyÊý¾Ý£¬µ¼Ö¶¥µãÊý¾Ý²úÉúºÜ¶àÈßÓàµÄÄÚ´æÕ¼Óᣱ¾´ÎÓÅ»¯Ö»½øÐвÄÖʺϲ¢£¬²»½øÐÐMeshºÏ²¢£¬ÈÃUnityÒýÇæÔÚÔËÐйý³ÌÖÐͨ¹ýÏàͬ²ÄÖʵÄStatic Batch²Ù×÷½øÐÐÓÅ»¯£¬´Ó¶ø¼´ÓÅ»¯DrawCallÓÖ²»Ôì³É¶îÍâÄÚ´æÕ¼Óá£

2¡¢ÉÙÊý³¡¾°×öµÃ±È½Ï´ó£¬È糬¼¶±¤ÀÝ3£¬ÃæÊý130kÌ«¶à£¬Mesh¶¨µãÔÚÄÚ´æÖÐÕ¼30M×óÓÒ£¬ÆäËûÒ»°ãÔÚ15MÒÔÏ£¬´óµÄ³¡¾°Ä£Ðͽ¨ÒéÓÅ»¯µ½15M×óÓÒ¡£Ò»Ð©³¡¾°µÄ

ÁªÏµºÏͬ·¶ÎÄ¿Í·þ£ºxxxxx#qq.com(#Ì滻Ϊ@)