- 博客(108)
- 资源 (6)
- 收藏
- 关注
原创 Window多线程同步之(互斥锁)
简述互斥锁是用在多线程间对操作同一资源进行互斥的。一个线程占用了一个资源,那么别的线程就操作此资源,直到这个线程该释放互斥锁,其他的线程才开始可以重新抢夺这个互斥锁,成功获得互斥锁的线程利用这个资源,其他线程再次阻塞,周而复始。如对全局变量的访问,线程加锁后对变量进行读写操作,完成后释放互斥锁。比如多个线程对一个全局变量进行累加并打印。源码//共享资源static int num
2017-12-22 14:41:45
7101
1
转载 向量的几何意义及编程应用(6)
转载自:http://blog.csdn.net/popy007/article/details/3769523-D空间中的基变换与坐标变换一、空间坐标系的基和基矩阵在3-D空间中,我们用空间坐标系来规范物体的位置,空间坐标系由3个相互垂直的坐标轴组成,我们就把它们作为我们观察3-D空间的基础,空间中物体的位置可以通过它们来衡量。当我们把这3个坐标轴上单位长度的向量记为3个
2017-12-22 13:33:32
2048
转载 向量的几何意义及编程应用(5)
转载自:http://blog.csdn.net/popy007/article/details/376948物体的旋转欢迎回来这里!此次我们要讨论向量的旋转问题,包括平面绕点旋转和空间绕轴旋转两部分。对于游戏程序员来说,有了向量的旋转,就代表有了操纵游戏中物体旋转的钥匙,而不论它是一个平面精灵还是一组空间的网格体亦或是我们放在3-D世界某一点的相机。我们仍需借助向量来完成我们此次
2017-12-22 13:31:04
524
转载 推导相机变换矩阵
一些网友写信给我希望能够了解固定流水线中世界空间到相机空间变换矩阵的具体推导过程。其实之前我在《向量几何在游戏编程中的使用6》中已经简单的把相机变换作为一个使用基理论的例子进行了说明,但可能仍然不够具体。这篇文章中,我会尽力阐述相机变换的整个来龙去脉。希望能够对正在学习固定流水线的朋友们有所帮助。这里我们仍然会在推导相机变换之前介绍几个理论知识,目的是为了更好的理解推导过程。我们马上开始!什么
2017-12-22 10:00:07
448
转载 深入探索透视投影变换(续)
在上一篇文章中我们讨论了透视投影变换的原理,分析了OpenGL所使用的透视投影矩阵的生成方法。正如我们所说,不同的图形API因为左右手坐标系、行向量列向量矩阵以及变换范围等等的不同导致了矩阵的差异,可以有几十个不同的透视投影矩阵,但它们的原理大同小异。这次我们准备讨论一下Direct3D(以下简称D3D)以及J2ME平台上的JSR184(M3G)(以下简称M3G)的透视投影矩阵,主要出于以下几个目
2017-12-22 09:52:52
363
转载 深入探索透视投影变换
透视投影是3D固定流水线的重要组成部分,是将相机空间中的点从视锥体(frustum)变换到规则观察体(Canonical View Volume)中,待裁剪完毕后进行透视除法的行为。在算法中它是通过透视矩阵乘法和透视除法两步完成的。 透视投影变换是令很多刚刚进入3D图形领域的开发人员感到迷惑乃至神秘的一个图形技术。其中的理解困难在于步骤繁琐,对一些基础知识过分依赖,一旦对它们中的任何地方感
2017-12-22 09:46:44
355
原创 初识Window多线程
简述 Window多线程开发是一种常见的解决程序并行的手段,开启线程本身非常简单,只需调用一个系统API就可以了。然而这样的线程是无序,混乱。因此在实际开发中必须对线程的行为进行管控,这就是线程的同步问题了,这是多线程开发中的重点。
2017-12-22 09:01:35
317
原创 OpenGL编译着色器程序
编译着色器程序由于着色器是在GPU中执行,因此想要使用写好的着色器,必须使用特定的编译器来解析数据,编译代码,生成可执行程序。在OpenGL调用相关的API就可以实现。流程如下: 相关API如下GLuint glCreateShader(GLenum type)功 能:创建着色器对象返回值:一个非0整数,如果是0则说明发送了错误参 数:顶点着色器
2017-12-12 18:41:11
1864
原创 OpenGL缓存及片元的测试和操作
基本颜色理论OpenGL支持的大多数显示设备都会使用一种组合三原色的方法来构成颜色值,三原色就是红色,绿色和蓝色。我们将其称为RGB颜色空间,并且使用这三个颜色值来表达每一种颜色,通常还会在增加第四个alpha分量(透明度),因此也可以称为RGBA颜色空间。在计算机中每个分量的值都是使用一定数量的位来保存。在RGB颜色空间中红色,绿色和蓝色分量都占用了8个比特位,因此得到一个24位的颜色缓
2017-12-12 18:18:48
991
原创 OPenGL--GLSL基础
着色器与OpenGL现代OpenGL渲染管线严重依赖着色器来处理出入的数据,如果不使用着色器,那么OpenGL可以处理的事情可能只有清除窗口了,可见着色器对OpenGL的重要性。在3.0版本(含3.0)以前,如果用到了兼容模式环境,OpenGL还包含一个固定渲染管线,可以在不使用着色器的情况下处理几何与像素数据。自从3.1版本开始,固定渲染管线从核心模式中去除,因此必须使用着色器来完成工作。
2017-12-11 18:37:06
3126
原创 观察者模式(C++)
简述 观察者定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发送改变时会通知所有观察者对象,使他们能够自动更新自己适用场景 当一个对象的改变需要同时改变其他对象的时候使用,一对多的关系。 当一个对象模型有两方面,其中一方面以来另一方面,这时观察者模式可以将这两者封装在独立的对象中使他们各自独立的改变和复用
2017-11-26 14:19:09
416
原创 原型模式(C++)
概述 原型模式,用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象,原型模式其实就是从一个对象再创建另一个可定制的对象,而且不需要指定任何创建过程使用场景 一个类初始化数据较多,创建过程繁琐使,可以用已经创建好的对象拷贝一份想要获取一个对象的状态时,使用原型模式创建一个新对象,新对象的修改不会影响已有的对象类初始化需要消耗的资源
2017-11-26 14:02:36
409
原创 OpenGL图形渲染管线图解
一,概述当前OpenGL的版本为3.3,基于可渲染管线,实现模型生成,渲染,图像输出等工作。可渲染管线就是把三维顶点进过一系列加工编程二维的离散的像素点。并且用户可以在特定着色阶段自由配置(如在顶点着色和片段着色阶段,这也是和固定流水线最大的不同)。可渲染管线简要流程如下图所示。二,详细流程上图所示基本上是正确的,但不太直观,一个三维顶点怎么变换成像素的呢?我把它分为两大步
2017-11-24 19:19:58
8377
1
原创 OpenGL环境配置(基于Qt窗口)
一,简述 OPenGL的环境配置由很多种,这儿使用的环境就是glfw和glad组合。选择Qt来作为界面库使用。二,环境版本vs2013 + Qt5.5 + OpenGL3.3三,方法 和一般的环境配置一样,也需要一个三维绘图窗口和一个用于管理函数指针的库,在Qt中对应的就是两个类QOpenGLWidget和QOpenGLFunctions,只需要继承他们就可以了。cla...
2017-11-24 18:25:59
5433
3
原创 适配器模式(C++)
简述适配器模式可以将一个类的接口转化为客户希望的接口,使原本不兼容不能一起工作的类可以一起工作它可以分为类适配器模式和对象适配器模式。想使用一个已经存在的类,但如果它的接口实现的功能正是我们想要的但是调用方式不同,也就是使用它的方法和你的要求不相同时,就应该考虑用适配器模式,在适配器内部进行处理。场景说明出国旅游时,国外的景点简介都是英文的,如果不会英文就看不懂,这时候就需要一个翻
2017-10-31 19:28:15
372
原创 职责链模式(C++)
简述职责链模式,使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿者这条链传递请求,直到请求被处理UML类图对象职责Manager:抽象管理者ManagerLeader:组长,处理少于2天的请假请求ManagerProject:项目经理,处理2到7天的请假请求ManagerBoss:老总处理大于7天的由
2017-10-31 19:10:35
347
原创 单例模式(C++)
简述单例模式,顾名思义,指在一个人程序中这个类只能有一个实例对象,并提供一个访问它的全局点,通常可以让全局变量可以对一个对象访问,当多次访问全局变量时,也只是得到仅有的一个对象的引用。Windows任务管理器和回收站都是非常典型的单例模式。类单例化1,一个基本的类是这样的,它可以实例化无数个对象,如何对他单例化呢?class singleton{public: singl
2017-10-31 18:54:04
406
原创 合成复用原则(C++)
概念尽量使用合成/聚合的方式,而不是使用继承。简述当想给一个类增加新的功能,有三种方法,第一种就是直接修改代码,第二种是通过继承方式,第三种是通过组合方式,那么这三种孰优孰劣哪?该选择哪种哪?场景一:比如当前有个类A,成员函数Func1(),现在想要增加个新功能Func2()。可以直接修改代码UML类图修改前:
2017-09-24 12:19:24
1468
原创 命令模式(C++)
简述 命令模式能比较容易的设计一个命令队列,在需要的情况下可以将命令计入日志,接收请求的一方可以否决请求。而且加进新的具体命令类不影响其他的类,因此可以比较容易的增加新的具体的命令类。场景说明 相信大家都去过饭店吧。去了之后,首先叫服务员过来点菜,有炒饭,烧茄子,烤鱼等等(我最喜欢吃的),服务员会记录下菜名,然后交到厨房,厨师做饭。应该没有人会直接跑到后厨让厨师做饭吧,
2017-09-23 20:15:43
1011
原创 工厂模式(C++)
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现类,选择判断的问题在客户端,想要增加功能,修改客户端。而简单工厂是在内部进行逻辑判断。现在有苹果和梨两种水果,而水果的生产流程复杂,所以需要水果工厂来生成。现开一个苹果工厂和梨工厂,各自生成自己的水果,当用户需要水果时,直接向工厂提出生产就可以了。不必和每个水果打交道
2017-09-23 19:39:06
916
转载 osg示例解析之osgcamera
转载自:http://blog.csdn.net/csxiaoshui/article/details/51517203简介osgcamera这个示例向我们展示了在osg中如何使用多个相机和多个视口的方法,例子中提供了多窗口多相机以及窗口多相机的方式。具体解析首先本例中使用了一个名为ModelHandler的事件处理类,这个类的作用比较简单,就是用来让我们切换场景中
2017-09-12 11:04:08
2268
转载 虚数的意义
转载自:http://www.ruanyifeng.com/blog/2012/09/imaginary_number.html有人在Stack Exchange问了一个问题: "我一直觉得虚数(imaginary number)很难懂。 中学老师说,虚数就是-1的平方根。 可是,什么数的平方等于-1呢?计算器直接显示出错! 直到今天,我也没有搞懂。谁能解释
2017-09-12 10:59:56
365
转载 深入了解矩阵
大多数人在高中,或者大学低年级,都上过一门课《线性代数》。这门课其实是教矩阵。刚学的时候,还蛮简单的,矩阵加法就是相同位置的数字加一下。矩阵减法也类似。矩阵乘以一个常数,就是所有位置都乘以这个数。但是,等到矩阵乘以矩阵的时候,一切就不一样了。这个结果是怎么算出来的?教科书告诉你,计算规则是,第一个矩阵第一行的每个数字(2和1),各自乘以第二个矩阵第一列对应位
2017-09-12 10:56:02
359
原创 xml快速入门(tinyxml解析)
简述xml是一种可扩展标记语言,用于传输和存储数据。语法1.xml必须有根节点 <root> <child>child</child> </root>2xml节点必须有始有终(有关闭标签) <radius>1</radius>3 xml标签对大小写敏感 <grayscal...
2017-09-11 22:21:18
1972
1
原创 json快速入门(cjson解析)
简述json是存储和交换文本信息的语法,与xml类似。Json有两种结构,分别是数组和对象json解析环境cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器,cJSON库包括cJSON.h和cJSON.c两个文件,放入指定目录直接调用就可以了。语法1. 有一对基本的 { }2. 内部都是键值对格式。key 值为字符串 "key"3...
2017-09-11 21:45:26
2697
转载 c语言中关于时间的函数
本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时、时间的获取、时间的计算和显示格式等方面进行了阐述。本文还通过大量的实例向你展示了time.h头文件中声明的各种函数和数据结构的详细使用方法。关键字:UTC(世界标准时间),Calendar Time(日历时间),epoch(时间点),clock tick(时钟计时单元) 1.概念 在C/C++
2017-09-05 21:22:36
486
原创 依赖倒转原则(C++)
概念 高层模块不应依赖低层模块,低层模块也不应依赖高层模块,两个都应该依赖抽象层。抽象不应该依赖细节,细节应该依赖抽象。简述 依赖倒置原则是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。面向过程的开发,上层调用下层,上层依赖于下层,当下层剧烈变动时上层也要跟着变动,这就会导致模块的复用性降
2017-09-03 17:32:29
2902
原创 Windows文件操作(删除过时文件)
概述 程序在运行时会生成很多临时文件(如日志文件),这些文件隔断时间就会被删除。需要用到一些文件操作函数和时间获取函数 windows系统API: 打开文件 FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData); 获取文件句柄 FindFirstFileA(L
2017-09-03 00:06:52
1497
转载 Windows C++ 常用的时间类型和函数
转载自:http://blog.csdn.net/xiaobai1593/article/details/7492811方案—:使用C标准库优点:提供跨平台性;缺点:只能精确到秒级; C运行库关于时间的主要函数介绍:所需头文件:#include 1. time()函数功能:获取当前的系统时间函数原型:time_t time( time_t
2017-09-02 23:45:54
3159
原创 开闭原则(C++)
概念 就一个类而言,应该仅有一个引起它变化的原因。每个类实现一个功能。简述 单一职责原则可以看作是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。职责过多,可能引起它变化的原因就越多,这将导致职责依赖,相互之间就产生影响,从而极大的损伤其内聚性和耦合度。单一职责,通常意味着单一的功能,因此不要为类实现过多的功能点,以保证
2017-09-02 22:24:25
2799
原创 单一职责原则(C++)
概念 就一个类而言,应该仅有一个引起它变化的原因。每个类实现一个功能。简述 单一职责原则可以看作是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。职责过多,可能引起它变化的原因就越多,这将导致职责依赖,相互之间就产生影响,从而极大的损伤其内聚性和耦合度。单一职责,通常意味着单一的功能,因此不要为类实现过多的功能点,以保证实
2017-08-31 21:06:19
1393
原创 UML类图快速入门
简述 画UML类图是学习设计模式的基础技能之一,今天用StarUML工具制作一个类图。流程 1,双击运行StarUML,选择Empty Project图标,点击确定,创建一个空项目 2,右击Untitled- >add- > Model,点击Model创建一空个模型test 结果:
2017-08-13 21:03:28
848
转载 从Script到Code Blocks、Code Behind到MVC、MVP、MVVM
转载自:http://www.cnblogs.com/indream/p/3602348.html 我们就按照大致的历史进程将这些概念进行划分:ScriptCode Blocks、Code BehindMVC、MVP、MVVM 我们知道的是现实的历史发生顺序并不如上,因为思想都是相似的,比如MVC很早很早就出现了,解释型语言至今基本上也有很多分支而且在互联网时代大行其
2017-08-05 11:59:39
660
转载 Qt的QString字符串操作
转载:http://devbean.blog.51cto.com/448512/275360 Qstring是很常用的一个数据结构,甚至在很多语言中,比如JavaScript,都是把string作为一种同int等一样的基本数据结构来实现的。每一个GUI程序都需要string,这些string可以用在界面上的提示语,也可以用作一般的数据结构。C++语言提供了两种字符串的实现:C风格的
2017-08-02 21:44:54
2425
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅