自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(261)
  • 论坛 (5)
  • 收藏
  • 关注

转载 cocos2dx Jni调用需要线程切换 ui线程和GL线程

cocos2d-x for Android 运行在多线程环境下,所以在 Lua/C++ 和 Java 交互时需要注意选择适当的线程。cocos2d-x 在 Android 上以两个线程来运行,分别是负责图像渲染的 GL 线程和负责 Android 系统用户界面的 UI 线程。在 cocos2d-x 启动后,Lua/C++代码将由 GL 线程调用,因此从 Lua/C++中调用的 Java 方...

2018-07-21 16:34:48 2188

原创 LUA table.sort(array,compFun)快速排序 比较函数书写规范

local function comp(a, b) return a<bend比较函数表示a<b的返回结果,类似小于号的运算符重载。返回false的时候,a,b才会替换位置1:a==b时候,要返回true 这个大家应该都知道2:comp(a,b)==true的时候,要确保comp(b,a)==false,否则会报错。这么说可能不太明白。快排比较过程中, a和b做比较结果:comp(a,b)返回true时候,如果后面b和a做比较:comp(b,a)也返回tru...

2020-10-09 18:49:21 112

原创 广度优先搜索(BFS)与深度优先搜索(DFS)

一般来说,能用DFS解决的问题,都能用BFS。DFS由于其易于编写(递归),易于理解的特点被广泛使用,而且像比如floodfill这种算法来说,DFS的常数时间开销会较少。所以对于一些能用DFS就能轻松解决的,为何要用BFS?杀鸡焉用牛刀?多数情况下运行BFS所需的内存会大于DFS需要的内存(DFS一次访问一条路,BFS一次访问多条路),DFS容易爆栈(栈不易"控制"),BFS通过控制队列可以很好解决"爆队列"风险。至于具体取舍,要看具体应用环境,由于搜索顺序不同,即使用相同的剪枝也会导致在不同时

2020-08-13 20:12:43 82

转载 Cocos2d-x 游戏性能瓶颈

优化 Cocos2d-x 游戏性能Table of ContentsGolden rules 查找游戏性能瓶颈,然后优化瓶颈 总是使用工具来查找性能瓶颈,而不是靠猜 查找 GPU 性能瓶颈的工具 查找 CPU 性能瓶颈的工具 熟悉你的移动设备和你使用的游戏引擎 记住"足够好"原则 Common Bottlenecks CPU 瓶颈通常跟 Draw call 数量和你的游戏循环的复杂度相关 GPU 瓶颈通常局限于 Fillrate(Overdraw) .

2020-08-13 17:51:18 75

原创 cocos2dx中常见设计模式

1、单例设计模式:导演类2、观察者模式: 被观察者(EventDispatcher)含有一个数组(std::vector<EventListener*>),里边存放了所有观察者(EventListener监听者)的引用,在被观察者的状态发生改变的时候,通过调用观察者的函数来通知观察者(dispatchEventToListeners),实现了信息的传递。 事件监听器:就是采用了观察者模式,当一个事件被触发的时候,所有监听它的对象都将收到通知3、工厂模式create...

2020-08-13 17:43:55 108

转载 C++ const 和 #define 区别

1、const  (1)C++对 const 常量的处理过程:当编译器碰到常量声明时,在符号表中放入常量,编译时发现使用常量,则直接以符号表中的值替换。  (2)如果,编译中发现,对 const 使用 extern 或者 & 操作符时,则会给对应变量分配新的存储空间。  符号表保存的内容:  key value             a   10  在程序运行时,符号表是不变的。 (3)const 是在编译器编译期间,分配内存。...

2020-08-13 14:53:26 39

原创 在OpenGL顶点着色器中,w是什么,为什么除以w?(In OpenGL vertex shaders, what is w, and why do I divide by it?)

顶点数据经过mvp变换下一步先要divide by w用来标准化设备坐标:标准化设备坐标是一个x、y和z值在-1.0到1.0的一小段空间。任何落在范围外的坐标都会被丢弃/裁剪,不会显示在你的屏幕上。与通常的屏幕坐标不同,y轴正方向为向上,(0, 0)坐标是这个图像的中心,而不是左上角。最终你希望所有(变换过的)坐标都在这个坐标空间中,否则它们就不可见了。顶点着色器代码:void main(void){ vec4 clipCoord = glModelViewProjectionmat..

2020-08-10 12:48:59 244

原创 学习笔记(17):3D图形理论-固定渲染管线实现

课程实现一套软3D,即不依赖任何第三方API(OpenGL,D3D,GDI)等。 课程从建立建立颜色缓冲区,绘制点,绘制线,绘制面,绘制图片,建立纹理,作图形的旋转,图像的混合,建立三维坐标系,实现模型矩阵,投影矩阵,观察矩阵,深度缓冲区等三维核心功能,实现基本的OpenGL核心绘制功能,让开发者从底层,全面的认识3D,为优化,开发出更好的游戏奠定基础。...

2020-08-10 12:01:13 64

转载 C++堆和栈区别

C++中,内存分为5个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区。通常存放局部变量、函数参数等。堆:是由new分配的内存块,由程序员释放(编译器不管),一般一个new与一个delete对应,一个new[]与一个delete[]对应。如果程序员没有释放掉,资源将由操作系统在程序结束后自动回收。自由存储区:是由malloc等分配的内存块,和堆十分相似,用free来释放。全局/静态存储区:全局变量和静态变量被分配到同一块内存中(在C

2020-06-01 20:51:40 94

原创 cocos2dx 自动裁剪

自动裁剪在draw函数内执行,由renderer->checkVisibility(transform, _contentSize)实现,判断该渲染指令是否被裁减掉,如果裁剪掉不显示,就不会把该渲染指令加入到渲染队列。void Sprite::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags){#if CC_USE_CULLING // Don't do calculate the culling

2020-05-31 16:19:18 153

转载 1. 转换构造函数 2. explicit关键字 3. 类型转换函数

1. 转换构造函数类的构造函数可以定义不同类型的参数,当参数满足下列条件时,就可称其为转换构造函数。函数仅有一个参数 参数是基本类型或者其他类类型其中,有一种特殊情形,也可构成转换构造函数。函数有多个参数,但除了第一个参数外,其余都是默认参数 第一个参数是基本类型或者其他类类型 函数调用时只使用一个参数C++编译器在进行编译工作时,会尽力尝试让源码通过编译,因此如果碰到了这样的代码Test t = 100,编译器不会立即报错,而是进行以下尝试:查找类中是否有定义转换构造函数 如果

2020-05-30 23:58:43 100

原创 C++函数传值和传引用

如果参数类型是自定义类型推荐使用传引用而不是传值,因为传值的时候会调用构造和析构,还会拷贝一份实参的副本,造成一些开销。还有一个原因是传值在传派生类对象的时候,如果函数的参数是基类类型。会造成对象切割问题,对象切割不会触发多态。C++底层对引用的实现,实际是用指针实现出来的,对于C++内置类型,比如int、char这些,传值往往比传引用更高效一些。同样适用的还有stl的迭代器和函数对象,这些设计时候被设计为传值。c++对象切割的情况:1.当把一个派生类对象赋给一个基类对象时,会发生对...

2020-05-30 23:41:21 228

原创 学习笔记(15):OpenGL-压缩纹理

课程涵盖了OpenGL开发的方方面面,对开发中经常用到的开发知识点进行讲解,从实战的角度进行编码设计.第1章-环境建立第2章-基础图元第3章-三维世界第4章-纹理多彩世界第5章-显存的分配-优化第6章-场景控制第7章-光照-真实世界第8章-模型第9章-UI制作第10章-场景编辑器制作第11章-地形第12章-脚本引入-lua...

2020-05-30 22:31:42 107

原创 学习笔记(14):OpenGL-坐标系,观察矩阵,投影矩阵基本原理

课程涵盖了OpenGL开发的方方面面,对开发中经常用到的开发知识点进行讲解,从实战的角度进行编码设计.第1章-环境建立第2章-基础图元第3章-三维世界第4章-纹理多彩世界第5章-显存的分配-优化第6章-场景控制第7章-光照-真实世界第8章-模型第9章-UI制作第10章-场景编辑器制作第11章-地形第12章-脚本引入-lua...

2020-05-29 23:24:38 131

原创 学习笔记(13):OpenGL基础教程-视口矩阵的理解

市面上的OpenGL教程不够系统,知识比较零碎,有的太难,有的又太简单,本课程从一线编程实践经验出发,0基础学习OpenGL底层知识, 讲解重要常用的知识点和整个框架体系,便于学员掌握,并且提供了大量的实际代码案例,便于学习。...

2020-05-28 23:30:20 79

原创 学习笔记(12):3D图形理论-投影和观察矩阵

课程实现一套软3D,即不依赖任何第三方API(OpenGL,D3D,GDI)等。 课程从建立建立颜色缓冲区,绘制点,绘制线,绘制面,绘制图片,建立纹理,作图形的旋转,图像的混合,建立三维坐标系,实现模型矩阵,投影矩阵,观察矩阵,深度缓冲区等三维核心功能,实现基本的OpenGL核心绘制功能,让开发者从底层,全面的认识3D,为优化,开发出更好的游戏奠定基础。...

2020-05-28 22:57:27 175

原创 .static 和const分别怎么用,类里面static和const可以同时修饰成员函数吗。

static的作用:对变量:1.局部变量:在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。1)内存中的位置:静态存储区2)初始化:局部的静态变量只能被初始化一次,且C中不可以用变量对其初始化,而C++可以用变量对其初始化。(详见:http://www.cnblogs.com/novice-dxx/p/7094690.html)3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。注:当static用来修饰局...

2020-05-26 22:47:07 190

原创 C++ 四个智能指针shared_ptr, weak_ptr,  unique_ptr, auto_ptr

C++中的四个智能指针shared_ptr, weak_ptr, unique_ptr, auto_ptr 其中前面三个是C++11支持并且最后一个已经被C++11抛弃。智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄露。使用智能指针可以很大程度上的避免这个问题。因为智能指针就是一个类,当超出了类的作用域时,类会自动调用析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间。不需要手动释放内存空间。1). auto_ptr.

2020-05-26 22:30:52 56

原创 学习笔记(11):OpenGL基础教程-重新实现常用的OpenGL函数

市面上的OpenGL教程不够系统,知识比较零碎,有的太难,有的又太简单,本课程从一线编程实践经验出发,0基础学习OpenGL底层知识, 讲解重要常用的知识点和整个框架体系,便于学员掌握,并且提供了大量的实际代码案例,便于学习。...

2020-05-25 21:49:18 44

原创 cocos 中每个节点的visit与draw函数

visit函数内会先调用自己的draw函数,然后变量所有子节点递归调用字节的visit:cocos渲染流程是从Director类的主循环mainLoop中开始:1.调用drawScene()://精简后的代码,方便理解void Director::drawScene(){ /*此处省略一些代码 ..... */ _renderer->clear(); pushMatrix(MATRIX_STACK_TYPE::MATRIX_ST..

2020-05-24 22:15:00 403

原创 C# 中 String 跟 string 的区别

C# 中 String 跟 string 的区别string 是 C# 中的类,String 是 .net Framework 的类(在 C# IDE 中不会显示蓝色) C# string 映射为 .net Framework 的String 如果用 string, 编译器会把它编译成 String,所以如果直接用 String 就可以让编译器少做一点点工作。如果使用 C#,建议使用 st...

2020-05-22 17:45:50 47

原创 那些函数不能定义为虚函数

经检验下面的几个函数都不能定义为虚函数:1)友元函数,它不是类的成员函数2)全局函数3)静态成员函数,它没有this指针4)构造函数,拷贝构造函数,赋值运算符重载可以(但是一般不建议作为虚函数)...

2020-05-20 14:02:09 137

转载 C++ 之 多态

静态多态是编译器在编译期间完成的,编译器会根据实参类型来选择调用合适的函数,如果有合适的函数可以调用就调,函数重载就是一个简单的静态多态动态多态:它是在程序运行时根据基类的引用(指针)指向的对象来确定自己具体该调用哪一个类的虚函数。即: 在程序执行期间(非编译期)判断所引用对象的实际类型,根据其实际类型调用相应的方法。动态多态的条件:●基类中必须包含虚函数,并且派生类中一定要对基类中的虚函数进行重写。●通过基类对象的指针或者引用调用虚函数。重写:(a)基类中将被重写的函数必...

2020-05-20 13:01:30 48

原创 向量、坐标和坐标系之间的关系:

市面上的OpenGL教程不够系统,知识比较零碎,有的太难,有的又太简单,本课程从一线编程实践经验出发,0基础学习OpenGL底层知识, 讲解重要常用的知识点和整个框架体系,便于学员掌握,并且提供了大量的实际代码案例,便于学习。...

2020-05-03 21:03:03 2154

原创 学习笔记(09):OpenGL基础教程-动画的实现原理

市面上的OpenGL教程不够系统,知识比较零碎,有的太难,有的又太简单,本课程从一线编程实践经验出发,0基础学习OpenGL底层知识, 讲解重要常用的知识点和整个框架体系,便于学员掌握,并且提供了大量的实际代码案例,便于学习。...

2020-05-03 20:13:33 231

原创 cocos中的JNI调用

1.C++层调用Java:使用jni文件夹下面JniHelper类的getStaticMethodInfo、getMethodInfo获取java层的函数。(具体实现函数实现可知)2.java层调用C++层:java层声明native函数,这个函数由Jni(C++)层实现,java层是如何通过native函数找到C++层的函数的?需要把C++这些函数要注册到jni中,jni方法注册...

2020-05-03 17:28:59 94

原创 cocos游戏客户端优化方案

1.纹理碎图资源进行图集合并,尽量少空白,图集大小尽可能限制在1024*1024以下,同一个逻辑界面使用一张图,减少同一时间无用纹理的加载。2.指定合理的资源释放策略,保证纹理能够在不频繁重复加载的情况下,及时释放纹理资源。比如每隔2分钟释放掉所有没被引用的资源缓存、内存达到一定峰值也释放一次。3.图片纹理资源尽量采用RGBA_4444、RGB565等占用内存较小的纹理格式,还可以对...

2020-05-03 01:03:01 209

转载 python字符串拼接的7种方式

1、来自C语言的%方式 1 2 print('%s %s' % ('Hello', 'world')) >>> Hello world %号格式化字符串的方式继承自古老的C语言,这在很多编程语言都有类似的实现。上例的%s是一个占位符,它仅代表一段字符串,并不是拼接的实际内容。实际的拼接内容在一个单独的%号后面,放在一个元...

2020-05-02 22:43:15 196

原创 学习笔记(07):OpenGL基础教程-纹理

市面上的OpenGL教程不够系统,知识比较零碎,有的太难,有的又太简单,本课程从一线编程实践经验出发,0基础学习OpenGL底层知识, 讲解重要常用的知识点和整个框架体系,便于学员掌握,并且提供了大量的实际代码案例,便于学习。...

2020-05-01 23:14:55 117

原创 Lua函数的尾调用

所谓尾调用,就是一个函数返回另一个函数的返回值:function f()…return g()end因为调用g()后,f()中不再执行任何代码,所以不需要保留f()的调用桟信息;Lua做了这样的优化,称为"尾调用消除",g()返回后,控制点直接返回到调用f()的地方。这种优化对尾递归非常有益,通常递归意味着调用桟的不断增长,甚至可能造成堆栈溢出;而尾递归提供了优化条件,编译器可...

2020-04-27 18:22:59 112 1

原创 cocos合批绘制

Cocos中,对于使用相同贴图且没有自定义uniform变量且采用默认绘制指令TrianglesCommand或QuaCommand的节点可以进行自动合批绘制合批绘制的本质是将两个模型动态合并为一个模型,并使用相同的材质在一个DrawCall中进行绘制,以减少DrawCall数量,提高运行效率。Cocos判断两个uniform是否能够合批,靠的是通过GLProgram、TextureID和...

2020-04-27 14:04:00 814

转载 GPU: 渲染管线流程简化版

GPU:渲染管线(道)流程:顶点着色器 - 光栅化 - 片段着色器 - alpha测试 - 模板测试 - 深度测试 - blend - Gbuffer - frontBufffer - frame Brffer - 显示器流程步骤详细分析:顶点着色器:1. 计算顶点的颜色。2. 将物体坐标系 转换到 相机坐标系。光栅化:将顶点 转换成 像素。比如由4个顶...

2020-04-27 11:51:47 108

原创 Cocos2d-x 渲染器Renderer

渲染队列RenderQueueRenderQueue遍历场景时会生成渲染命令,生成的渲染命令存储在渲染队列中。渲染队列RenderQueue会将命令分层5类存储,分别是:class RenderQueue {public: /** RenderCommand will be divided into Queue Groups. 渲染队列RenderQueue把渲染命令...

2020-04-26 23:36:14 123

原创 学习笔记(06):OpenGL基础教程-光照的调试技巧

市面上的OpenGL教程不够系统,知识比较零碎,有的太难,有的又太简单,本课程从一线编程实践经验出发,0基础学习OpenGL底层知识, 讲解重要常用的知识点和整个框架体系,便于学员掌握,并且提供了大量的实际代码案例,便于学习。...

2020-03-28 18:04:33 69

原创 图片Alpha预乘的作用

为什么要有预乘透明度呢因为Alpha-Blending,所谓Alpha-Blending,其实就是按照“Alpha”混合向量的值来混合源像素和目标像素,一般用来处理半透明效果。混合公式:最终图像 = 第一张图的RGB*第一张图的的alpha通道+第二张图的RGB*(1-第一张图的的alpha通道)透明度叠加原理(先不管是哪种叠加方式 或者alpha叠加 或者加减色叠加)是需要将alph...

2020-03-25 17:35:31 845

原创 学习笔记(05):OpenGL基础教程-VBO和显示列表绘制图形

市面上的OpenGL教程不够系统,知识比较零碎,有的太难,有的又太简单,本课程从一线编程实践经验出发,0基础学习OpenGL底层知识, 讲解重要常用的知识点和整个框架体系,便于学员掌握,并且提供了大量的实际代码案例,便于学习。...

2020-03-22 21:42:00 168

原创 学习笔记(03):OpenGL基础教程-OpenGl环境的搭建

市面上的OpenGL教程不够系统,知识比较零碎,有的太难,有的又太简单,本课程从一线编程实践经验出发,0基础学习OpenGL底层知识, 讲解重要常用的知识点和整个框架体系,便于学员掌握,并且提供了大量的实际代码案例,便于学习。...

2020-03-15 18:50:37 56

原创 OpenGL API 之glGen*形式、glBind*形式、和glBufferData()的理解

先举例来说:void glGenVertexArrays(GLsizei n,GLuint *arrays);返回n个未使用的对象名到数组arrays中,用作顶点数组对象。返回的名字可以用来分配更多缓存对象,并且它们已经使用未初始化的 顶点数组集合的默认状态 进行了数值初始化。很多OpenGL命令都是glGen*的形式,它们负责分配不同类型的OpenGL对象的名称。这里的名称类似C语言中的一个...

2019-10-22 12:23:22 382

原创 OpenGL中的4x4矩阵的意义2

opengl中的4x4方阵是列优先排序:第4列表示坐标系原点变换后的x、y和z值。这16个值表示了空间中的一个特定位置,以及相对于视觉坐标系(固定不变的绝对坐标系)的3个轴的方向。这个16个值也可以表示为相对于视觉坐标系的一个局部坐标系,最后一列表示该坐标系位移后的坐标,也就是相对于视觉坐标系的位置和方向这4列每一列是一个4个元素的向量。前三列的三个向量只是方向向量,他们表示空...

2019-10-14 21:30:28 640 1

原创 openGL中的4x4矩阵的意义

2019-10-14 20:48:44 997

空空如也

空空如也

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

TA关注的人 TA的粉丝

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