Long Luo's Life Notes

每一天都是奇迹

By Long Luo

2014年的51 3天假期,有2个上午都去学车去了,因为不久之后我就要去考试了,总之呢,很多事情都是做的越早越好。今天把科目二考试的一些注意事项给记下来:

0. 准备工作

上车之后,第一步是调好靠背,后视镜,注意座椅不要调到太靠前,系好安全带。后视镜要保持后轮车毂在后视镜中间位置,把手在后视镜上方。

松手刹,踩住离合器和刹车,离合器踩到底,挂一档起步,慢慢松离合器,直到车头开始震动,离合不动,慢慢松刹车,车辆起步。

最重要的是要踩好离合器,保持很慢的速度,因为速度慢了可以慢慢调整,快了的话就没办法调整了。

1. 曲线行驶

车身调正,保持车身偏右进入,“”字压着右边边线,进入之后,保持”“字压着边线,转弯时,方向盘不动,直到车头角压着左边边线,方向盘右转一圈半,之后保持字压着边线。

Ok。

2. 直角转弯

车身调正,保持车身偏右进入,“”字压着右边边线。直到车头盖压住前面边线,迅速向左打死方向盘,车身平行之后,迅速调正方向盘。

Ok。

3. 坡道定点停车

车身调正,一直打左转向灯,保持字和字的中间压着黄线左边缘,慢速行驶。当左后视镜刚好可以看到双黄线的上边缘,踩住刹车。

Ok。

4. 侧方停车

车身调正,保持字压着右边黄线,慢速行驶。慢慢调到距离右边黄线为30公分左右,从右后视镜观察。当与二号角与窗口锁重合时,停车。方向盘向左打到死,直到字压到黄线中间,停车。

方向盘调正,右转半圈,踩住刹车,挂倒档,开始倒车,注意左后视镜,当观察到后轮轮胎碰到黄线时,迅速向左打死方向盘,直到车头盖缝隙与左边线平行,停车。

打左转向灯,踩住刹车离合器,挂一档,直到字压住左边黄线,向右调整方向盘。直到字压住右边线,方向盘回正。

Ok。

5. 倒车入库

倒车入库是5项中最难的。

调整车头盖左边缝隙压住左边边线,车身调正,当桩与右窗口重合时,下车查看,保持车尾与2个桩在一条直线上。

上车,方向盘向右打死挂倒档,观察右后视镜,当车毂与角间隔一个篮球宽度时,方向盘向左回一圈,观察左后视镜,当车身与边线平行,方向盘回正,当后视镜完全遮住时,间隔0.5s,停车。

起步观察,车身两边距离宽度是否一致,哪天多向哪边调,调半圈后回正,观察左窗口锁,当与线重合时,方向盘向左调一圈半,保持方向盘不动,直到左车门把手与线重合,停车。挂倒档,方向盘不动,观察左后视镜,直到左车毂与角间隔30公分,向左打死方向盘,车身回正时,方向盘回正,观察后视镜是否压住线。

Ok。

Long Luo Created at AM12:20 ~ 13:15 @May 03rd, 2014 at Shenzhen, China.

By Long Luo

最近面试时遇到一个算法题:

仿照Excel的列编号,给出一个数字,输出该列编号字符串。 例如:A对应1,Z对应26,AA对应27,AZ对应52 ……

这个题目是一个典型的26进制思路去处理,一个整数除26然后但是这个题目里面有很多陷阱,在1, 26, 52等特殊情况进行考虑,经过晚上接近半个多小时的编写,完成的代码如下:

C++

C++实现如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>
#include <string.h>

using namespace std;

//函数itos:正整数到编号转换
//num:输入的正整数,pcout:输出,Max:输出控件最大长度
void itos(int num, char *pcout )
{
char *res = new char[255];
int m = 0, n = 0;

while((num >= 1) && (n < 255))
{
m = num % 26;
if (m != 0)
{
res[n] = 'A' + m - 1;
}
else
{
res[n] = 'Z';
num--;
}

num /= 26;
n++;
}

for(m = n; m > 0; m--)
{
pcout[n - m] = res[m - 1];
}

pcout[n] = '\0';
delete[] res;

return;
}

//soti:字符串到数字的转换
int stoi(char *cha)
{
int m = 0, n = 0, i = 0, val = 0, a = 0;
char *pc = cha ;

while(*pc != '\0' )
{
//后移到个位
pc++;
n++;
}

for(i = 1; i <= n; i++)
{
//位循环
pc--;
a = i;
m = 1;

while(a > 1)
{
//位权
m *=26;
a--;
}

m *= (*pc - 'A' +1);
val += m;
}

return val;
}

int main()
{
char out[255] = {0};
printf( "out = %s\n", out);
itos(32, out);
printf( "out = %s\n", out);

getchar();

return true ;
}
阅读全文 »

By Long Luo

下面列举一些收藏的资源,用于学习参考:

1. Android API Guides

  1. Android API Guides:
  2. OSChina Android API Guides:

2. Java Develop Kit References

  1. JDK7 English:
  2. JDK6 Chinese API:

3. Performances

  1. Best Practices for Performance:
  2. 性能优化系列总篇
  3. 图片ImageCache技术
  4. 图片SD卡缓存技术
  5. 性能优化之数据库优化
  6. Android网络缓存

4. Developing

  1. Android开发者必知的开发资源
  2. StackOverFlow@Android

5. OpenSource App

Long Luo Version0.1 Created at 2014/4/8 10:54:32 @Shenzhen, China. Long Luo Version0.2 Update at 2014/4/9 19:45:07 @Shenzhen, China.

By Long Luo

周星驰的电影《功夫》里面借火云邪神之口说出了一句至理名言:“天下武功,唯快不破”。

在移动互联网时代,同样如此,留给一个公司的窗口往往只有很短的时间,如何把握住这个时机,迅速开发出产品,成为至关重要的一环。相对传统互联网时代的PC产品,用户对移动端产品的容忍度更低。而一款移动应用在推出的时候可能只是接近完成的状态,这就需要通过快速的迭代开发来更新产品,不断完善产品来留住用户。同时,通过更新产品也能唤醒一些沉默用户,让一些原本下载了应用但使用次数非常少的用户给该应用多一次机会。

所以快速迭代成为移动互联网时代的一个重要生存法则。

1. 为什么需要性能优化?

上面说到,在时间窗口期内开发出产品是极端重要的,但是虽然基本功能我们实现了,但是开发出来的产品代码运行的效率怎么样呢?我们的App用户给用户的体验如何呢?

  • 我们的App在低端机上经常ANR、闪退、卡顿等
  • 我们的App在其他分辨率上显示惨不忍睹?
  • 我们的App在不同网络的情况下如何处理的

我们的App体验如此之差,导致大量的用户流失。这些迫使我们认识到性能优化是非常重要,某种程度上甚至超过了新功能的开发。

也验证了一句话:“别人有的我们也有,而且比他们的要好要快。

做Android开发已经3年了,期间也开发了不少App了,最开始写App的时候,只追求迅速完成所需要的功能,后来随着对相关知识的熟悉,再回头看之前写的代码,也知道有哪些改进和优化的手段了。性能优化,一方面需要自身能力的提高,另外一方面,也需要有意识去学习优化技术,并应用于自身项目的开发中。

2. 性能优化技术

我们的Android App开发除了NDK之外,使用的都是Java语言,而Java语言是一种基于虚拟机JVM运行的语言,所以相比C/C++语言来说,效率是比较低的。Java需要占用大量内存来换取执行速度,而不定期的GC机制,直接导致Android界面的卡顿现象。

相比Apple的iOS,Android要面对无数不同的硬件组合,分辨率,驱动等,导致App质量参差不齐。

性能优化技术,简而言之,就是提高我们程序的性能,让我们的应用更快,更少使用CPU资源,更少使用内存。

3. 性能优化笔记提纲

性能优化是一个非常大的课题,在这里目前准备写8篇笔记来记录,提纲如下:

  1. 如何书写优秀代码?
  2. 程序性能测试
  3. App内存优化
  4. 图片缓存技术(ImageCache及Image SD卡缓存技术)
  5. 数据库优化
  6. 网络优化
  7. App UI优化
  8. 性能调优工具

Long Luo Version0.1 Created at PM14:10 April 12th, 2014 @Shenzhen, China. Long Luo Version0.1 Completed at PM15:25 April 12th, 2014 @Shenzhen, China.

By Long Luo

从小到大,虽然玩过的游戏不少,但是从写程序开始,目前为此仅仅写过2个游戏。其一是2011年在MTK平台下写的贪食蛇,其二是2010年在嵌入式开发板上写过一个迷宫的游戏。第一个代码量大概有3000行左右,第二个有2000行左右。

这2个游戏都很简单,而且网上有很多现成的例子可供参考,因此难度也比较低。

这2天把拖延了好久的《Android应用开发揭秘》的游戏引擎的那一章看完了,收获还是很大,在此写一篇读书笔记。

关于Game Engine,我能想到的几个问题:

  1. 游戏引擎是什么?
  2. Game Engine是为了解决什么问题?
  3. Game Engine的架构是什么?
  4. 如何设计一款游戏引擎?
  5. 游戏引擎包含哪些模块?

下面就来探讨几个问题:

一、Game Engine是什么?

游戏产业在全球来看是一个很大的产业,一款游戏大作包含了非常多的元素。游戏涉及到剧情、人物、任务、关卡、地图、画质、美术、音乐、网络等多种元素。开发一款游戏实际上需要耗费非常多的资源,据说North Star的《GTA V》耗资几亿美元。正因为如此,在开发项目过程中,尽可能复用之前项目成功的东西就非常重要。

一款游戏中,Game Engine直接控制着剧情、关卡、美工、音乐、操作等内容,将游戏的所有元素捆绑在一起。

一般来说,一款Game Engine需要包含以下模块:

  1. 基本框架(渲染、逻辑、物理 等等各部分如何组装)
  2. 资源管理
  3. 渲染
  4. 基本逻辑(网游还要解决逻辑的同步问题)
  5. 物理(有时候和逻辑合并)

———–分割线,以下是重要但较为独立的部分————- 6. UI 7. 音乐音效 8. 网络 9. 脚本(有些类型的游戏引擎需要脚本和逻辑的关联性非常强,有些脚本则比较独立)

二、Game Engine为了解决什么问题?

Game Engine实际上有效的减少开发者编写程序时的冗余劳动,同时增强游戏的可移植性

Engine就是游戏的框架,我们需要往框架中填充内容就可以形成一个游戏。

引擎,就是一系列的工具和生产链,像Unreal 3,Unity这样的成熟引擎,用起来非常方便,就是因为它的关卡/场景编辑器十分宜用,支持多种脚本语言。这类引擎运用恰当的话,理论上能将关卡调试和物件流水线的大部分工作从程序员那里完全移出。

三、Game Engine的架构

游戏 = 引擎(程序) + 资源(图像、声音、动画等)

目前的Game Engine的架构都是Model-View-Controller架构,逻辑和显示分开,由一个逻辑控制流来协调Client的请求和Server的行动。

  1. View: 负责界面回执
  2. Controller:处理工作流程的创建和种植,用户输入,各种事件的处理
  3. Model: 模型、逻辑,程序的功能实现

消息循环->更新数据->绘制各节点 这是绘制的基本结构基本不会有大的改变。

各种引擎的变种很大部分是在游戏逻辑上的封装。脚本也好,直接写代码也好。比如较为古老的数据与函数分离,以C语言为代表。大行其道的类结构。以c++为代表。以及现在光环日耀的CBSE,基于组件的架构

阅读全文 »
0%