基于腾讯地图SDK的Unity定位交友功能的实现

》层级处理

    1)地图 、 UI 层级处理

             UI摄像机有五个,camera的depth从49-56。地图的要在所有UI之下,所以depth设为48。

    2)UI,特效层级

          特效要夹在在UI之间,所有特效之下的UI的RenderQ改成StartAt调到2600。

    3)Camera depth、panel depth、width depth 、renderQ关系

               Camera的Depths是指不同相机之前的深度属性,在渲染顺序的优先度里面是最高的,Depth越大,渲染的图像越靠前,和空间无关。

              StartAt:如果AB两个panel,A panel显示在前,那么A panel的Start At值就是B panel 的Start At值加上B panel的Drawcall数量。如下图:

            

             panel depth:RenderQueue.Automatic从3000开始计算。StartAt是从设置的值开始计算。

            当我们不选择Automatic时,Panel的Depth对于Panel的渲染层级已经没有任何影响了。如下图:

             

             panel depth的优先级高于width depth。

           首先如果一个Panel中包含多个Drawcall,这些Drawcall的Renderqueue是由其渲染的Wiget的Depth决定的。其次,Wiget的Depth只会影响同一个Drawcall中的Wiget层次(不同Drawcall还是由Drawcall的Renderqueue决定)。原来Wiget的Depth是通过影响Drawcall中的顶点缓存序列来达到影响层级的效果的。NGUI的一个Drawcall中包含一个Mesh, 它是由Drawcall内所有Wiget的顶点信息生成的,顶点信息存储的顺序是由Depth决定的,越靠后的层级就越高。(注:所以游戏中改变Wiget的Depth可能会导致Mesh重新生成相当影响效率)

》预设的Layer处理

》LBS资源的管理

》手势处理

    双指滑动

    四种手势

》基于json的网络消息

》数据驱动逻辑

》坐标转换

》100个人缓存 刷新 优化

        将所有收到的数据一次缓存到一个list里。从最前端插入。

        从前向后遍历,剔除id重复的人。

       因为只缓存100个人,然后剔除索引100之后的人。

》单点多人的散开处理

      当在同一坐标点出现多个人的时候会叠加在一起,要把这些人的经纬度散开。

      算法思想:

          新建一个空列表。

       local nearbyList ;   --收到的服务器传来的附近的人100个

       local spreadList = {} --散开后的列表

       local offsetList;   --散开偏移量列表,目前定义了37个散开偏移量,围绕中心点的多个方型结点

       for i = 1, #nearbyList do

              isInserted = false

              for j = 1, #offsetList do

                     if  (nearbyList[i]经纬度  + offsetList[j]偏移量) 和 spreadList 里的所有结点的距离都大于某一值 then

                            table.insert(spreadList, nearbyList[i])

                            isInserted = true

                            break

                     end

              end

              if  isInserted == false then --暂时只设置了37个偏移量,如果单点超过37个,会出现散不开的情况,就直接显示原始位置

                        table.insert(spreadList, nearbyList[i])

              end

     end

》公司位置处转移到附近的某大学。

       公司里的人员特殊处理,为了不暴露公司内部玩家。

》手机定位服务器关闭的识别。

     两个开关,手机系统定位的总开关 和 每个应用的单独开关。

     Input.location.isEnabledByUser 对应的是总开关,当总开关关闭的时候,值为false。开启时值为true。

     Input.location.status 是定位的当前状态,有四种。总开关开启状态 值始终未 Stop, 总开关关闭状态值为Failed。这样无法判断当前应用是否开启了定位,只有调用了Input.location:Start()方法,值才会有对应的变化。当应用开关是关闭状态时,值始终为Initializing,当应用开关是开启状态时在几秒后会变为Running,不同手机的响应时间不同,所有我设置的是20秒。在地图关闭的时候调用Input.location:Stop()来关闭定位,节省电力。其实腾讯的地图sdk和手机的定位开关关系并不大,策划要求捆绑在一起,也是调了好一会才弄好。

》腾讯地图的墨卡托坐标

不依赖于手机的定位开关的开关。

墨卡托(Mercator)投影,又名“等角正轴圆柱投影”,荷兰地图学家墨卡托(Mercator)在1569年拟定,假设地球被围在一个中空的圆柱里,其赤道与圆柱相接触,然后再假想地球中心有一盏灯,把球面上的图形投影到圆柱体上,再把圆柱体展开,这就是一幅标准纬线为零度(即赤道)的“墨卡托投影”绘制出的世界地图。

》NGUI UIGrid 在列表没铺满还能滚动问题。

》关注列表的循环滚动效率

猜你喜欢

转载自blog.csdn.net/chenxuezhi123/article/details/81512978