①对曲线进行采样简化,即在曲线上取有限个点,将其变为折线,并且能够在一定程度保持原有形状。比较常用的两种抽稀算法是:道格拉斯-普克(Douglas-Peuker)算法和垂距限值法
chouxi.png

<?php
/*
 * 点抽稀算法
 * @param array $line 多个点组成的线
 * @param int $tolerance 取样临界值(米为单位)
 */
function douglasPeucker($line, $tolerance)
{
    $distanceMax = 0;
    $index       = 0;
    $lineSize = count($line)-1;
    if($lineSize<3){
        return $line;
    }
    for ($i = 1; $i <=$lineSize; $i ++) {
        $distance = getPerpendicularDistance($line[$i], array($line[0],$line[$lineSize]));
        if ($distance > $distanceMax) {
            $index       = $i;
            $distanceMax = $distance;
        }
    }
    if ($distanceMax > $tolerance) {
        $lineSplitFirst  = array_slice($line, 0, $index);
        $lineSplitSecond = array_slice($line, $index-1, $lineSize);
        $recursiveResultsSplitFirst  = douglasPeucker($lineSplitFirst, $tolerance);
        $recursiveResultsSplitSecond = douglasPeucker($lineSplitSecond, $tolerance);
        return array_merge($recursiveResultsSplitFirst, $recursiveResultsSplitSecond);
    }
    return [$line[0], $line[$lineSize]];
}

/*
 * 获取点到线之间的垂直距离
 * $point array 点信息
 * $line array 由两点组成的直线
 */
function getPerpendicularDistance($point,$line)
{
    //$ellipsoidRadius = 6378137.0 * (1 - 1 / 298.257222100 / 3); //GRS-80
    $ellipsoidRadius = 6378137.0 * (1 - 1 / 298.257223563 / 3); //84坐标转
    $firstLinePointLat = deg2radLatitude($line[0]['lat']);
    $firstLinePointLng = deg2radLongitude($line[0]['lng']);
    $firstLinePointX = $ellipsoidRadius * cos($firstLinePointLng) * sin($firstLinePointLat);
    $firstLinePointY = $ellipsoidRadius * sin($firstLinePointLng) * sin($firstLinePointLat);
    $firstLinePointZ = $ellipsoidRadius * cos($firstLinePointLat);
    $secondLinePointLat =deg2radLatitude($line[1]['lat']);
    $secondLinePointLng =deg2radLongitude($line[1]['lng']);

    $secondLinePointX = $ellipsoidRadius * cos($secondLinePointLng) * sin($secondLinePointLat);
    $secondLinePointY = $ellipsoidRadius * sin($secondLinePointLng) * sin($secondLinePointLat);
    $secondLinePointZ = $ellipsoidRadius * cos($secondLinePointLat);

    $pointLat =deg2radLatitude($point['lat']);
    $pointLng =deg2radLongitude($point['lng']);

    $pointX = $ellipsoidRadius * cos($pointLng) * sin($pointLat);
    $pointY = $ellipsoidRadius * sin($pointLng) * sin($pointLat);
    $pointZ = $ellipsoidRadius * cos($pointLat);

    $normalizedX = $firstLinePointY * $secondLinePointZ - $firstLinePointZ * $secondLinePointY;
    $normalizedY = $firstLinePointZ * $secondLinePointX - $firstLinePointX * $secondLinePointZ;
    $normalizedZ = $firstLinePointX * $secondLinePointY - $firstLinePointY * $secondLinePointX;

    $length = sqrt($normalizedX * $normalizedX + $normalizedY * $normalizedY + $normalizedZ * $normalizedZ);

    if ($length == 0) {
        return 0;
    }

    $normalizedX /= $length;
    $normalizedY /= $length;
    $normalizedZ /= $length;

    $thetaPoint = $normalizedX * $pointX + $normalizedY * $pointY + $normalizedZ * $pointZ;
    $length = sqrt($pointX * $pointX + $pointY * $pointY + $pointZ * $pointZ);
    $thetaPoint /= $length;
    $distance = abs((M_PI / 2) - acos($thetaPoint));
    return $distance * $ellipsoidRadius;
}


function deg2radLatitude($latitude)
{
    return deg2rad(90 - $latitude);
}

/**
 * @param float $longitude
 *
 * @return float
 */
function deg2radLongitude($longitude)
{
    if ($longitude > 0) {
        return deg2rad($longitude);
    }

    return deg2rad($longitude + 360);
}

引言
cocos creator是什么?

Cocos Creator 是触控科技旗下的产品,以内容创作为核心的游戏开发工具,在 Cocos2d-x 基础上实现了彻底脚本化、组件化和数据驱动等特点。

Cocos Creator 包体的组成与优化技巧:
1: 代码体积(引擎 + 业务逻辑代码setting.js)大头在引擎;引擎优化,非常简单,你只要把不要的模块去掉就可以了,你要知道哪些模块是占体积多的,比如物理引擎,能不用的模块,就不用, cocos creator 足够优秀的2D编辑器,可以替代tilemap, 去掉tilemap逻辑
如图:
youhua.png

业务逻辑代码: 一般我们也没法修改,你的业务逻辑差不多,但是,要注意一个 95%以上的同学,都会忽略的一个事实: setting.js, setting.js 的大小,是由谁决定的?resources里面的文件数量, 非代码加载的资源,我一定放出resources模块。

2: 图像资源;

图片的压缩格式: 背景,jpg 体积要小于png, 背景图片jpg, 很多图片格式,导出美术图后,这些图,任然可以压缩。TinyPNG等; 图片分辨率: 1920x1080 > 960x540; 就减少分辨率。

尽可能的使用九宫格的图片,来代替一张整图 ,大大的降低的图片的分斌率,这样就可以节省资源;

图片清晰度: 其实压缩算法,也可以调整清晰度, png, 调整量化系数数,关键信息变少,清晰度会减少,但是分辨率不会变;

图片的像素格式: 这个也式可以的,argb4444 非常少的,除非, 你不是彩色的。

图集打包以后有空地: 空白的地方, 整理,调整;

图片数量:越少越好,帧动画, 减少帧的数目,骨骼动画替换帧动画,节省资源;

3:音乐音效资源(压缩格式, 背景音乐的大小,音乐的数量,声道,采样率);

压缩格式: WAV --->体积 mp3, ogg,

声道:双声道的数据,那么这个时候,体积就式2倍; 采样率: 1秒---》44100 sample, 降低采样率, 压缩软件来做到,视频编码工具来做到;

背景音乐:体积一般比较大,竟可能的要优先优化它;

4: 字库:

(1) 特效文字,尽量使用 位图字体,几个字母 + 图片,体积远远小于一个 完整的字库, 性能还要好; 如数字,界面的文字, bmpfont ---> .png + .fnt文件;

(2) 尽可能的使用系统字库 ;

(3) fontmin可以压缩字库, 把不用的文字,从字库移除,减少体积;

(4) 位图字与 适量 字,哪个性能更好?位图字: 速度快,但是,内存大, 适量字, 速度慢,但是内存小。

Cocos creator 包体优化就到这里了

onLoad()
组件脚本的初始化阶段触发该回调,类似与Unity的Awake

onEnable()
组件或所在节点的enable属性如果由false变为true时触发,在对象被创建时如果其enable本身为true时也会被触发一次,该次触发在onload之后,start之前。和Unity的onEnable原理相似。

start()
组件第一次被激活后调用一次,后续如果反复修改enable的属性(反复激活,如对象池这种情况)不会被再次触发。原理同Unity的onStart方法。

update(dt)
游戏在每一帧渲染前触发该方法,其中有一个参数dt表示上一帧距离当前帧的时间类似Unity的time.deltatime。

lateUpdate(dt)
游戏在每一帧渲染后触发该方法, dt参数与update的参数相同,与Unity的lateUpdate相似。

onDisable
组件或所在节点被禁用时触发该方法,即enable属性由true变成false (注:如果组件或所在节点enable初始状态为false并不会像onEnable一样执行一次), 与Unity的onDisable相似。

onDestroy
组件被销毁时触发该方法, 与Unity的onDestroy相似。

周期图
1567408236(1).png