HonorLee 5 months ago
parent
commit
5274eb70aa
4 changed files with 90 additions and 68 deletions
  1. 10 40
      CrossgateToolkit/AnimePlayer.cs
  2. 29 16
      CrossgateToolkit/GraphicData.cs
  3. 16 0
      CrossgateToolkit/Map.cs
  4. 35 12
      README.md

+ 10 - 40
CrossgateToolkit/AnimePlayer.cs

@@ -127,14 +127,10 @@ namespace CrossgateToolkit
             _imageRenderer = GetComponent<Image>();
             _spriteRenderer = GetComponent<SpriteRenderer>();
             _rectTransform = GetComponent<RectTransform>();
-            //碰撞盒,仅当需要添加鼠标事件时使用
-            // _boxCollider2D = GetComponent<BoxCollider2D>();
             
             if(_imageRenderer == null) _imageRenderer = gameObject.AddComponent<Image>();
             if(_spriteRenderer == null) _spriteRenderer = gameObject.AddComponent<SpriteRenderer>();
             if(_rectTransform == null) _rectTransform = gameObject.AddComponent<RectTransform>();
-            // if(_boxCollider2D == null) _boxCollider2D = gameObject.AddComponent<BoxCollider2D>();
-            
         }
 
         private void Start()
@@ -209,16 +205,16 @@ namespace CrossgateToolkit
             }
         }
 
-        /**
-         * 播放动画,调用此方法将会清空当前播放队列,调用完成可通过链式调用nextPlay方法添加动画到播放队列
-         * @param Serial 动画序列号
-         * @param Direction 动画方向
-         * @param ActionType 动画动作
-         * @param PlayType 播放类型
-         * @param Speed 播放速度,以 1s 为基准,根据动画帧率计算实际播放周期时长
-         * @param onFinishCallback 动画结束回调
-         * @return AnimePlayer
-         */
+        /// <summary>
+        /// 播放动画。调用此方法将会清空当前播放队列,调用完成可通过链式调用 <c>nextPlay</c> 方法添加动画到播放队列。
+        /// </summary>
+        /// <param name="Serial">动画序列号</param>
+        /// <param name="Direction">动画方向</param>
+        /// <param name="ActionType">动画动作</param>
+        /// <param name="PlayType">播放类型</param>
+        /// <param name="Speed">播放速度,以 1s 为基准,根据动画帧率计算实际播放周期时长</param>
+        /// <param name="onFinishCallback">动画结束回调</param>
+        /// <returns>AnimePlayer</returns>
         public AnimePlayer play(uint Serial, Anime.DirectionType Direction = Anime.DirectionType.North,
             Anime.ActionType actionType = Anime.ActionType.Stand, Anime.PlayType playType = Anime.PlayType.Once,
             float Speed = 1f, AnimeCallback onFinishCallback = null)
@@ -499,11 +495,6 @@ namespace CrossgateToolkit
             
             //问题帧自动跳过
             if (_currentFrame<_frames.Length && _frames[_currentFrame] == null) return;
-            //自动偏移
-            // float graphicWidth = _frames[_currentFrame].Sprite.rect.width;
-            // float graphicHeight = _frames[_currentFrame].Sprite.rect.height;
-            // float offsetX = -_frames[_currentFrame].GraphicInfo.OffsetX;
-            // float offsetY = _frames[_currentFrame].GraphicInfo.OffsetY;
             
             //根据当前帧Sprite动态调整对象大小
             float width = _frames[_currentFrame].Sprite.rect.width * 1f;
@@ -529,27 +520,6 @@ namespace CrossgateToolkit
             }
             frameTexture = _frames[_currentFrame].Sprite.texture;
             
-            // Vector2 offset = Vector2.zero;
-            // offset.x += -(_frames[_currentFrame].GraphicInfo.OffsetX * 1f) / _frames[_currentFrame].GraphicInfo.Width;
-            // offset.y -= (-_frames[_currentFrame].GraphicInfo.OffsetY * 1f) / _frames[_currentFrame].GraphicInfo.Height;
-            
-            // _rectTransform.pivot = offset;
-            
-            // pos.x = (width + _frames[_currentFrame].GraphicInfo.OffsetX)/1f;
-            // pos.y = (height + _frames[_currentFrame].GraphicInfo.OffsetY)/1f;
-            
-            
-            
-            // 2D碰撞器自动调整,但是动态碰撞器反而会导致重叠大物体选中效果不稳定,效果不如固定大小碰撞器好
-            // if (_boxCollider2D != null)
-            // {
-            //     Vector2 newSize =_boxCollider2D.size 
-            //     _boxCollider2D.size = new Vector2(width, height);
-            // }
-            // _rectTransform.pivot = new Vector2(offsetX,offsetY);
-            // _rectTransform.localPosition = new Vector3(0f,  0f);
-            
-            
             _timer = Time.time * 1000;
             
             //动画事件帧监听

+ 29 - 16
CrossgateToolkit/GraphicData.cs

@@ -8,6 +8,7 @@
  * GraphicData.cs 图档解析类
  */
 
+using System;
 using System.Collections;
 using System.Collections.Generic;
 using System.IO;
@@ -121,13 +122,24 @@ namespace CrossgateToolkit
         }
 
         #region 地图合批
+        // 合批数据
         private class BatchData
         {
             public int BatchOffsetX;
             public int BatchOffsetY;
             public GraphicDetail GraphicDetail;
         }
+        // 图档合批
+        private class TextureData
+        {
+            public int MaxHeight;
+            public int MaxWidth;
+            public List<BatchData> BatchDatas = new List<BatchData>();
+            public List<GraphicInfoData> GraphicInfoDatas = new List<GraphicInfoData>();
+        }
+        
         //预备地图缓存
+        [Obsolete("该方法已废弃,请使用BakeGraphics方法")]
         public static Dictionary<uint, GraphicDetail> BakeAsGround(List<GraphicInfoData> groundInfos,int palet=0)
         {
             
@@ -227,25 +239,26 @@ namespace CrossgateToolkit
             return graphicDataDic;
         }
         
-        //预备地图物件缓存
-        private class TextureData
-        {
-            public int MaxHeight;
-            public int MaxWidth;
-            public List<BatchData> BatchDatas = new List<BatchData>();
-            public List<GraphicInfoData> GraphicInfoDatas = new List<GraphicInfoData>();
-        }
-        public static Dictionary<uint, GraphicDetail> BakeAsObject(List<GraphicInfoData> objectInfos,int palet = 0)
+        /// <summary>
+        /// 合批图档
+        /// 通过指定图档序列,对图档进行合批处理,并返回合批后的图档数据
+        /// </summary>
+        /// <param name="graphicInfoDatas">图档索引数据序列</param>
+        /// <param name="palet">调色板序号</param>
+        /// <param name="maxTextureSize">单个Texture最大尺寸,地面数据建议2048,物件数据建议4096</param>
+        /// <param name="padding">图档间隔,可以有效避免图档渲染时出现多余的黑边或像素黏连</param>
+        /// <returns>合批后的图档数据,Key(unit)为图档数据编号,Value为图档数据</returns>
+        public static Dictionary<uint, GraphicDetail> BakeGraphics(List<GraphicInfoData> graphicInfoDatas,int palet = 0, int maxTextureSize = 2048,int padding = 0)
         {
             // 单个Texture最大尺寸
-            int maxWidth = 4096;
-            int maxHeight = 4096;
+            int maxWidth = maxTextureSize;
+            int maxHeight = maxTextureSize;
             
             List<TextureData> textureDatas = new List<TextureData>();
             Dictionary<uint, GraphicDetail> graphicDataDic = new Dictionary<uint, GraphicDetail>();
 
             // 根据objectInfos的内,GraphicInfoData的Width,Height进行排序,优先排序Width,使图档从小到大排列
-            objectInfos = objectInfos.OrderBy(obj => obj.Width).ThenBy(obj => obj.Height).ToList();
+            graphicInfoDatas = graphicInfoDatas.OrderBy(obj => obj.Width).ThenBy(obj => obj.Height).ToList();
 
             int offsetX = 0;    // X轴偏移量
             int offsetY = 0;    // Y轴偏移量
@@ -253,14 +266,14 @@ namespace CrossgateToolkit
             
             TextureData textureData = new TextureData();
             
-            for (var i = 0; i < objectInfos.Count; i++)
+            for (var i = 0; i < graphicInfoDatas.Count; i++)
             {
-                GraphicInfoData graphicInfoData = objectInfos[i];
+                GraphicInfoData graphicInfoData = graphicInfoDatas[i];
                 // 如果宽度超过4096,则换行
                 if((graphicInfoData.Width + offsetX) > maxWidth)
                 {
                     offsetX = 0;
-                    offsetY = offsetY + maxRowHeight + 5;
+                    offsetY = offsetY + maxRowHeight + padding;
                     maxRowHeight = 0;
                 }
                 // 如果高度超过2048,则生成新的Texture2D
@@ -287,7 +300,7 @@ namespace CrossgateToolkit
                 maxRowHeight = Mathf.Max(maxRowHeight, (int) graphicInfoData.Height);
                 textureData.MaxHeight = Mathf.Max(textureData.MaxHeight, offsetY + maxRowHeight);
                 textureData.MaxWidth = Mathf.Max(textureData.MaxWidth, offsetX + (int) graphicInfoData.Width);
-                offsetX += (int) graphicInfoData.Width + 5;
+                offsetX += (int) graphicInfoData.Width + padding;
             }
             
             //最后一次合并

+ 16 - 0
CrossgateToolkit/Map.cs

@@ -110,6 +110,22 @@ namespace CrossgateToolkit
             MapInfo mapInfo = _loadMap(serial);
             return mapInfo;
         }
+        
+        // 地面数据合批
+        public static Dictionary<uint,GraphicDetail> BakeGrounds(List<GraphicInfoData> graphicInfoDatas,int palet = 0)
+        {
+            Dictionary<uint, GraphicDetail>
+                graphicDataDict = GraphicData.BakeGraphics(graphicInfoDatas, palet, 2048, 0);
+            return graphicDataDict;
+        }
+        
+        // 物件数据合批
+        public static Dictionary<uint,GraphicDetail> BakeObjects(List<GraphicInfoData> graphicInfoDatas,int palet = 0)
+        {
+            Dictionary<uint, GraphicDetail>
+                graphicDataDict = GraphicData.BakeGraphics(graphicInfoDatas, palet, 4096);
+            return graphicDataDict;
+        }
 
         //加载地图数据
         private static MapInfo _loadMap(uint serial)

+ 35 - 12
README.md

@@ -133,29 +133,49 @@ SpriteRenderer(Image).sprite = graphicDetail.Sprite;
 Map.MapInfo mapInfo = Map.GetMap(uint Serial);
 ```
 
-### 获取地图地面/地图物件图档合批数据
+### 图档合批
+
+为减少渲染时的Drawcall和Batchs动态合批数量提高性能并降低内存消耗,工具库提供了大量图档合批(并)处理方法
+
+图档合并时,会自动根据每个图档图像由小到大进行排序处理,以最大限度将多个图档合并至一个或多个稍大的Texture2D中
+
 ```csharp
 /**
- * * 针对地面数据将地面图档自动进行拼合成一个或多个2048*2048尺寸Texture2D
- * * 针对地图物件(建筑等)拼合成一个或多个不大于4096*4096尺寸Texture2D
- * 拼合后的Texture2D数据拆分为对应的Sprite资源
- * 这样可以大幅降低地图的内存占用和Drawcall数量,提高渲染的动态合批性能
- * 另:
- * 代码中暂时禁用了已合并地面Texture2D的缓存功能,如需使用请取消相关代码注释或自行修改
- * 由于4.0后地图模式变动,部分地图图档过大,所以这个方法可能不适用于4.0后的地图
+* 合批图档
+* 通过指定图档序列,对图档进行合批处理,并返回合批后的图档数据
+* @param graphicInfoDatas 图档索引数据序列
+* @param palet 调色板序号
+* @param maxTextureSize 单个Texture最大尺寸,地面数据建议2048,物件数据建议4096
+* @param padding 图档间隔,可以有效避免图档渲染时出现多余的黑边或像素黏连
+* @return Dictionary 合批后的图档数据,Key(unit)为图档数据编号,Value为图档数据
+*/
+GraphicData.BakeGraphics(
+    List<GraphicInfoData> graphicInfoDatas,
+    int palet = 0,
+    int maxTextureSize = 2048,
+    int padding = 0)
+```
+
+### 地图地面/物件图档合批数据
+针对地图图档部分合批提供了相应的简化方法,可以酌情使用
+```csharp
+/**
+ * * 地面数据将拼合成一个或多个2048*2048尺寸Texture2D
+ * * 物件(建筑等)拼合成一个或多个不大于4096*4096尺寸Texture2D
+ * 另: 由于4.0后地图模式变动,部分地图图档过大,所以这个方法可能不适用于4.0后的地图
  */
 
 // 地面合批
 Dictionary<int, GraphicDetail> MapGroundSerialDic =
-    GraphicData.BakeAsGround(    // <= 合并地面图形
-        List<GraphicInfoData> graphicInfoDataList,
+    Map.BakeGrounds(    // <= 合并地面图形
+        List<GraphicInfoData> graphicInfoDatas,
         int PaletIndex = 0
     );
 
 // 物件合批
 Dictionary<int, GraphicDetail> MapObjectSerialDic =
-    Graphic.BakeAsObject(    // <= 合并物件图形
-        List<GraphicInfoData> graphicInfoDataList,
+    Graphic.BakeObjects(    // <= 合并物件图形
+        List<GraphicInfoData> graphicInfoDatas,
         int PaletIndex = 0
     );
 ```
@@ -287,6 +307,9 @@ player.Stop();
 
 
 ## 4、更新日志
+### v 2.1
+> `UPD` 图档合并方法进行统一处理,并增加地图相关简便方法
+
 ### v 2.0
 > `ADD` 修改初始化方法以支持更复杂的图档文件建构
 >