(原)那些让开发变得不太顺利的厂商

题记) cocos2d-x似乎很好,然其不同版本的差异性,兼容性让人无奈,其在wp下webSocket的问题,Sqlite的问题似乎始终抹不去,U3D似乎看起来不错,开发帧-帧的调试确实不错,基于Mono的运行环境,然在中低端机器下,3D似乎运行总是那么不完美,2D看起来似乎总是那么差。然引擎而已,有高有低,所有的应用-游戏对于程序员来说,最终都是比的内功。

1)安卓的坑

  开发第一个项目的时候,需求是游戏+应用的结合,应用部分的图片量相当的大,整个页面几乎全是图片,连文字都是使用图片打上去,游戏部分为cocos2dx。

整个系统使用TabActivity,小雷音寺绕过ASM自行管理Activity诞生的选项卡切换是多么的优美,直到它的出现:OOM。

  在安卓系统中OOM一般分为总体OOM和单个OOM,单个OOM为一个资源加载后出现OOM,总体为内存中全部资源加载总和产生OOM,由于项目选项卡多达10余个,

在切换选项卡后,小雷音寺并没有及时的释放前一个选项卡资源所占用的内存,当快速多次切换选项卡后,出现OOM。

  经过多次折腾,决定使用Fragment替换小雷音,并且将所有的资源全部手动加载,手动GC,在不同的机型测试后,效果不错,感觉一切似乎都是那么完美,直到它的出现:

小米3,装在小米3后,多次切换后,毅然OOM,似乎手动GC对其并没有生效,调试之,果然,在其他手机上手动GC后内存被释放,然在小米上,手动GC后,资源依旧存在,当再次加载后直接内存取出,看来手动GC在小米上生效了,但是小米什么时候才真正的GC,它说了算。由于图片资源较大,于是一次加载背景大图后,OOM。

  不得已之,针对小米3使用程序切换,将资源切成小横条,逐个加载,减少进入大小,同时舍弃效果极度压缩图片。小米3成功带来了一天一夜的工作时间,为成长的道路添加了一点能量。

2)HTML5的坑

  由于微信小游戏发展不错,公司决定花点时间差不多一天开发2-3个类似神经病猫的东西,于是着手写了一点小东西,由于在移动端,浏览器内核导致双击放大,单击会有300毫秒的延迟,这300毫秒乃水果公司在移动设备刚起步的时候为了更好的在移动端展示页面设计,被各个移动浏览器复制,这里有一个问题,便是当点击了移动设备的超级链接,浏览器不知到是真的要跳转,还是双击放大,于是便诞生了300毫秒延迟,如果300毫秒产生了第二次点击,则双击放大,如果没有,则视为一次点击。

  今天,由于响应式布局的产生,双击放大的效果不再适用了,人们迫不及待的要去掉它,于是google率先产生了:

<meta name="viewport" content="user-scalable=no">
<meta name="viewport" content="initial-scale=1,maximum-scale=1">

如此以来便可以禁止双击放大,然而这个解决方案看似完美,但也带来一个明显的缺陷 —— 你必须完全禁用缩放来达到目的,而从移动端站点的可用性和可访问性来看,缩放是相当关键的一环。你很可能已经遇到过这个问题,即你想要放大一张图片或者一段字体较小的文本,却发现无法完成操作。只能说 Android 平台上的 Chrome 和 Firefox 浏览器提供的禁用缩放优化,仅适用于 web 游戏等某些特定的场景,但多数网站并不能从中获益。

于是google又想出了一个办法:

<meta name="viewport" content="width=device-width">

这条代码告诉浏览器将视口大小设为设备本身的尺寸。这在 iPhone 上的效果就是把视口宽度从默认的 980 像素改为 320 像素。

这样可以解决屏幕显示问题,同时可以禁掉双击放大的效果,没有了双击放大,自然不存在300毫秒的延迟,本以为一切是这么的顺利,知道遇到了 它:

小米,当应用在小米上用微信打开后,双击放大效果消失,点击后依然存在300毫秒的延时,点击事件在延迟了300毫秒后才被成功执行。唯独在小米手机上。

移动浏览器上触发click事件与一个物理Tap(敲击)之间存在300毫秒的物理延迟,一切似乎都那么说不通却又摆在面前不得不解决。

既然移动浏览器的事件存在延迟,那么如果接收并且处理浏览器事件并不是浏览器,而是由我们自己的代码去接收并且处理呢,这样似乎可以彻底解决这个问题。

大概google之后发现一个东西:FastClick,看了大概,其便是模仿浏览器处理事件,代替浏览器自带触屏事件,同时发送消息,响应用户:

var methods = [‘onMouse‘, ‘onClick‘, ‘onTouchStart‘, ‘onTouchMove‘, ‘onTouchEnd‘, ‘onTouchCancel‘];
    var context = this;
    for (var i = 0, l = methods.length; i < l; i++) {
        context[methods[i]] = bind(context[methods[i]], context);
    }

可以设置哪几种事件被接收,同时模拟事件处理:

FastClick.prototype.sendClick = function(targetElement, event) {
    ‘use strict‘;
    var clickEvent, touch;

    // On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect (#24)
    if (document.activeElement && document.activeElement !== targetElement) {
        document.activeElement.blur();
    }

    touch = event.changedTouches[0];

    // Synthesise a click event, with an extra attribute so it can be tracked
    clickEvent = document.createEvent(‘MouseEvents‘);
    clickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);
    clickEvent.forwardedTouchEvent = true;
    targetElement.dispatchEvent(clickEvent);
};

FastClick.prototype.determineEventType = function(targetElement) {
    ‘use strict‘;

    //Issue #159: Android Chrome Select Box does not open with a synthetic click event
    if (deviceIsAndroid && targetElement.tagName.toLowerCase() === ‘select‘) {
        return ‘mousedown‘;
    }

    return ‘click‘;
};

申明我们的系统使用FastClick只需要:

FastClick.attach(document.body);
        Array.prototype.forEach.call(document.getElementsByClassName(‘test‘), function(testEl) {
            testEl.addEventListener(‘click‘, function() {
                textInput.focus();
            }, false)
        });
    }, false);

在小米上,终于没了300毫秒的黑色延迟。

后记)

  开发的道路上,越行越远。。

(原)那些让开发变得不太顺利的厂商,布布扣,bubuko.com

时间: 2024-10-13 23:31:54

(原)那些让开发变得不太顺利的厂商的相关文章

【原】JAVA开发环境搭建

1.JDK下载并安装,以jdk-7u45-windows-i586.exe为例(注意JDK的安装和JRE的安装是分开的) 2.“我的电脑”右键属性,找到“高级系统设置”,找到“高级”tab下的“环境变量” 3."系统变量"中新建JAVA_HOME变量,内容填写JDK安装路径(D:\Java\jdk) 4.“系统变量”中查找Path变量,在变量值最后输入%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; (注意如果Path中已有的内容最后没有分号,需要先补上一个分号

【原】cocos2d-x开发笔记:获取Sprite上某一个点的透明度,制作不规则按钮

本篇文章主要讲一下怎么做一个不规则的按钮,比如如下图的八卦,点击绿色和点击红色部分,需要执行不同的事件 一般情况下,如果要检测某一个精灵是否被点中,做法如下 bool HelloWorld::ccTouchBegan(cocos2d::CCTouch* pTouch, cocos2d::CCEvent* pEvent) { CCSize sprSize = pSpr->getContentSize(); CCPoint point = pSpr->convertTouchToNodeSpace

【原】cocos2d-x开发笔记:多点触控

在项目开发中,我们做的大地图,一个手指头按下滑动可以拖动大地图,两个手指头按下张开或者闭合,可以放大和缩小地图 在实现这个功能的时候,需要使用到cocos2d-x的多点触控功能. 多点触控事件,并不是说你按下了两个手指,执行ccTouchesMoved的时候,pTouches的count为2,这样如果单纯的判断函数传入的参数,实现起来会比较困难. 我用一种方式实现了,感觉还是比较简单明了的,拿出来分享一下 cocos2d-x版本:cocos2d-x 2.2.0 目标平台:ios 1.首先在App

[原] Intellij IDEA开发Android,祝还在使用eclipse的早日脱离苦海

本文适合初次使用Intellij IDEA开发Android的开发人员 包括:首次插件安装,SVN基本使用,项目配置,JAR包配置,Android lib工程配置,运行调试,最基本和最常用的功能说明,开发工具转换成本为零 如果你在使用eclipse,习惯了快捷键,IDEA有个一键转eclipse快捷键 如果你在使用eclipse,受不了龟速的索引,受不了大量占用的内存,依然会卡顿 即使你是在项目中期,没问题,转过来吧,零成本 转过来估计你不会再回去. 添加Android插件 在首次安装过程中选择

APICloud可以让你开发变得很简单

QQ登录.分享怎么做?相信APICloud可以让你开发变得很简单.这里分享一个demo供大家参考. 1.使用模块,先打开它的开发文档http://www.apicloud.com/mod_detail/37360 添加模块至APIcloud项目 2. 编译自定义loader 3. 在腾讯开放平台管理中心创建应用,提交审核,拿到appkey和appId 4. 在项目代码中找到config.xml 添加代码 <font face="微软雅黑" size="3"&g

spring 第一篇(1):让java开发变得更简单(上)

1.释放POJOS能量 传统开发中是如何束缚POJOS呢,如果你开发过java很长时间,那你一定有接触过EJB的开发.那时候开发一个小小的功能都要扩展框架的类或者实现其接口.所以你很容易在早期的Struts,WebWork,Taperstry等框架中看到侵入到你应用中的框架代码. spring尽可能避免在你的应用中充满它的API.spring从来都不强迫你实现具体的spring接口或者扩展一个具体的spring类.替代的是,在基于spring开发的应用中经常没有指示说明你正在使用spring.最

如何让开发变得敏捷起来?

不久前和同事交流的时候看到这样一段话,"在经历敏捷软件开发方法在中国传播和发展的过程中,我们深切地感到,缺少对软件开发日常基础时间.尤其是与编程紧密相关的核心技术实践的指导,敏捷注定流于形式.缺少完备的软件设计.开发和质量保障相关实践,盲目强调快速迭代.接纳需求变化,项目只会陷入质量迅速腐化.Bug百出.交付失控的悲惨境地.对于这种只得其形.尽失其神.缺乏核心能力.空谈快速响应变化的敏捷,业内将其调侃为中国田园式敏捷".为什么会出现这样的问题呢?因为大家在学习敏捷开发的时候只是做到了形

Native App开发 与Web App开发(原生与web开发优缺点)

Native App开发 Native App开发即我们所称的传统APP开发模式(原生APP开发模式),该开发针对IOS.Android等不同的手机操作系统要采用不同的语言和框架进行开发,该模式通常是由“云服务器数据+APP应用客户端”两部份构成,APP应用所有的UI元素.数据内容.逻辑框架均安装在手机终端上. Web App开发 Web App开发即是一种框架型APP开发模式(HTML5  APP 框架开发模式),该开发具有跨平台的优势,该模式通常由“HTML5云网站+APP应用客户端”两部份

[原]quick2.25精灵变灰

由于quick2.25没有导出shader相应的接口,所以2.25无法直接使用shader. 本文简单介绍如何导出相应接口,同时教大家使用shader 实现精灵变灰 一.编写静态函数,以供导出使用(直接参考3.2版本的) 2.25的GLProgram是对应操作shader的类. 在GLProgram.h声明以下两个函数 static CCGLProgram* createWithByteArrays(const char* vShaderByteArray, const char* fShade