自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(78)
  • 资源 (3)
  • 收藏
  • 关注

原创 Opengl-从顶点数据到Vertex shader

简单的vertex shader如下:attribute vec a_position;uniform mat4 u_ mvp;void main(){gl_Position = u_mvp * a_position;}这些输入a_position和u_mvp是怎么从c语言映射到shader呢?1,首先编译并链接shader。a:创建一个shader,glCreat

2017-02-11 14:08:56 1924

原创 计算机动画理解

如果把图形引擎看作一个系统,输入参数就是顶点,纹理,输出就是各个对应像素点的颜色。而动画系统的输入时时间,输出就是图形引擎的输入,所以动画本质上市通过改变顶点数据和纹理数据来实现的。常见的有两种动画:序列帧动画和骨骼动画。序列帧动画通过时间来改变纹理进而实现最终图像的变化,不同的帧对应不同的纹理。骨骼动画通过骨骼(变换矩阵)对顶点位置数据进行操作,也可以实现图形的变化。推广一下

2017-02-11 11:47:31 489

原创 脚本在游戏中的应用

有幸在当前的公司接触了这种完全由脚本驱动的游戏开发。项目组的全部是做脚本开发的,两个不同的游戏,换一下脚本和资源,就成了同一个游戏。游戏的不同其实就是脚本和资源的不同。这和大多数游戏开发公司都不一样。游戏引擎包含了一个Python引擎,渲染引擎,动画模块,网络模块,事件回调模块,资源管理模块。Python引擎是和Python相关的部分,封装游戏引擎相关接口给脚本,解析脚本,执行脚本。后面这

2016-04-24 22:46:07 855

原创 wxPython结合cocos2d-x开发编辑器

1,窗口嵌入的问题,可以自定义一个wxEGLView并导出,这个view就是cocos2d-x使用的view,然后遍历整个已经建好的wxPython的窗口句柄,找到根句柄直接SetParent(),窗口就嵌入了。2,游戏窗口渲染的问题,由于上一步的view已经加入窗口树,并且设置了消息处理函数,所以点击事件可以正常处理。如果要处理渲染,可以定义一个wxAppDelegate继承wx::wxAp

2014-12-20 20:06:51 1161 1

原创 Shader使用第一条

谨慎使用内置的汗水比如点积函数dot,一些芯片部支持

2014-09-11 15:11:31 673

原创 游戏循环到游戏录制

一般的代码是这样的while(1){    if(PeekMessage(&msg))    {        TranslateMessage(&msg);        DispatchMessage(&msg);    }    else    {        mainloop();    }}如果有用户输入,则处理输入,没有则调用mai

2014-05-20 22:53:43 1268 2

原创 cocos2d-x 3.0渲染架构

3.0之前是visit后就draw,而draw是真正的OpenGL操作。也就是说,每访问一个对象,先计算节点的渲染数据,然后马上渲染。因为节点是按树形结构组织的,如果两个父节点p1和p2的深度分别是10和20,c1是p1的子节点,其深度是30,c2是p2的子节点,其深度是

2014-05-13 23:25:39 8102 4

原创 导出python类

以导出类CObject为例struct CObject{void* m_pData;PyObject* m_pObj;void fun(){printf("CObject::fun()");};};1,定义一个PY结构struct PY_CObject{PyObject_HEAD;CObject* obj;};2,定义构造、初始化、析构函数s

2014-05-04 23:09:34 1571

原创 cocos2d-x plist文件各个属性的含义

plist文件是小图在合并成大图的时候生成的配置文件,所以需要由大图+plist文件可以完全还原出小图。合图后的大图总体尺寸面积一般要小于原来的小图面积之和,是因为合图中会去掉小图周围的透明像素(当然,有些需求是不能去掉这些透明部分的,)。

2014-05-02 15:04:03 4238 1

原创 C++接口的设计——析构函数

接口不应该有实体函数,即接口的所有函数都应该是公共的纯虚函数。不过析构函数应该不应该是纯虚函数呢?如果是非纯虚的虚函数,那函数体要写什么呢?答案是什么都不写,内容为空的函数很不简洁,不爽。那就设置成纯虚函数,很遗憾,编译通不过,因为子类会调用父类的析构函数,父类析构函数指针不应该为空。那就考虑设置成普通函数吧,还可以省去声明,因为C++默认实现析构函数!一个显而易见的问题,当delete接口时只是

2013-03-28 11:29:23 2265

原创 代码编写准则

1,禁用复制:对于超过一行的代码或者超过3个词的代码语句,坚决不用复制,除非代码内容完全一样。如果代码块大,又完全一样,可考虑包装成一个函数。复制的危害非常大,由于复制后还要进行局部的修改,很容易失误漏掉,导致bug隐藏很深。2,凡事要考虑扩展性:对于有可能扩展的地方,如果可能性达到50%,就要考虑扩展。考虑扩展后,比如增加了一个参数,每一处使用都应该用到此参数,而不应该使用默认参数。3,

2013-03-19 09:11:36 880

原创 C++对象内存分布

1,没有父类,没有虚函数。完全和结构体内存分布相同,顺序按照各个成员的声明顺序,需要考虑内存对齐(PS:不同编译器的对齐策略部相同,所以一个dll中声明的对象在外面未必可用,因为类成员访问本质是按照偏移量访问,不同内存对齐方式会导致偏移量不同,解决方法是所有dll产生的对象的访问都应该交由dll导出的函数处理)。空间大小为各个成员的大小之和。2,没有父类,有虚函数。第一个成员为虚表地址,下面的

2013-03-18 11:35:29 1023

原创 关于goto语句的使用

在项目中用到了大量的goto语句,遭到了领导的指责,感觉挺委屈的。作为一个程序员,在很多地方都看到说要避免goto语句的使用。goto语句如洪水猛兽,其实都误解了goto。滥用goto的确很恐怖,可是合理使用却能够对程序的结构性能有很大帮助。以下简单说一下项目中用到goto的3类地方。1,多重循环嵌套。这是一个配置文件解析的例子,第一重循环读取文件一定长度的字符串,第二重循环判断读取的字符

2013-03-15 18:20:50 4129 3

原创 Zygote进程功能笔记

1,调用startVm创建Java虚拟机和Java的环境在c空间的引用。主要函数在AndroidRuntime::startVm中,首先分配Java虚拟机的堆大小,其次调用JNI_CreateJavaVM创建Java虚拟机。2,注册一些初始化所需要的JNI函数,这些函数在Java空间被声明为native的。3,通过JNI的GetStaticMethodID得到ZygoteInit的main

2013-02-25 22:45:16 1516

原创 驱动程序结构学习

可以把内核看做一个进程,其它进程对内核的系统调用就可以看做进程通信。各个驱动程序从属于内核,可以把驱动程序看做一个对象,因为同一类驱动程序只能有一个,可以用单例模式来实现。抽象驱动定义一个接口,具体硬件的驱动实现这个接口。以文件系统为例,考虑到驱动都是用C语言实现的,以下用C语言描述。1,抽象驱动中定义文件结构体(简单起见,函数的返回类型和参数都是void):保护两个函数变量(是不是很像C++

2013-02-22 19:29:31 838

原创 关于C++引用的一些分析

int a;int c;int &b=a;b =c;++b;上面的语句等于下面的语句:int a;int c;int *pb;pb =&a;pb =&c;++(*pb);可见,1,首先引用必须初始化;2,引用也占用空间,和指针一样;3,指针可以指向任意处,而引用必须指向有实际对象处,然而当此对象析构后,引用仍然会指向无效地址;4,综上,引

2013-02-22 10:03:13 836 1

原创 C++和C语言的一点区别

C++是对C语言的提升,相对C语言C++到底多了些什么?其实,任何C++能完成的功能,C语言都能完成(其它语言未必能完成,比如偏底层涉及到寄存器的,甚至C和C++都无能为力,需要汇编),从功能上来说,二者是等价的。但是一些显而易见的现象是,完成一个功能用C++需要更少的代码(用汇编则是更多的代码)。就以析构函数为例,只要定义一次,在任何地方用到,只需要声明对象,不需要调用析构函数。C语言则需要每一

2013-02-21 15:02:02 804

原创 JNI如何调用Java函数

有时候在jni层也需要调用Java层来完成一些功能,例如Java层有函数Media.JavaFunc(Media)。JNI如何才能根据函数名找到对Java函数的引用呢?首先需要找到函数所属的类,可以通过jc=env->FindClass("Medir")找到。其次根据上面的类的引用和函数名已经函数签名就可以找到函数,func=env->GetMethonID(jc,"JavaFunc","

2013-02-19 22:48:53 2082

原创 JNI与DLL

android开发中大量用到了jni,都是用动态链接库的形式来调用本地的c语言编写的函数,由于c语言和c++可以很容易打通,所以Java就可以方便的调用C++的代码。下面比较一下jni和windows中的dll的异同。1:Java中通过System.loadLibrary("a")来加载c语言开发的模块;windows中也是通过LoadLibrary("module")来得到dll的模块,不过

2013-02-19 22:29:22 2570

原创 进程间通信模式

首先说一下单进程多线程设计。考虑一个消息队列的例子,线程1发送消息到消息队列,线程2从消息队列里面取数据。因为是单进程,两个线程可以引用同一个对象,所谓同一个对象是指两个对象的物理内存地址相同(不是虚拟内存,思维如果局限于虚拟内存会看不到跨进程和单进程的共同点)。再说一下跨进程。进程1发送消息到消息队列,进程2从消息队列里面取消息。因为是跨进程,两个进程有各自的虚拟内存,所以不能引用同一个消息

2013-02-03 14:44:46 858

原创 跨进程程序设计的模式

首先说一下单进程多线程设计。考虑一个消息队列的例子,线程1发送消息到消息队列,线程2从消息队列里面取数据。因为是单进程,两个线程可以引用同一个对象,所谓同一个对象是指两个对象的物理内存地址相同(不是虚拟内存,思维如果局限于虚拟内存会看不到跨进程和单进程的共同点)。再说一下跨进程。进程1发送消息到消息队列,进程2从消息队列里面取消息。因为是跨进程,两个进程有各自的虚拟内存,所以不能引用同一个消息

2013-02-03 14:44:02 1493

原创 服务器设计和客户端设计的感悟

服务器程序设计自然都是采用CS模式,而客户端程序设计也可以采用cs模式。考虑一个音频播放功能,Server负责混音各个Client的数据并控制声卡。各个Client和Server属于不同的进程。可采用以下几个模式:1,Server单开一个进程,不断的select,并对Client处理;2,Server对每一个Client开启一个线程,每一个线程处理对应Client的数据;3,Serve

2013-02-02 22:01:52 942

原创 Looper工作方式相关类分析

首先考虑一个播放器录音的设计。播放器录音是指,有一个第三方的播放器进程播放音乐,我们通过某种方式比如修改播放器的二进制代码,截获音频数据,然后把这些数据发往另一个我们自己开发的进程,在这个进程里面对接受的数据做处理。这涉及到两个进程。一个怎么设计我们的进程程序。首先需要一个类,专门负责和播放器进程通信;其次需要一个录音线程,不断循环读取这个类的音频数据;第三需要一个回调函数注册到线程里面,线程调用

2013-02-02 21:33:19 710

原创 对象和函数

以一个播放器Player为例子,他可能有以下几个函数接口:1,open;2,close;3,start;4,stop;5,write其实根本用不了这么多函数,只需要一个函数也能完成功能,这个函数可以这样定义SendMsg(void* param),只有一个参数,param作为一块内存,一次存放的数据是消息类型(表示是open还是close等)、数据的长度、真实的数据。SendMsg根据不同

2013-02-02 21:19:55 654

原创 进程间通信方式比较

1,管道:根植于文件系统,管道一端读,一端写,只可以在父子进程间共享。父子进程有同一个文件标号(内核中file数组的下标),但是指向的file结构是不同的(file结构和具体的进程相关)。而file结构又指向一个dentry结构,这个dentry结构是同一个,dentry结构又指向一个inode结构(以上都是在内核中)。父进程发送消息,系统从用户态转到内核态,内核调用inode结构中的函数操作指针

2012-12-29 21:04:36 2787

原创 语音编解码的一些概念

Sampling rate:采样速率,每秒采样的次数,主要有8 kHz, 16 kHz, and 32 kHz,分别是窄带、宽带和超宽带。Bit-rate:每秒语音所占用的计算机位数,和采样速率成正比,和量化精度成正比。Quality:精度,语音编解码会失真的,Bit-rate越高,精度越高。Complexity:编码的复杂度,复杂度越高,编码效果越好,但是解码时间也越长。

2012-10-25 09:04:38 886

原创 语音编码原理

语音编码最基本的方法是对语音信号采样,直接进行模数转换。但是,如果不再进一步处理,会导致编码量很大。例如,用8kHz采样,12bit进行量化,一秒钟的语音就需要96kb。这个传输量太大,需要进行压缩。为什么可以进行压缩?因为数据(每一次采样)存在相关性。假设所有数据都相同,用两个数就可以表示这段语音,一个是每个采样的值,一个是采样的次数;假设数据构成了一条直线,即数据和时间成正比,用3个数就可

2012-10-24 10:52:58 1338

原创 关联规则学习-序列模式挖掘

在关联规则中,把一个用户的一次交易看做一个模式,而在序列模式中,药考虑用户的多次交易。可以表示为。这表示在一段时间内,用户发生了3次交易,第一次购物为A和B,第二次为A和C,第三次为D。序列的顺序很重要,序列和就不相同。可以定义序列的父子关系,如果序列s1 = 是序列s2 = 的父序列,当且仅当存在1 序列s的数量可以用所有s的父序列出现的次数表示。序列模式的挖掘同关联模式一样,都是有k-

2012-10-16 23:42:34 4247

原创 关联规则学习-笔记

第一步是要产生所有的频繁项集合,即满足一定支持度的项的集合。依次递归产生1项,2项,...,n-1项,n项。所有的k项由k-1项得到,并不需要列举所有的k项可能的组合,由于如果某k项为频繁项,则其所有的一个k个子k-1项必为频繁项。可按k-1项排序,只对相邻的两项做处理。如果相邻两项的前k-2项都相等,只有第k-1项不相等,则合并两项,得到新的k项为候选k项。如果相邻两k-1项的前k-2项不相

2012-10-16 21:07:38 1197

原创 源码安装mysql

1,进入源码所在目录:cd mysql-5.5.2-m2/2,./configure --prefix=/usr/local/mysql --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-big-tables --with-readline --with-ssl --with-

2012-10-11 00:43:21 949

原创 Solr学习总结-命令行添加索引

转到文件所在的目录,执行:java -Durl=http://localhost:8080/solr/update -Ddata=files -jar post.jar *xml

2012-10-08 10:32:18 1426

原创 社区发现

社区要满足两个条件:一是社区的成员有共同的话题和爱好;二是社区的成员之间的联系相比和社区外的联系要紧密。通过用户的搜索情况可以找到有相同爱好的人,这些人组成候选社区成员。比如用户搜索“NBA”,这个用户就是候选的NBA社区成员。通过一定的算法计算这些成员间的紧密程度,大于一定阀值的成员共同组成了NBA社区。算法有HITS,类似于搜索引擎的链接分析,每个人都有一个H值和A值,迭代计算。也可以

2012-09-29 11:26:34 2649

原创 搜索引擎的发展-管中窥豹

1,第一个阶段是雅虎早期的方式——人工目录。完全通过人工来标记网页,这在互联网不太发达的时候还行得通。优点是精确,缺点是无法处理海量内容。2,第二个阶段是后来google的方式,机器算法分词建索引排序。优点是可以处理海量的网页,缺点是对自然语言理解有一个极限,导致精确性不会太高,最终会达到瓶颈。3,第三个社会化搜索,由网络上的用户做标记。用户虽然不如专家标注的精确,但是要好于机器算法。缺点

2012-09-29 10:31:21 498

原创 链接分析笔记

PageRank:基于随机游走模型,有两个假设:入链越多,则页面越重要;入链页面越重要,则权重越高。对于页面组成的闭环,容易产生链接陷阱,可以采用远程跳转的方法,即页面以一定概率赋予非出链页面。HITS 算法:分为Hub页面和Authority页面,有两个假设:好的Authority页面会被很到好的Hub页面指向;好的Hub页面会指向很到好的Authority页面。HITS算法都是在接到用户查

2012-09-28 14:46:18 514

原创 分类的特征选择

一篇文档中有很多个词,也就有很多个特征。特征太多会造成计算量大,并且有些特征还是噪音。特征选择一般按照信息增益依次选择。信息增益按照条件熵计算。假设不选择这个特征,熵是s1,选择后熵为s2,s1-s2即为条件熵。首先选择最大的信息增益的特征,再在最大信息增益特征的基础上选择次大的。这种方法很不错,但是也很难处理异或问题,比如特征t1的信息增益为0,特征t2的信息增益为0,但是t1和t2的联

2012-09-28 11:43:49 660

原创 分类的数据模型

1,生成模型:假设数据是由某种模型生成的。对于文本分类,假设有N类数据,每一类数据的都有一个概率,每一类数据的各个词项都会有一个分布。一篇文档就是由这个数据模型生成的。生成过程如下:首先随机选择一个类别,由于是随机选择,大类被选中的可能性更大;其次在这个类别中一个个随机选择词语,由于各个类别的词项分布不同,生成的文档的词项分布更接近于生成文档的模型。可以计算文档与各个模型的余弦相似度,得分最大的模

2012-09-28 11:04:17 1762

原创 过拟合

过拟合的根本原因是信息太少。信息可以从两方面得到。一是先验的假设。假设线性可分和假设n次多项式可分相比,前者假设了我们拥有了更多的信息。二是样本。一般来说,样本越多提供的信息越多。不过如果样本并不是随机抽取的,则样本多也不能代表信息多。比如分类中可以找多个特殊的点,这些点是最优分类器分错的点,用这些点来分类,效果会出奇的差。因为我们得到的全部是负信息。这里的负信息和前面的正信息(先验假

2012-09-27 16:25:25 790

原创 Solr学习总结-问题处理

检查索引:java -ea:org.apache.lucene... org.apache.lucene.index.CheckIndex  /usr/share/solr/data/index修复索引:java –cp /solr/lucene/lucene-core-3.1-SNAPSHOT.jar -ea:org.apache.lucene... org.apache.lucene.in

2012-09-27 14:35:09 2459

原创 Solr学习总结-附加功能

找到与查询结果相似的文档:http://localhost:8983/solr/select?q=name:edition&mlt=true&mlt.fl=name&mlt.mintf=1&mlt.mindf=1mlt.fl:按照结果文档的哪一个field求相似。mlt.mintf:结果文档中的本field的某一个词出现的tf大于此值,才以此词求相似。mlt.mindf

2012-09-27 10:50:36 6642

原创 Solr学习总结-自己开发Solr

选择json返回格式,默认是xml:http://localhost:8983/solr/select?q=*:*&rows=1&wt=json自定义request handler:需要apache-solr-solrj-3.1.jar, apache-solr-core-3.1.jar, and lucene-core-3.1.jar继承StandardRequestHand

2012-09-26 22:45:57 4647

DirectX_9 3D游戏程序设计入门 (中文版)

竟然是word版本,质量就不用说了。 中文的,不用谷歌翻译了。 学习DirectX的好入门书。

2011-09-15

3D游戏编程大师技巧

3D游戏编程大师技巧,pdf,中文版,翻译的不错。 对想从事3D编程的来说必看。 不多说了,经典的书

2011-09-15

设计模式 高清pdf中文

设计模式,很经典的哟,中文版,每一章都分开了。 大家都懂的,好书,不多说了

2011-09-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除