项目开发笔记(十五)

我以为我早已经摸透各种编码,各种开发语言转码早就可以写得666,但是这次填坑真的把人虐得欲罢不能.这次的事情有比较苛刻的前提条件,所以不一定适用于通过搜索找到此文章的各位遇到的类似情况.

先说说项目基本情况:

Client: Unity 5.3.4 (C#开发逻辑,Java OC原生开发支持,iOS下iL2CPP编译模式)
Server: 纯C++开发的服务器,PHP辅助

0x01. 引发的GBK编码问题

这个项目的网络数据的全部中文都是走GBK格式,数据到了客户端在iOS下所有中文均显示乱码.在 PC和Android下正常

关于编码问题有一篇经典文章 – 字符编码笔记:ASCII,Unicode和UTF-8

这个项目是一个超过十年的老项目(我主要负责移动客户端的实现),服务端使用纯c++开发,服务端底层架构和所有模块已经正常运行十年以上.导致遇到很多问题只能是客户端去适应服务端.所以不可能让协调服务端直接修改数据格式.

0x02. 使用I18N.CJK.DLL库

一个被提及最多的GBK格式数据在iOS iL2CPP模式下的转换方案是: 在link.xml中添加配置防止I18N.CJK.DLL被裁剪.配置方式为:

需从Unity安装目录 Editor\Data\Mono\lib\mono\unity 或 Editor\Data\Mono\lib\mono\2.0 两个目录中,拷贝I18N.DLL 和I18N.CJK.DLL到项目目录Asset文件夹下,在Assets根目录下添加link.xml文件,其内容如下:

但是我反复测试,这种方式在我当前的环境下(Unity 5.3.4,iOS,iL2CPP,Mac Pro,iPhone7P)一直是失败的.

继续阅读

项目开发笔记(十四)

最近几个月发生很多的事(工作之外),很多很多的事。工作上比较重要的事情还是需要好好记录,接下来说说Jenkins的配置流程(拖了几个月了其实),Jenkins在工作中给予我很大的帮助,到今天为止 Jenkins 已经帮我打包了200+个版本。每打包一个版本就相当于节省我20分钟的人力时间和沟通时间。自从有了Jenkins,我和公司的测试策划基本零交流,什么时候版本出来了一个邮件自动发送到他们的邮箱中。接下来他们爱测不测我不管。

我配置 Jenkins 的基本信息

- 工具信息
Download - https://jenkins.io/
Version - 2.32.2
OS - Win1064 desktop

- 项目信息
version - Unity534
OS - PC/Android/iOS

下载Jenkins的时候请注意有两个版本Long-term Support (LTS)Weekly,我们普通玩家就下载Long-term Support (LTS)即可。

继续阅读

项目开发笔记(十三)

最近使用Shader的时候需要给Shader传递参数,后面发现参数过多(30+个颜色值和10+个纹理),Shader在PC上运行得好好的,但是到某些移动设备上就尿崩,突然发现:

  1. 为什么shader无法往其传递数组呢?
  2. 为什么使用了多个纹理后(例如三星T560),在设备上无法运行正常?

Unity允许通过Material往Shader里传递int,Texture,Color, Vector4等参数,而且不同的移动设备可能支持不同的 Shader Model(SM 1 2 3 4 5),不同的SM版本会限制纹理指令和算术指令的数量使用。参考:High-Level_Shading_Languag。经过测试设备三星T560只能传入8个纹理指令,再增加就会工作不正常。我们不能改变设备显卡对SM的支持,只能通过减少纹理指令和算术指令的方式来兼容它。顺带把如何传入数组的问题也解决了。那怎么做呢?

继续阅读

项目开发笔记(十二)

哈,又一年了。在小时候过年总是非常有感觉,也满心期待。长大一点到了17 18岁的阶段,慢慢感觉过年失去味道 慢慢变成形式化,觉得过年传统做的节目都太无聊。又长大一点 到了25 26岁,过着常年背井离乡的生活 反而小时候对过年的期待又回来了,这几年我甚至非常热忱的参与到 杀猪 贴门神 拜天地等活动中…说回正题,我最近遇到一个需求.

一个小需求

对纹理中的指定色块,使用另一个纹理替换,如下图,这个图我们叫它原纹理

继续阅读

项目开发笔记(十一)

终于又可以继续我的项目开发笔记了,经过大半年的沉淀,我分别捣鼓了很多东西,大多数都应该整理笔记记录下来。构建工具一体化的实现我打算形成一个系列,把我的思路和部分实现记录一下。这里主要是针对Unity项目,在我实现整个流程之后 发现针对其他任何项目应该也类似,不管是需每次编译整个源码的cocos项目 还是AS项目Android原生项目。

相关涉猎

运行环境

Win10,OSX,Web

技术栈

SVN(or Git),应用在项目版本和源码管理

BAT批处理,SHELL脚本,应用在本地编译和打包

Jenkins,应用在控制远程执行打包,控制构建前后事件和任务

具体项目本身的适应,我准备拿Unity项目作为例子,这里如何把Unity的打包流程一键化是keypoint

继续阅读

编程感悟

最近一段时间团队里新加入了一些小伙伴,我一直希望大家在参与具体项目功能开发之前,先好好熟悉框架熟悉代码熟悉流程,在开始某个模块开发之前,先好好熟悉产品文档,先构思一翻。奈何有的同学似乎还是按照他原本的工作套路做事,无奈。

今天主要说说代码里的搜索功能(主要是指微软的IDE神奇VS里的代码搜索功能)

Visual Studio里的代码搜索功能非常丰富,常用的有:

0x00. Ctrl+F 主要是当前源代码文件里的搜索或者替换
0x01. Ctrl+Shift+F 主要是当前项目或者当前解决方案全局的搜索或者替换
0x02. Ctrl+;(冒号) 搜索解决方案资源管理器,主要是搜索当前解决方案ListBox里的源文件名字
0x03. Visual Assits 中的Shift+Alt+O 快速打开源文件,其中每输入一个字符 可根据当前字符定位最接近的源文件
0x04. Visual Assits 中的Shift+Alt+S 和 Shift+Alt+F 等
注意 Visual Assits 是一款最常用的VS插件,本人是烂番茄的深度中毒者。。近几年还购买了正版,略贵但是却物超所值的一个插件。

使用上述的几个功能,极大的提升了开发效率,而且我也几乎每天都需要使用它们。但是,针对新加入项目的同事,或者对项目组成一点不熟悉对代码基本结构毫不了解的同学我真的严重不推荐使用。

继续阅读

买房这件事

终于还是做了这一件事 — 买房.换一种很说法 — 终于成为了负一代.

这个时代,是一个大多数人都买不起房的时代,我也深知目前楼市泡沫严重,极有可能崩盘,即使如此我依旧出手的原因只有一个 – 刚需.

我老家风景秀丽,山水毫无污染,家家户户都拥有土地,山,是的每家都有山.下图就是我的家乡

虽然我的老家得天独厚,非常适合人居住,但是有一个非常严重的问题,由于人口最近十年来的迁移变化,导致家乡的人口急速减少,幼儿园小学初中等教育设施直接关门,我的小学母校初中母校现在已经不复存在,距离我家最近的小学在距离家里20KM的镇上,最近的初中在距离家里50KM的县里,最近的医院在距离家里50KM的县里.这些都是我不得不面对的问题..这些也是我下定决心买房的因素之一.

在过去的两个月(2016.09,10)的时间里,多次奔波之后,这件事情已尘埃落定.回想起整个过程,发现需要了解的事情实在太多,有必要写一篇文章记录一下.

继续阅读

最近代码量有所减少
一来是业余项目进入维护和交接阶段;
二来新的个人项目处在构思起步中;
三来公司项目处在平缓过度期;
四来近两月都参与公司招聘工作,负责技术基础功底面试,也就是所谓的技术一面。公司目前基本面试分为三面:HR面,技术一面,技术二面(基本就是CTO面了);
五来九月十月份私人事务繁忙,老家深圳往返多次,这两月我做了一件可能有点意义的事情,关于这件事情改天再写篇文章记录一下。

这里说说我作为面试官的经历

在我呆过的公司中几乎都参与了程序员的招聘工作,每一次都有不同的感受。

继续阅读

这是一篇把Unity做的应用提审到AppStore的踏坑指南,记录这个过程中遇到的几乎所有问题。

!!注意!! 这篇文章可能具有一定时效性,由于苹果审核策略一直在更改,所以文章中所述言论仅仅基于当前的审核制度。

首先…Show一下苹果对我提交的应用的拒绝记录(我的内心此刻布满黑人问号)

从上图的时间看,苹果的审核速度大大加快,与2013年的审核速度简直云泥之别.然而反观国内的某些平台审核..越来越慢(客观非黑)

继续阅读

最近有个小需求,在移动设备(iOS / Android)中应用调用拍照并把所拍照片存入相册。我原本以为这是一个很简单的事情,不就拍个照然后把照片丢进相册?心想最多100行代码即可解决问题,谁知还是踩中坑。且听我一一分解。

必备权限

<uses -permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses>
<uses -permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses>
<uses -permission android:name="android.permission.CAMERA"></uses>

添加入 AndroidManifest.xml 中

执行拍照

File destDir = new File(m_ImageRootPath);
if (!destDir.exists())
{
      destDir.mkdirs();
}

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(new File(m_ImageRootPath , m_ImageName)));
startActivityForResult(intent, 100);

代码中 m_ImageRootPath 为照片所存目录,m_ImageName为照片名。注意,若拍照不止一张 则照片名字最好每次不一样,否则你打开相册有可能每次都只能看到一张照片。

继续阅读