0%

Sol2简介

Sol是一个用于C++绑定Lua脚本的库,仅由头文件组成,方便集成,并提供了大量易用的API接口,可以便利地将Lua脚本与C++代码绑定起来,而不必去关心如何使用那些晦涩的Lua C API。正如其作者所言,Sol的目的就是提供极其简洁的API,并能高效到与C语言媲美,极大地来方便人们使用。

Sol支持Lua的绝大多数版本,包括 5.1、5.2、5.3和LuaJit等,但由于代码中用到了许多C++11/14特性,因此编译时需要编译器支持C++14标准。

具体使用以及介绍详情,请前往Github仓库Sol2主页

基础使用

从Sol的Github仓库clone下代码后,我们发现其目录下很多test开头的cpp/hpp文件,这些文件里面有着大量的Sol的使用示例以及各种特性的展示,而在example目录下的cpp文件都仅仅是一些最基础的使用示例。为了方便测试和体验Sol,你也可以自己建立一些自己的test.cpp文件,首先你要在源文件中include引用sol.hpp头文件,这样才能使用Sol提供的接口。而在使用gcc编译的时候,需要指定关联头文件的路径,可以使用如下命令:

g++ test.cpp -Isolpath/single/sol -llua -std=c++14

其中solpath是你Sol2的具体路径,在Sol2的项目目录下,有一个single/sol/sol.hpp头文件,这个头文件集成了所有的相关代码到一起,所以编译时 -I 后仅指定这一个路径就可以了,同时要保证你的gcc编译器支持C++14标准。

阅读全文 »

基本概述

在Lua中会自动帮你管理内存,通过gc(垃圾收集器)来收集所有不可能再访问到的死对象,因此开发者们不必去操心该如何释放对象所占用的内存。而Lua中目前适用于自动垃圾回收的类型包括: stringtableuserdatafunctionthread 等。

Lua所采用的gc算法叫做 标记&回收算法 。其原理是在每一次gc时会首先扫描并标记系统中的所有对象,被扫描到并标记的对象认为可达的,在gc中并不会回收,反之则会在gc中被回收释放掉。

早期的Lua采用的是双色标记回收算法,即系统中的对象只支持两种状态:blackwhite 。每个新创建的对象的颜色为白色,若其他地方存在该对象的引用,则将其标记为黑色,在进入gc的回收阶段时,会将白色的对象回收释放掉。这个算法存在一个比较大的缺陷,整个gc过程必须保证是原子性的不能被打断。假设在遍历对象链表标记对象颜色的时候中断,而此时新增了一个对象,这个对象的颜色属性很难确定。如果该新增对象标记为白色,而gc到了回收阶段,这个对象就会在没有遍历其关联对象的情况下被回收;如果标记为黑色,那么进入回收阶段后,该对象在没有被扫描的情况下就认为是不必回收的。因此,标记阶段和回收阶段必须合在一起完成,不能被打断。如此一来,gc的代价也会显得异常昂贵。

在之后的Lua 5.1版本中改进了这个算法,增加了新的颜色状态 : gray

相比之前,每个对象多了一种颜色状态,从而保证了gc过程可以是增量的,能够被中断后继续进行。这三种颜色分类如下:

  • white : 当前对象还没有被gc访问标记过,新增对象的初始状态,如果一个对象在标记过程后仍为白色,则表示该对象没有被系统中的其他对象所引用,可以回收;
  • gray : 表示该对象已经被gc访问过,但是该对象引用的其他对象还没有被访问到;
  • black : 表示该对象已经被gc访问过,并且该对象引用的其他对象也已经被访问过。

如此一来,只要存放灰色对象的链表不为空,标记过程就会继续下去,直到gray链表清空,表示所有对象都被扫描过了。但即使新增了灰色中间状态,仍然存在一个问题。假如在标记过程结束后gc中断,新建了一个对象,此时它的状态应该是白色,但紧接着的回收阶段,会将这个没有被扫描标记的对象认为是没有被引用的对象而回收释放掉。为解决这个问题,Lua又细化出了“双白色”的概念,即将 white 细分为 currentwhite 和 otherwhite 。每次gc会使用其中的一种 white ,而下次gc则使用另外一个,交替递推。这样在回收阶段,会判断相应对象的 white 是否和当前gc的 white 是否相同,如果相同则会让这个对象等到下次gc中扫描回收,不同则将其回收。

阅读全文 »

什么是OpenGL

( 以下来自维基百科 )

OpenGL英文全称 Open Graphics Library ,是一个开放图形库,定义了一个跨编程语言、跨平台的API规范,它用于生成二维、三维图像。这个接口由近三百五十个不同的函数调用组成,用来从简单的图形比特绘制复杂的三维景象。而另一种程序界面系统是仅用于Microsoft Windows上的Direct3D。OpenGL常用于CAD、虚拟实境、科学可视化程序和电子游戏开发。

OpenGL的高效实现(利用了图形加速硬件)存在于Windows,很多UNIX平台和Mac OS。这些实现一般由显示设备厂商提供,而且非常依赖于该厂商提供的硬件。开放源代码库Mesa是一个纯基于软件的图形API,它的代码兼容于OpenGL。但是,由于许可证的原因,它只声称是一个“非常相似”的API。

OpenGL规范由1992年成立的OpenGL架构评审委员会(ARB)维护。ARB由一些对创建一个统一的、普遍可用的API特别感兴趣的公司组成。根据OpenGL官方网站,2002年6月的ARB投票成员包括3Dlabs、Apple Computer、ATI Technologies、Dell Computer、Evans & Sutherland、Hewlett-Packard、IBM、Intel、Matrox、NVIDIA、SGI和Sun Microsystems,Microsoft曾是创立成员之一,但已于2003年3月退出。

一些常见的库

GLEW

GLEW是一个OpenGL扩展库,在现代OpenGL中,API函数是在运行时确定的,而不是编译期。GLEW可以帮助我们在运行时加载OpenGL API。

它的编译十分简单,通过Github下载源代码后,在终端进入glew目录,并在终端下依次执行如下命令即可。

make extensions
sudo make install

这样在我们的系统目录/usr/local/include和/usr/local/lib下会生成GLEW的相关头文件与静态库文件,之后创建项目时我们会用到。

阅读全文 »

初识插件化

早在Android 2.3的年代,依旧存在着著名的 65535 问题,即应用项目内的最大方法数不能超过65535个,否则无法编译通过。随着应用业务逻辑的不断发展,无论如何优化代码,也很快会遇到这个瓶颈。多数的解决方案,是通过拆分并装载多个dex字节码文件来规避这个问题。但对于结构复杂、业务逻辑繁重的应用来说,仅仅拆分dex文件是远远不够的,因此,插件化的这个概念也随之应运而生。

所谓 插件化 ,我们可以理解为将一个单独的apk文件,通过某种机制,使其可以在未安装的状态下直接运行。这样一来,我们便可以将主应用的多个业务模块拆分出来,单独编译成不同的apk文件,不仅可以减轻主应用的体积,还能使业务逻辑模块化,降低模块间的耦合。

简要概括下来,插件化主要包括以下三个优点:

  • 动态更新 当某个业务模块需要改进更新的时候,不用再升级安装庞大的宿主应用,仅仅自动下载对应的轻量插件便可以,并且无需用户去安装。这对于产品的迭代优化,紧急Bug的修复都有着很大的帮助。

  • 可定制化 插件化在降低模块耦合的同时,也为应用的定制给予了极大的便利。针对不同的发布渠道或是运营需要,宿主应用能够在不修改代码的情况下从容地进行定制,大大降低了发布成本。

  • 并行协作开发 对于大型应用,独立的插件可以在不同的团队之间并行进行开发,缩短项目进程,提高开发效率。

阅读全文 »

回顾2014

1. 搭建自己的github博客,学习通过使用md来写博客

2. 学习使用github来关注一些优秀的开源项目

3. 自学了python脚本语言,用于日常工作开发中的一些工具的编写

4. 完成阅读了《代码大全》

5. 搭建了适合自己使用的vim环境,使用tmux和zsh来进行开发工作

阅读全文 »

关于tolua++

tolua如何工作

tolua++tolua的扩展版本,一款能够极大地简化C/C++代码与Lua代码集成的工具。tolua基于一份简单干净的头文件,能够自动生成从Lua代码中访问C/C++特性的绑定代码,通过使用Lua API和标记方法工具,tolua来映射管理C/C++中的常量,外部变量,函数,类和方法来给Lua使用。

使用tolua通常要先建立pkg文件,里面包含对应C/C++头文件中能够被tolua++解析的声明,如常量、变量、函数以及类等。tolua++会根据pkg文件,来生成用于C/C++源文件与Lua交互的c/cpp文件,从而实现Lua中访问指定的C/C++代码。其中,无论是C函数还是C++对象的方法,都一律导出为静态函数。

如何使用tolua

生成的tolua++可执行文件,支持一些可选选项,使用./tolua++ -h可进行查看。

  • 使用 -o 来指定生成的c/cpp文件

    ./tolua++ -o myfile.c myfile.pkg

  • 使用 -L 来在优先通过都dofile()来运行一份指定的Lua文件

    ./tolua++ -o myfile.c myfile.pkg -L rule.lua

  • 使用 -n 来指定导出到lua的package

    ./tolua++ -n pkgname -o myfile.c myfile.pkg

绑定生成代码必须被编译并链接到应用程序,才能被Lua代码访问。每一个被解析的package文件代表要导出到Lua的包。默认情况,包名称就是输入文件的名称。用户可以指定一个不同的包名称。在tolua中,需要明确地初始化解析出的对应的包给Lua。在C/C++代码中我们应该调用初始化函数 int tolua_pkgname_open(void) 来进行初始化。其中 pkgname 代表被绑定的包的名称。

更加详细的说明请参考这里

阅读全文 »

常见片段定义

片段内置默认文本(占位符可以包含其他UltiSnips元素)

    snippet a
    <a href="$1"${2: class="${3:link}"}>
       $0
    </a>
    endsnippet

单词开头自动大写

    snippet title "Titelize in the Transformation"
    ${1:a text}
    ${1/\w+\s*/\u$0/g}
    endsnippet

条件替换

    snippet cond
    ${1:some_text}${1/(o)|(t)|..*/(?1:ne)(?2:wo)/}
    endsnippet
阅读全文 »

TCP

传输控制协议(Transmission Controller Protocol),是一个面向连接的协议,TCP套接字是一种流套接字,为用户进程提供可靠的全双工字节流。


UDP

用户数据报协议(User Datagram Protocl),是一个无连接协议,UDP套接字是一种数据报套接字,UDP数据报不能保证最终到达目的地,不保证各个数据报的先后顺序夸网络后保持不变,也不保证每个数据报只到达一次。


ARP

地址解析协议(Address Resolution Protocol),把一个IPv4地址映射成一个硬件地址(如以太网地址)。ARP通常用于诸如以太网、令牌环网和FDDI等广播网络,在点到点网络上并不需要。


###RARP

反向地址解析协议(Reverse Address Resolution Protocol),把一个硬件地址映射成IPv4地址,有时用于无盘节点的引导。


阅读全文 »

什么是Markdown

Markdown 是一种轻量级标记语言,创始人为约翰·格鲁伯(John Gruber)。它允许人们“使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档”。这种语言吸收了很多在电子邮件中已有的纯文本标记的特性。Markdown同时还是一个由Gruber编写的Perl脚本:Markdown.pl。它把用markdown语法编写的内容转换成有效的、结构良好的XHTML或HTML内容,并将左尖括号('<')和&号替换成它们各自的字符实体引用。


语法简介

  • 段落

    上下含有一个以上的空行,会被视为一个独立的段落。

  • 换行

    使用<br>标签,或是结尾处插入两个空格。

  • 标题

     标题1(最高阶)
     =============
    
     标题2(第二高阶)
     --------------
    
     # 这是H1
    
     ## 这是H2
    
     ###### 这是H6
阅读全文 »

Apache-2.0

  • Apache Lience
  • 支持商业用途,允许使用者修改和重新发布代码(以其他协议形式)
  • 协议规则
    • 需要给代码的用户一份Apache Lience
    • 如果修改了代码,需要在被修改的文件中说明
    • 在延伸的代码中(修改或衍生的代码)需要带有原来代码中的协议、商标、专利声明和其他原来作者规定需要包含的说明
    • 如果再发布的产品中包含了Notice文件,则需要在Notice文件中带有Apache Lience

BSD

  • Berkerley Software Distribution
  • 支持商业用途,可使用、修改源码
  • 协议规则
    • 如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议
    • 如果再发布的只是二进制类库/软件,则需要在类库/软件的文档那个和版权声明中包含原来代码中的BSD协议
    • 不可以用开源代码的“作者/机构的名字”或“原来产品的名字”做市场推广
阅读全文 »