1. 程式人生 > >unity圖片記憶體優化

unity圖片記憶體優化

我基本都是做移動端,但也涉及到網頁端,主要還是針對移動端優化,優化涉及到的問題基本都是圖片的使用方式,圖片一定要使用2的N次方,這個是一定一定的,NGUI圖集預設是大圖是2的N次方,所以使用他的圖集的時候不用考慮,大圖烘焙圖我建議使用2的N次方的大小的圖,要不大家遲早會跳進這個坑,然後如果你使用的圖的大小比實際圖小的時候,可以使用uv演算法,也可以用裁剪法,

  1. public Vector2[] ReturnNewUV(Vector2[] uvpoints, Texture2D tex, Vector2[] ActualPoint)  
  2.     {  
  3.         float length = 0;
    //需要圖的長度
  4.         float width = 0;//需要圖的寬度
  5.         Vector2 v2_default = ActualPoint[0];  
  6.         float minX = v2_default.x;  
  7.         float maxX = v2_default.x;  
  8.         float minZ = v2_default.y;  
  9.         float maxZ = v2_default.y;  
  10.         for (int i = 0; i < ActualPoint.Length; i++)  
  11.         {  
  12.             Vector2 v2 = ActualPoint[i];  
  13.             if (minX > v2.x)  
  14.             {  
  15.                 minX = v2.x;  
  16.             }  
  17.             if (maxX < v2.x)  
  18.             {  
  19.                 maxX = v2.x;  
  20.             }  
  21.             if (minZ > v2.y)  
  22.             {  
  23.                 minZ = v2.y;  
  24.             }  
  25.             if
     (maxZ < v2.y)  
  26.             {  
  27.                 maxZ = v2.y;  
  28.             }  
  29.         }  
  30.         length = (maxX - minX) ;//根據你的點集,算出你使用的長度
  31.         width = (maxZ - minZ) ;<span style="font-family: Arial, Helvetica, sans-serif;">//根據你的點集,算出你使用的寬度</span>
  32.     float minXX = uvpoints[0].x;  
  33.     float maxXX = uvpoints[0].x;  
  34.     float minZZ = uvpoints[0].y;  
  35.     float maxZZ = uvpoints[0].y;  
  36.     for (int i = 0; i < uvpoints.Length; i++)  
  37.     {  
  38.         Vector2 v2 = uvpoints[i];  
  39.         if (minXX > v2.x)  
  40.         {  
  41.         minXX = v2.x;  
  42.         }  
  43.         if (maxXX < v2.x)  
  44.         {  
  45.         maxXX = v2.x;  
  46.         }  
  47.         if (minZZ > v2.y)  
  48.         {  
  49.         minZZ = v2.y;  
  50.         }  
  51.         if (maxZZ < v2.y)  
  52.         {  
  53.         maxZZ = v2.y;  
  54.         }  
  55.         }//uv點集中最大x,y值
  56.         //把這些uv點除以最大x,y值,保證uv在(0~1)之間,這樣就可以把一張圖鋪上去,如果想根據你的需要去使用這張圖的比例,就乘以你的使用大小/圖片的實際大小
  57.         for (int i = 0; i < uvpoints.Length; i++)  
  58.         {  
  59.             //uvpoints[i].x / maxX 縮小uv的X保證x在0~1之間
  60.             //uvpoints[i].y / maxZ) 縮小uv的Z保證z在0~1之間
  61.             //length / tex.width 當前長度與圖片長度的比例
  62.             //wight / tex.height 當前寬度與圖片寬度的比例
  63.             uvpoints[i] = new Vector2((uvpoints[i].x / maxXX*length / tex.width )  , (uvpoints[i].y / maxZZ*wight / tex.height ) );  
  64.         }  
  65.         return uvpoints;  
  66.     }  

使用方法mesh.uv = ReturnNewUV(,,,,)還有一種方法是圖片裁剪的方法
  1. float xNum = 0;  
  2. float yNum = 0;  
  3. xNum = Mathf.Abs(maxX - minX) ;  
  4. yNum = Mathf.Abs(maxZ - minZ) ;  
  5. float imgWidth = texture.width;//texture原始圖片
  6. float imgHeight = <span style="font-family: Arial, Helvetica, sans-serif;">texture</span><span style="font-family: Arial, Helvetica, sans-serif;">.height;</span>  
  7. int pixelsW = (int)imgWidth;  
  8. int pixelsH = (int)imgHeight;  
  9. Color[] colors = <span style="font-family: Arial, Helvetica, sans-serif;">texture</span><span style="font-family: Arial, Helvetica, sans-serif;">.GetPixels(0, 0, pixelsW, pixelsH);//獲取從(0~pixeW)寬度,(0~pixeH)高度的圖片裁剪</span><span style="font-family: Arial, Helvetica, sans-serif;">
  10. /span>  curNewT2D = new Texture2D(pixelsW, pixelsH);//new一個新的需要這個大小的圖片
  11. curNewT2D.SetPixels(colors);//把上面獲得的賦給它
  12. curNewT2D.Apply();//curNewT2D就是新的一張圖,就是自己設定的大小
本文來自:http://blog.csdn.net/itolfn/article/details/22856549