cocos2dx shader 插值(cocos2dx android切换后台为什么要重建纹理)

本文目录
- cocos2dx android切换后台为什么要重建纹理
- cocos2d转unity3d小结
- cocos2d-x 怎么给精灵Sprite描边
- 哪里有纹理贴图立方体cocos2dx手机游戏源码
- 色相 怎样实现纹理颜色变化 cocos2dx
- 怎么在cocos2dx的基础上学习opengl,shader
cocos2dx android切换后台为什么要重建纹理
android系统下,切入后台,则纹理全部失效,从后台切到前台,cocos2d-x会重新加载纹理。这样有两个问题:
1、如果纹理较多的话,加载纹理会卡很长时间,就像死机一样。 变通解决方法是修改引擎代码,增加一个进度条提示。
2、文字描边等用到RenderTexture的地方会出现异常纹理,文字会花掉。 暂时不知道原因,无解。
这里提供一个解决方案,解决掉纹理失效的问题,初步测试没有发现大的问题,但是具体还要看实际运行情况,毕竟android机器太多了。
1、Cocos2dXGLSurfaceView.java代码修改
view plain copy- @Override
- public void onPause() {
- this.queueEvent(new Runnable() {
- @Override
- public void run() {
- Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleOnPause();
- }
- });
- // super.onPause();
- }
2、main.cpp中修改
view plain copy- void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv* env, jobject thiz, jint w, jint h)
- {
- InitCrashReport();
- if (!CCDirector::sharedDirector()-》getOpenGLView())
- {
- CCEGLView *view = CCEGLView::sharedOpenGLView();
- view-》setFrameSize(w, h);
- AppDelegate *pAppDelegate = new AppDelegate();
- CCApplication::sharedApplication()-》run();
- }
- // else
- // {
- // ccDrawInit();
- // ccGLInvalidateStateCache();
- // CCShaderCache::sharedShaderCache()-》reloadDefaultShaders();
- // CCTextureCache::reloadAllTextures();
- // CCNotificationCenter::sharedNotificationCenter()-》postNotification(EVNET_COME_TO_FOREGROUND, NULL);
- // CCDirector::sharedDirector()-》setGLDefaultValues();
- // }
- }
cocos2d转unity3d小结
unity3d第一个项目已经算是完成了,从cocos引擎转过来也有一段时间了,下面列出一些在使用中遇到的坑或者unity3d与cocos2d差异比较大的地方。适合其他引擎转U3D或者纯新手小白,万一有路过的大神请 踩了我这朵野花 指出错误,好好学习天天向上。游戏主要是2D界面,搭配live2d伪3D效果。 我也想做纯3D的可是没有钱啊。
一 .版本以及部分插件工具
(1).unity_5.3.5p6
(2).UGUI
(3).DoTween
(4).SceneManager
(5).live2d
(6). playerMaker;Anti-Cheat (都已弃用)
二.经验总结
(1).分辨率适配
1.使用UGUI Canvas Render Mode :Screen space-Camera 绑定摄像机,摄像机采用正交 Orthographic Canvas Scaler:UI Scale Mode 采用 Scale With Screen Size ; Reference Resolution 使用640*960分辨率, Screen Match Mode:expand.
2.部分背景设为1136*1136 在iphone5,6上依然会有白边,目前解决方案是背景设为1138*1138。
3.建议美术CG与背景出图大小为,1024*1024(不重要的背景可512*512通过拉伸显示)。
(2).资源相关及优化
1.图片尽量使用尺寸为2的次幂 32*32,64*64 到 2048*2048,format 采用 compressed 压缩,个别尺寸不好做处理资源又大,可以采用16bit,采用这一方法美术需少使用渐变色,否则图片会严重色块化。
2. 图片也可直接导入PSD(相当于图集),texture Type 使用Sprite(2D and UI); SpriteMode 使用Multiple, 然后使用 Sprite Editor自动切割,适用某个界面一堆小图。缺点是每次替换PSD需重新切割,改动有可能会使之前自动切割的被重新命名。
3.图片参数需把Generate Mip Maps 选项勾掉,可减少一定大小,这个选项的功能是在3D游戏中视野远近影响物体模糊。
4.字体可使用ttf,不需要美术单一出atlas, text控件也支持富文本、描边、阴影等。
5.plist不再可用,策划需提供TEXT文本或JSON等。
6.音频文件支持.AIFF .WAV .MP3 .OGG 。
视屏文件支持.MOV .MPG .MPEG .MP4 .AVI .ASF。
7.修改stripping level,通过库剖离来减少DLL的空间大小。
(3).UGUI、脚本、其他控件相关
1.一个场景尽量使用一个canvas,需显示不同层级可使用多个摄像机,不同摄像机culling mask不同layer,通过修改摄像机Depth来控制层级关系。
2. live2d比较特殊,如果需要将其他控件置于它的上面,除了用单一摄像机照射外,还需改变Live2d的Z轴与它摄像机Clipping Planes的Far参数。
3.需要做屏蔽层,只需创建一个panel 即可,改变它的层级即可屏蔽下方的点击与触摸。
4.如果在一个button上添加image等其他控件,其他控件的范围大小也会影响到按钮的点击区域。
5.支持帧动画,只需全部选中图片拖入Hierarchy即可生成。
6.U3D粒子系统不支持particle Designer等粒子生成插件,但源生的功能更强,可实现预加热功能。
7.动画建议使用自带的animator控件,也可以使用ITween,DoTween,HotTween等一些插件来实现简单的位移变形等。
8.如果使用tween类插件,建议使用DoTween,更加类似cocos写法,性能优化等比较好,(NGUI自带itween)。
9.注意所有的tween类插件均不支持image sprite单个透明度的变化,只能修改材质透明度,而所有的UGUI image控件共用同一材质,除非每个image单独添加材质。也可通过单独手写脚本来控制透明度变化,需要在update里计算,比较繁琐。
10.脚本中一般使用的update有 Update 与FixedUpdate等,update 跟当前帧数相关,fixedUpdate则是物理时间,所以一些物理逻辑要放入FixedUpdate进行。
11.想在场景切换后还保持某个GameObject存在使用方法 DontDestroyOnLoad(transform.gameObject);
12.把一些模型投影到ui上可以用RenderTexture,也可用这个创建小地图、镜相、动态阴影等效果。注意rendertexture消耗比较大。
13.unity 5.0后增加了AudioMixer混音器,可以把所有audioSource输出放入同一音轨,通过这个实现全局音乐开关和音效开关。
14.游戏暂停可使用 Time.timeScale = 0。
15.使用u3d自带animator动画,动画结束后可添加回调、动画可倒播。通过状态机可完成比较复杂的动画模块,特定情况下的动画需要与脚本同时控制。
16.3D物理碰撞同样使用于2D,GameObjecr上需添加刚体控件。
17.粒子贴图与cocos相似,尺寸大小最好小于64*64。
(4)多语言
1.简体版与繁体版,通过修改text所挂的ttf来实现,文字尽量在unity里输入,减少贴图上文字的数量,这样只需改变ttf即可实现简体繁体的切换。
2.英文版等共存,unity内需要输入的文字全部写在text里,需要写脚本通过key value来读取每个text显示的内容。
3.一些界面图片上的文字不好通过UNTIY输入来替换的(比如IAP礼包等界面),可创建多个不同的prefab,进入场景时候通过区分
语言环境来调用。
(5)与IOS Android 交互
1.多语言 通过Application.systemLanguage区分当前设备语言环境。注意:ios9以后Unity通过Application.systemLanguage返回的简体中文和繁体中文都是SystemLanguage.Chinese,所以需要在ios 上返回当前语言参数给unity。
2.ios上显示插屏等会应为Unity 的rootViewController时长改变而造成奔溃或者不显示,需要在调用第三方SDK弹出时候添加
UnityAppController *appController = (UnityAppController *).delegate;
3.Andoird 需要在点击购买后弹出屏蔽层,否则点击过快或造成传入的参数改变。提供去除屏蔽的回调,java层在购买和失败后调用。
4.iap与兑换码最好写成单例,某些Android渠道要求在一开始调用IAP回调,回复购买只在IOS与google版本中显示,需留好接口在不同渠道中开启或关闭。
5.unity使用ARC,ios某些广告低版本SDK未使用,需要在这些广告类中单独添加参数 -fobjc-arc。
三.遗留问题
1.shader等使用不熟练。
2.过场采用sceneManager插件,用GUI实现,如使用UGUI animator如何实现。
3.所有按钮点击放大等效果公用一个animator,再触摸屏幕其他区域有可能会使其他按钮响应放大效果。
4.Android下手机如果有系统提示或来电,在进入游戏内游戏声音丢失,需重启游戏。
5.scorllview背包等因为包含物品数量较少没有使用动态池。
cocos2d-x 怎么给精灵Sprite描边
USING_NS_CC;
//手动写一个方法试试 , 颜色层方法 , Cocos2dx版本3.10
//精灵着色器(sp为需要描边的对象《可重载为其他类型》,color描边颜色,width描边的宽度)
void shaderSprite(Sprite* sp, Color4B color, float width)
{
//上边
auto up = LayerColor::create(color, sp-》getContentSize().width + 2 * width, width);
up-》setPosition(Vec2(-width,sp-》getContentSize().height));
//下边
auto down = LayerColor::create(color, sp-》getContentSize().width + 2 * width, width);
down-》setPosition(Vec2(-width,-width));
//右边
auto right = LayerColor::create(color, width, sp-》getContentSize().height);
right-》setPosition(Vec2(sp-》getContentSize().width,0));
//左边
auto left = LayerColor::create(color, width, sp-》getContentSize().height);
left-》setPosition(Vec2(- width,0));
//加载到sp上
sp-》addChild(up);
sp-》addChild(down);
sp-》addChild(right);
sp-》addChild(left);
}
.ccp用法
auto sprite=Sprite::create("image.png");
sprite-》setPosition(Vec2(200,200));
ShaderSprite(sprite,Color4B(255,255,255,200),5);
哪里有纹理贴图立方体cocos2dx手机游戏源码
当我们把一张图片加载到内存里面之后,它是不能直接银陪被GPU绘制出来的,纹理贴图过程如下:
首先,我们为之前的顶点添加纹理坐标属性并传到vertex shader里面去;
然后,把内存里面的纹理传给GPU;
最后,在fragment shader里面通过采样器,就可以根据vertex shader传递过来的纹理坐标把纹理上面的颜色值用插值的方式映纤搏清射到每一个像毁前素上去58player.com/code-2956-1.html。
色相 怎样实现纹理颜色变化 cocos2dx
如果你要改变色相的话,你可以去官方论坛找一个CCSpriteWithHue,别人改写的继承自Sprite的一个类 ,通过setHue(),来改变色相。
如果你要改变颜色的话 直接对精灵setColor(Color3B(xx,xx,xx)); 如果效果不满意也可以自己写shader。其实上面那个改变颜色的方便就是在顶点着色器设置了一个u_color;在片元着色器中间与结果简单相乘得到的,应为仅仅这样得到的效果往往差强人意,推荐使用CCSpriteWithHue。
怎么在cocos2dx的基础上学习opengl,shader
说说我的经验吧。
一、cocos2d-x 部分
1.1 技术选型
从第三个手游开始,我实在被Adobe的ANE和国内的小平台折腾得没了脾气,决定转到cocos2d-x。在选择哪种语言绑定的时候纠结了很久,最后力排众议选了 lua:Cocos2dx+lua合适还是Cocos2dx+js合适? cocos2d-x 2.x 的lua绑定做得并不好,于是我选择了 quick-cocos2d-x (后来,quick被触控收购)。
1.2 学习 C++
C++ Primer 中文版(第 5 版) (豆瓣) 是不错的入门书籍,建议看第五版,我写过一篇 C++Primer 第4版和第5版比较 。学习期间建议画一些思维导图帮助理解和整理思路。例如这个(不完整):
1.3 学习DEMO和熟悉开发平台
编译 cocos2d-x 自带的 TestCPP 项目,全部跑一遍。熟悉 cocos2d-x API 的用法。记得用doxygen 生成文档,建议每个API的功能都浏览一遍。
有的同学可能更喜欢直接看源码,那当然更好。不过文档有一个好处就是能更直观地显示继承关系。
学习DEMO的过程中,你必须熟悉自己开发平台的IDE,例如Windows上必须熟悉 Visual Studio,而OS X上必须熟悉xcode,Linux平台上就熟悉Eclipse+CDT吧。
注意,quick-cocos2d-x 是不支持Linux开发平台的。
2014-05-17更新:quick已经使用QT重写了player部分,但依然不支持Liunx平台。
1.4 了解引擎的文件夹结构
基于 cocos2d-x 源码生成的文档并不怎么详细,许多功能必须看源码。但这个阶段,我不建议纠结源码太深,倒是可以纠结一下 cocos2d-x 的文件夹结构,看看各个类放在什么地方,找一找常见的哪些宏和常量以及枚举定义在什么地方,这花不了多少时间,但能让你对cocos2d-x有更深刻的了解,同时给你很强的成就感。这种成就感冲淡了你面对大量源码时候的无力感,让你能够继续前行。
1.5 重复上面的第3步:再次学习DEMO
这时候看DEMO可能会轻松不少,但是你会有更多的问题去纠结。例如多分辨率支持?例如坐标系统?例如绘图功能?例如层级管理系统?例如事件传递系统?等等等等……这时候可以去Google(注意不要用百毒和其他搜索引擎)找文档看了。
1.5 重复上面的第3步:再次学习DEMO
这时候看DEMO可能会轻松不少,但是你会有更多的问题去纠结。例如多分辨率支持?例如坐标系统?例如绘图功能?例如层级管理系统?例如事件传递系统?等等等等……这时候可以去Google(注意不要用百毒和其他搜索引擎)找文档看了。

更多文章:
跷二郎腿太低好吗?想要通过贴墙站改正二郎腿影响的话,有哪些要点需要注意
2026年10月11日 05:10
易语言点击js按钮(易语言网页填表怎样点击链接为“javascript:void(0)“的按钮)
2026年10月11日 03:00
compare with造句(用compared with和compared to造句)
2026年10月10日 23:30
tensorflow与keras对应版本(为什么tensorflow2.8没有keras)
2026年10月10日 22:10
maven仓库jar网站(如何在maven仓库中添加jar包)
2026年10月10日 19:50





