Notes

A place to record ideas


  • 首页

  • 归档

  • 标签

  • 搜索

介绍下StorIOSQLite到RxJava

发表于 2017-03-31 |

storio

storio是github上的开源项目,它用来操作SQLiteDatabase和 ContentResolver的操作进行封装,提供更简单更强大的api.我们项目最近从xutils3转换为StorIOSQLite,说说对它的体验和它是如何使用RxJava进行封装.

storio是通过预先代码生成进行实体类的赋值

通过SQLiteTypeMapping提供实体的三种Resolver:

  1. PutResolver
  2. GetResolver
  3. DeleteResolver

也就是分别对应我们在进行API操作时

  1. 将实体转换为数据库数据(InsertQuery,UpdateQuery…)
  2. 将数据库数据(Cursor)装换成实体对象
  3. 如何执行删除操作

常规的Resolver只要我在实体类中使用它的Annotation Processor便会自动生成。

什么时候需要自定义呢?

复杂实体对象的时候(连表查询),因为storio是不关心具体实体类的,它只关心如何将实体和数据库操作建立起关系
比如文档中的UserWithTweetsGetResolver.java

阅读全文 »

2017开篇:curl使用备忘

发表于 2017-02-13 |

真的好久没写东西了,主要原因是去年下半年太忙了,忙着找工作忙着边学边做Android…
这里备注一下curl的使用,因为项目原因发布新版本的时候需要将编译后的APK文件上传到统一的版本管理后台.

解析远端Json文件并下载资源

比如我这里需要解析干货集中营的接口并下载图片

API:http://gank.io/api/data/福利/10/1

解析Json我们使用jq,可以用Homebrew安装

1
brew install jq
1
curl -s http://gank.io/api/data/%E7%A6%8F%E5%88%A9/10/1 | jq '.results[] | .url ' | xargs -n 1 curl -O -#

上传文件时显示进度

上传文件时如果需要显示进度必须显示指明-o参数比如-o /dev/null

获取网络状态码

使用-w参数

1
curl -s -o /dev/null -w %{http_code} www.baidu.com

不同平台下的项目自动打包方式

发表于 2016-08-16 |

iOS

iOS下的打包主要由xcodebuild来完成.在xcode 7以前我通过xcodebuild构建项目然后通过xcrun来生成ipa文件.
类似以下命令

1
2
xcodebuild -configuration ${BuildConfig} -target "${TargetName}" GCC_PREPROCESSOR_DEFINITIONS="\${GCC_PREPROCESSOR_DEFINITIONS} FREEVERSION=0" WARNING_LDFLAGS="\${WARNING_LDFLAGS} -w" CODE_SIGN_IDENTITY="${DistributionCodeIdentity}" PROVISIONING_PROFILE="${DistributionProvision}"
xcrun -sdk iphoneos PackageApplication -v "${ProductDir}/${TargetName}.app" -o "${PrjDir}/${IpaName}"

这种方式打包有很多局限:

  1. 需要自己备份生成的符号文件等.
  2. 在xcode 7以后这种打包方式不能通过苹果的审核.
  3. 如果需要其他证书的ipa的文件,又需要重新构建.
    阅读全文 »

说说Core Graphics

发表于 2016-08-03 |

记得11年左右做iOS开发的人真不多,大环境下大家学习iOS开发基本都靠WWDC和国外的文献,近几年随着iOS开发的火爆,好多技术都被挖掘出来(其实是自己以前英文不好,好多东西都是点到为止),最近比较闲重新看了下iOS相关的一些东西.感觉有些东西虽然不是常用的,但明白后可以更灵活的运用到日常的开发中.这里记录下我对iOS里一些特性理解.

为什么说Core Graphics是广义的离屏渲染?

首先看GPU屏幕渲染两种方式:

  • On-Screen Rendering:意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行。
  • Off-Screen Rendering:意为离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。

上面的两种方式都是在GPU中执行的,离屏渲染会开辟一个缓冲区上下文进行渲染(这里不会在屏幕上显示),然后进行上下的切换.比如将之前开辟的缓冲区设置为当前屏幕的缓冲区(显示到屏幕),但这里开销比较大。
而Core Graphics是Software rendering,也就是CPU执行GPU上一样的算法(GPU能更好的执行并发任务).
参考:https://en.wikipedia.org/wiki/Software_rendering

为什么说离屏渲染并不意味着软件绘制?

QuartzCore Framework通过Core Anmation来把我们构建的界面绘制到屏幕上(通过操作openGL ES).
这里面会使用openGL ES的缓冲区,它是在GPU里执行的。比如CALayer的masking就使用了片段着色器.
CoreAnmation

这里说明下CALayer的mask,它是根据设置的layer的alpha值进行过滤像素实现模板的(片段着色器),不是openGL ES中的模板测试实现的

参考WWDC:https://developer.apple.com/videos/play/wwdc2014/419/

Quartz 2D 和Quartz Core的区别是什么?

QuartzCore Framework通过Core Anmation来把我们构建的界面绘制到屏幕上.
Quartz 2D是CoreGraphics Framework下一套API

Core Graphics有颜色的混合设置吗?

CGBlendMode定义了很多预设模式,可以通过drawInRect:blendMode:alpha:或者UIRectFillUsingBlendMode(...)等函数进行混合模式的设置。

openGL ES的数据可以用Core Graphics绘制吗?

具体的转换方法参考这里:http://gamesfromwithin.com/remixing-opengl-and-uikit

如何理解贝塞尔曲线

通过维基百科的图理解:)

  • 二次贝塞尔曲线只有一个控制点p1
    二次贝塞尔曲线
  • 三次贝塞尔曲线有两个控制点p1和p2
    三次贝塞尔曲线

参考

  • https://github.com/gnustep/quartzcore
  • http://www.jianshu.com/p/6d24a4c29e18
  • http://www.jianshu.com/p/0e785269dccc

以ABS宏为例说说Clang中的宏定义方式技巧

发表于 2016-07-25 |

我们在iOS开发的时候经常使用宏定义,最常用的宏肯定是DEBUG,大概像下面这样:)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#if DEBUG
...
#endif
#if __has_feature(objc_arc_weak)
...
#elif __has_feature(objc_arc)
...
#else
...
#endif
#if (TARGET_OS_MAC || TARGET_OS_IPHONE)
...
#endif

记录下我对Clang中定义的宏ABS的理解(从零开始的理解),它的作用很简单:得到一个数的绝对值。

阅读全文 »

用Lua实现A*寻路算法

发表于 2016-07-22 |

关于A*寻路的算法参考这篇文章

阅读全文 »

WindowsPhone的TextBox多行支持及疑问

发表于 2016-07-20 |

最近在使用2dx的时候改造了一个UIEditBox,使其支持多行输入,因为在Windows Phone上单行和多行输入都是使用同一个系统控件TextBox,关于如何使用多行输入,可以参考微软的文档

当然Cocos2dx在3.5以上的版本中已经是使用cpp(cx)的开发模板,大意的代码如下:

1
2
m_textBox->TextWrapping = Windows::UI::Xaml::TextWrapping::Wrap;
m_textBox->AcceptsReturn = true;

我们新加了一个类UITextViewWinRT提供系统的多行输入。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void UITextViewWinRT::SetupTextBox()
{
RemoveTextBox();
m_textBox = ref new TextBox;
m_textBox->Name = "cocos2d_editbox_textbox";
m_textBox->MinWidth = 200;
m_textBox->PlaceholderText = m_strPlaceholder;
m_textBox->Select(m_textBox->Text->Length(), 0);
m_textBox->MaxLength = m_maxLength < 0 ? 0 : m_maxLength;
m_textBox->MinHeight = 100;
m_textBox->MaxHeight = 200;
m_textBox->TextWrapping = Windows::UI::Xaml::TextWrapping::Wrap;
m_textBox->AcceptsReturn = true;
SetInputScope(m_textBox, m_inputMode);
m_textBox->Text = m_strText; //注意这行
auto g = findXamlElement(m_flyout->Content, "cocos2d_editbox_grid");
auto grid = dynamic_cast<Grid^>(g);
grid->Children->InsertAt(0, m_textBox);
}

如果阅读过官方的UIEditBoxImpl-winrt.cpp加上细心的同学会注意m_textBox->Text = m_strText; //注意这行这行代码,因为我将这段代码放到设置TextBox支持多行输出的代码后面了。

如果不这样的的话,如果你给TextBox设置多行文本的时候是无效的,猜想可能是系统在设置其文本属性的时候计算了文本的摆放的结构,当渲染的时候进行渲染.
Windows Phone的换行符为\r\n不是一般的\n,这会引起新的问题,2dx里将unicode码转化成UTF8在Label里显示\r会被显示为乱码!

阅读全文 »

Cocos2dx在Android上使用ETC1+Alpha压缩纹理

发表于 2016-07-15 |

我们为了优化游戏的内存占用,会给图片资源进行有损压缩,在Android上则是使用ETC1(Ericsson texture compression)进行纹理压缩,压缩纹理无论从加载速度(GPU识别)和内存占用都有很大的优势,唯一的缺点就是有损。
也就是它不是万金油,并不是所有的图片都能使用ETC1压缩。我在记录下我是如何在Cocos2dx中使用ETC1进行纹理压缩.当然这里是在android平台下使用。

为什么是ETC1

ETC1格式是OpenGL ES图形标准的一部分,并且被所有的Android设备所支持,不支持透明通道。需要是POT纹理。虽然后面的ETC2支持透明通道,但是它是OpenGL 3.0的标准,并不能被所有Android设备所支持,而ETC1我们能通过技术手段加入透明通道。参考这篇文章

之前的准备

ETC1

我采用将一张纹理分割成两张图的方案,也就是图片 = RGB部分纹理+Alpha部分纹理。因为纹理大小由于硬件和操作系统原因是有限制的,2048x2048基本能被主流设备所认同,如果采用Alpha拼接的方式,原本2048的纹理最终大小会超过2048,如果所有纹理加上最大尺寸1024的限制又会使纹理数量增多.所以最终我选择了分割图片的方案。

阅读全文 »

quick的ScrollView随想

发表于 2016-07-07 |

一直使用quick。之前一直忙着做项目,都没有空停下来好好想想OpenGL的一些知识.今天和同事分析了下ClippingNode的实现,记录在这里。

quick的尴尬

quick用裁剪测试,实现了一个lua版的UIScrollView.lua,可以满足简单的裁剪和滑动需求.

1
2
3
local UIScrollView = class("UIScrollView", function()
return display.newClippingRegionNode()
end)

如果我们需要滑动列表能嵌套(横(竖)向中嵌入竖(横)向的列表),这个列表就不能满足我们的需求了.

ClippingRectangleNode的核心实现是根据OpenGL的裁剪测试

1
2
3
glEnable(GL_SCISSOR_TEST);
glScissor(x,y,width,height);
glDisable(GL_SCISSOR_TEST);

ClippingNode原理

ClippingNode采用模板测试实现裁剪,可实现裁剪的嵌套.这里分析它的实现步骤。

阅读全文 »

iOS(Core Graphics)和OpenGL里的矩阵运算

发表于 2016-07-04 |

总结下iOS和OpenGL里的矩阵计算

iOS (Core Graphics)

iOS里面的矩阵用行向量表示,所以是矩阵右乘向量.

以Quartz 2D举例平移,因为是2d所以是一个3x3的矩阵,3d就是4x4

补充:有朋友问我这里为什么变成了3x3的矩阵?3d则是4x4?

这里使用的齐次坐标。图形学引入齐次坐标的目的主要是合并矩阵运算中的乘法和加法,表示为p’ = p*M的形式。即它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。

$$\begin{bmatrix} x&y&1 \end{bmatrix} \cdot \begin{bmatrix} a&b&0 \\ c&d&0 \\ t_x&t_y&1 \end{bmatrix} = \begin{bmatrix} ax+cy+t_x&bx+dy+t_y&1 \end{bmatrix}$$

所以CGAffineTransform CGAffineTransformMakeTranslation ( CGFloat tx, CGFloat ty );是上面的公式中的
a=d=1和b=c=0

也就是矩阵$\begin{bmatrix} 1&0&0 \\ 0&1&0 \\ t_x&t_y&1 \end{bmatrix}$

如果我们把这个公式用于3d 则是CATransform3D

$$\begin{bmatrix} x&y&z&1 \end{bmatrix} \cdot \begin{bmatrix} m11&m12&m13&m14 \\ m21&m22&m23&m24 \\ m31&m32&m33&m34 \\ m41&m42&m43&m44 \end{bmatrix} = \begin{bmatrix} x’&y’&z’&1 \end{bmatrix}$$

m34可以影响投影矩阵设置为$-1 \over d$表示向z=d的平面进行透视投影

OpenGL

OpenGL使用列向量表示,所以是矩阵左乘向量.

$$
\begin{bmatrix} a&b&c&d \\ e&f&g&h \\ i&j&k&l \\ m&n&o&p \end{bmatrix} \cdot \begin{bmatrix} x\\ y \\ z \\ w \end{bmatrix} = \begin{bmatrix} ax+by+cz+dw \\ ex+fy+gz+hw \\ ix+jy+kz+lw \\ mx+ny+oz+pw\end{bmatrix}
$$

OpenGL的透视投影计算可以参考这篇文章

123
DannyHe

DannyHe

思绪来得快去得也快,偶尔在这里停留

25 日志
42.6k 网站码字
27 标签
RSS
GitHub
友邻
  • Jucongyuan
  • Leo
0%
© 2015 - 2017 DannyHe
由 Hexo 强力驱动
主题 - NexT.Pisces