Cocos2dx retain(这个程序用了模板,但是我不懂其中的参数,是什么意思呐,还有d=new T*[n];语句是什么意思)

2024-06-20 19:20:02 :28

cocos2dx retain(这个程序用了模板,但是我不懂其中的参数,是什么意思呐,还有d=new T*[n];语句是什么意思)

这篇文章给大家聊聊关于cocos2dx retain,以及这个程序用了模板,但是我不懂其中的参数,是什么意思呐,还有d=new T*[n];语句是什么意思对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

本文目录

这个程序用了模板,但是我不懂其中的参数,是什么意思呐,还有d=new T*[n];语句是什么意思

为了在Mac OS X中安装运行MacPort端口,系统必须要已经安装苹果的“Command Line Developer Tools”(命令行开发者工具)。Xcode 4及以后版本的用户首先需要通过启动或运行Xcode接受Xcode EULA。xcodebuild -license下载安装MacPort注意:如果是Homebrew用户,应该先卸载Homebrew。因为Homebrew不兼容MacPort。同时执行MacPort的“selfupdate”命令以确保安装最新的发布版本。sudo port -v selfupdate当更新完成之后,使用MacPort在命令行中安装python依赖(dependencies)sudo port install python27 py27-yaml py27-cheetah你会看到如下所示:下载llvm-3.3,解压至$HOME/bin目录。如果没有bin目录,请创建一个bin目录,将未解压的ZIP压缩包重命名为“clang+llvm-3.3”。最后目录如下所示:/Users/guanghui/bin/clang+llvm-3.3(guanhui是本机的主目录名字)样本代码绑定生成器资源库中包括一个样本测试用例。打开bindings-generator/test/simple_test文件夹。配置根据自己的环境个性化设置“test/userconf.ini”和“test/user.cfg”文件。注意:应该移除后缀为“.sample”的文件如“user.cfg.sample”和“userconf.ini.sample”androidndkdir=/Users/iven/Dev/android-ndk-r8cclangllvmdir=/Users/iven/Dev/clang+llvm-3.1-x86_64-apple-darwin11cxxgeneratordir=/Users/iven/Dev/bindings-generator-masteruser.cfg配置如下所示PYTHON_BIN=/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/ python2.7运行测试样本./test.sh如果环境设置正确,你会看到如下所示:Errors in parsing headers:1. 《severity = Warning,location =《SourceLocation file None, line 0, column 0》,details = "argument unusedduring compilation: ’-nostdinc++’"》不用担心这个警告,你已完成运行,测试用例会创建一个包含3个文件的“simple_test_bindings”目录。一个绑定类的.hpp头文件一个实现绑定类的.cpp文件一个介绍如何(从Java脚本)调用C++类暴露方法的.js文件。运行测试Create a JS base Cocos2d-x project. 创建基于JS的Cocos2d-x项目将“simple_Test folder”文件夹和“simple_test_binding”文件夹添加到项目中修改“autogentestbindings.cpp”中的注册函数如下:void register_all_autogentestbindings(JSContext* cx, JSObject* obj) {jsval nsval;JSObject *ns;JS_GetProperty(cx, obj, "ts",&nsval);if (nsval == JSVAL_VOID) {ns = JS_NewObject(cx, NULL, NULL, NULL);nsval = OBJECT_TO_JSVAL(ns);JS_SetProperty(cx, obj, "ts",&nsval);} else {JS_ValueToObject(cx,nsval, &ns);}obj = ns;js_register_autogentestbindings_SimpleNativeClass(cx, obj);}注意:如果你将“ts”添加到“test.ini”文件中的“target_namespace”变量里,便会自动生成代码。无需修改。target_namespace =ts在“AppDelegate”中注册包含头文件“autogentestbindings.hpp”然后注册回调函数:sc-》addRegisterCallback(register_all_autogentestbindings);在“hello.js”文件适当地方增加以下代码。本机将“init f”函数放在第一个场景。var myClass=new ts.SimpleNativeClass();var myStr=myClass.returnsACString();var label = cc.LabelTTF.create(myStr, "Helvetica", 20.0);限制绑定生成器存在以下两个限制自变量数字参数无法工作,所以需要手动编写包装器代表类无法工作,所以需要手动绑定,详见下一部分。手动 JSB 绑定本指南将介绍利用Cocos2d-x 2.14模板如何在自己的项目中实现JSB绑定。首先用Cocos2d-js模板创建项目。其次,我们会介绍如何一步一步从JS调用本地函数。最后你便会学会如何从本地代码调用JS代码了。现在让我们开始!本机使用的Mac OS X作为开发环境。步骤1. 用Cocos2dx-js模板创建新项目,同时新建一个即将绑定至JS的C++类。将项目命名为“JSBinding”然后点击“Next”、“ Create”新建一个类然后实现这个类,等会再将其绑定至JS。按“command+N”新建一个C++类并命名为“JSBinding”,路径为“OS X\C and C++\C++ Class”。将以下代码添加到“JSBinding.h”文件中。#include "cocos2d.h"#include "ScriptingCore.h"// Define a namespace to manage your code and make your code clearlynamespace JSB {class JSBinding: public cocos2d::CCObject{public:static cocos2d::CCScene* scene();virtual bool init();CREATE_FUNC(JSBinding);void functionTest();};}现在实现JSBinding.cpp中的类。如下所示:bool JSB::JSBinding::init(){bool bRef = false;do{cocos2d::CCLog("JSB init...");bRef = true;} while (0);return bRef;}void JSB::JSBinding::functionTest(){cocos2d::CCLog("Function test...");}步骤2. 将C++代码绑定至Java脚本代码按“command+N”新建C++类,然后命名“JSB_AUTO”路径“OS X\C and C++\C++ Class”。往“JSB_AUTO.h”文件中增加一些代码#include "jsapi.h"#include "jsfriendapi.h"#include "ScriptingCore.h"#include "JSBinding.h"void register_all(JSContext* cx, JSObject* obj);然后注意“JSB_AUTO.cpp”的实现。#include "jsapi.h"#include "jsfriendapi.h"#include "ScriptingCore.h"#include "JSBinding.h"void register_all(JSContext* cx, JSObject* obj);然后注意“JSB_AUTO.cpp”的实现。#include "cocos2d.h"#include "cocos2d_specifics.hpp"// Binding specific object by defining JSClassJSClass* jsb_class;JSObject* jsb_prototype;// This function is mapping the function “functionTest” in “JSBinding.cpp”JSBool js_functionTest(JSContext* cx, uint32_t argc, jsval* vp){JSBool ok = JS_TRUE;JSObject* obj = NULL;JSB::JSBinding* cobj = NULL;obj = JS_THIS_OBJECT(cx, vp);js_proxy_t* proxy = jsb_get_js_proxy(obj);cobj = (JSB::JSBinding* )(proxy ? proxy-》ptr : NULL);JSB_PRECONDITION2(cobj, cx, JS_FALSE, "Invalid Native Object");if (argc == 0) {cobj-》functionTest();JS_SET_RVAL(cx, vp, JSVAL_VOID);return ok;}JS_ReportError(cx, "Wrong number of arguments");return JS_FALSE;}JSBool js_constructor(JSContext* cx, uint32_t argc, jsval* vp){cocos2d::CCLog("JS Constructor...");if (argc == 0) {JSB::JSBinding* cobj = new JSB::JSBinding();cocos2d::CCObject* ccobj = dynamic_cast《cocos2d::CCObject*》(cobj);if (ccobj) {ccobj-》autorelease();}TypeTest《JSB::JSBinding》 t;js_type_class_t* typeClass;uint32_t typeId = t.s_id();HASH_FIND_INT(_js_global_type_ht, &typeId, typeClass);assert(typeClass);JSObject* obj = JS_NewObject(cx, typeClass-》jsclass, typeClass-》proto, typeClass-》parentProto);JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj));js_proxy_t* p = jsb_new_proxy(cobj, obj);JS_AddNamedObjectRoot(cx, &p-》obj, "JSB::JSBinding");return JS_TRUE;}JS_ReportError(cx, "Wrong number of arguments: %d, was expecting: %d", argc, 0);return JS_FALSE;}// This function is mapping the function “create” when using JavaScript codeJSBool js_create(JSContext* cx, uint32_t argc, jsval* vp){cocos2d::CCLog("js is creating...");if (argc == 0) {JSB::JSBinding* ret = JSB::JSBinding::create();jsval jsret;do{if (ret) {js_proxy_t* proxy = js_get_or_create_proxy《JSB::JSBinding》(cx, ret);jsret = OBJECT_TO_JSVAL(proxy-》obj);}else{jsret = JSVAL_NULL;}} while(0);JS_SET_RVAL(cx, vp, jsret);return JS_FALSE;}JS_ReportError(cx, "Wrong number of arguments");return JS_FALSE;}void js_finalize(JSFreeOp* fop, JSObject* obj){CCLOGINFO("JSBindings: finallizing JS object %p JSB", obj);}// Binding JSB typevoid js_register(JSContext* cx, JSObject* global){jsb_class = (JSClass *)calloc(1, sizeof(JSClass));jsb_class-》name = "JSBinding";jsb_class-》addProperty = JS_PropertyStub;jsb_class-》delProperty = JS_PropertyStub;jsb_class-》getProperty = JS_PropertyStub;jsb_class-》setProperty = JS_StrictPropertyStub;jsb_class-》enumerate = JS_EnumerateStub;jsb_class-》resolve = JS_ResolveStub;jsb_class-》convert = JS_ConvertStub;jsb_class-》finalize = js_finalize;jsb_class-》flags = JSCLASS_HAS_RESERVED_SLOTS(2);static JSPropertySpec properties = {{0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER}};// Binding functionTest functionstatic JSFunctionSpec funcs = {JS_FN("functionTest", js_functionTest, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE),JS_FS_END};// Binding create() functionstatic JSFunctionSpec st_funcs = {JS_FN("create", js_create, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE),JS_FS_END};// Binding constructor function and prototypejsb_prototype = JS_InitClass(cx, global,NULL,jsb_class,js_constructor, 0,properties,funcs,NULL,st_funcs);JSBool found;JS_SetPropertyAttributes(cx, global, "JSB", JSPROP_ENUMERATE | JSPROP_READONLY, &found);TypeTest《JSB::JSBinding》 t;js_type_class_t* p;uint32_t typeId = t.s_id();HASH_FIND_INT(_js_global_type_ht, &typeId, p);if (!p) {p = (js_type_class_t* )malloc(sizeof(_js_global_type_ht));p-》type = typeId;p-》jsclass = jsb_class;p-》proto = jsb_prototype;p-》parentProto = NULL;HASH_ADD_INT(_js_global_type_ht, type, p);}}// Binding JSB namespace so in JavaScript code JSB namespce can be recognizedvoid register_all(JSContext* cx, JSObject* obj){jsval nsval;JSObject* ns;JS_GetProperty(cx, obj, "JS", &nsval);if (nsval == JSVAL_VOID) {ns = JS_NewObject(cx, NULL, NULL, NULL);nsval = OBJECT_TO_JSVAL(ns);JS_SetProperty(cx, obj, "JSB", &nsval);}else{JS_ValueToObject(cx, nsval, &ns);}obj = ns;js_register(cx, obj);}现在已经完成了大部分工作,但是我们需要在“SpiderMonkey”进行注册。打开“AppDelegate.cpp”增加以下代码ScriptingCore* sc = ScriptingCore::getInstance();sc-》addRegisterCallback(register_all); //add this line步骤3. 内存管理在register_all函数前增加两个新函数。JSBool JSB_cocos2dx_retain(JSContext* cx, uint32_t argc, jsval *vp){JSObject* thisObj = JS_THIS_OBJECT(cx, vp);if (thisObj) {js_proxy_t* proxy = jsb_get_js_proxy(thisObj);if (proxy) {((CCObject* )proxy-》ptr)-》retain();CCLog("Retain succeed!");return JS_TRUE;}}JS_ReportError(cx, "Invaild native object");return JS_FALSE;}JSBool JSB_cocos2dx_release(JSContext* cx, uint32_t argc, jsval *vp){JSObject* thisObj = JS_THIS_OBJECT(cx, vp);if (thisObj) {js_proxy_t* proxy = jsb_get_js_proxy(thisObj);if (proxy) {((CCObject* )proxy-》ptr)-》release();CCLog("Release succeed!");return JS_TRUE;}}JS_ReportError(cx, "Invaild native object");return JS_FALSE;}在register_all函数中增加以下代码:JS_DefineFunction(cx, jsb_prototype, "retain", JSB_cocos2dx_retain, 0, JSPROP_READONLY | JSPROP_PERMANENT);JS_DefineFunction(cx, jsb_prototype, "retain", JSB_cocos2dx_release, 0, JSPROP_READONLY | JSPROP_PERMANENT);步骤4. 使用C++代码回调Java脚本代码在C++代码回调Java脚本代码之前增加一些代码至“hello.js”文件。var testJSB = new JSB.JSBinding();testJSB.callback = function(i, j){log("JSB Callback" + i + j);};然后打开“JSBinding.cpp”在“functionTest”中增加一些代码。js_proxy_t* p = jsb_get_native_proxy(this);jsval retval;jsval v = {v = UINT_TO_JSVAL(32),v = UINT_TO_JSVAL(88)};ScriptingCore::getInstance()-》executeFunctionWithOwner(OBJECT_TO_JSVAL(p-》obj),"callback", 2, v, &retval);使用“executeFunctionWithOwner()”函数简化函数调用程序步骤5. 绑定测试在“hello.js”文件中增加以下代码。var testJSB = new JSB.JSBinding();testJSB.retain();testJSB.functionTest();testJSB.release();步骤6. 现在取出(check out)项目如果你的绑定程序正确无误,将会在调试窗口看到如下界面:恭喜你成功将JS绑定至本地代码!

cocos2dx 有哪些bug

先说bug触发的条件:先为一个节点设置了剪裁,但是在动画中,需要更新这个剪裁的形状,然后再以这个新的形状设置剪裁。bug代码:clip_front_-》setStencil(pfront);运行的时候,我收到了一个来自mac版本的运行抱怨,他抱怨以上代码总是崩。但是我的是以windows非库源码形式编译的,所以没有发生这个问题。收到反馈后,我把代码拷贝到带cocos2dx源码运行的项目中,果不其然。。。。(在此奉劝大家,千万不要图省事,一定要以库源码的形式编译,因为这个库很多bug。。而你也有能力修正它)我们来看setStencil的内部实现:void ClippingNode::setStencil(Node *stencil){ CC_SAFE_RETAIN(stencil);CC_SAFE_RELEASE(_stencil ); _stencil = stencil;}咋一看没什么问题,问题出来以前我也不觉得这里有啥问题。现在我对任何不加入资源管理的离散节点的release表示怀疑,因为我不懂它内部运行的机制。事实上当内部stencil正在使用的时候,简单的析构它一定会导致问题。assert还算好的,运行时崩溃才是让人崩溃的。因为你不能准确定位到问题发生的地方。于是代码修正如下:void ClippingNode::setStencil(Node *stencil){ CC_SAFE_RETAIN(stencil);Node* ptemp = _stencil;if (ptemp){ptemp-》stopAllActions();ptemp-》onExit();} _stencil = stencil;CC_SAFE_RELEASE(ptemp);}node析构中的 !running assert消失了。问题解决。运行没有发现内存泄露

cocos2dx vector怎么什么时候需要手动retain

你初始化的元素是autorelease的,如果不及时使用会被释放的。你可以在pushback的时候retain(),最后不用了 记得释放 release就好了。

简述cocos2dx里的ccnotificationcenter机制原理,有什么好处

今天看了一下cocos2dx的内存管理机制,有些地方不太好理解搞了挺长的时间,现在感觉自己理解的差不多了,赶快写下自己的思路和互联网的广大朋友分享,如果你发现有错误的地方或者不理解的地方欢迎指正!首先我们必须说一下c++中变量的内存空间的分配问题,我们在c++中写一个类,可以在栈上分配内存空间也可以使用new在堆上分配内存空间,如果类对象是在栈上分配的内存空间,这个内存空间的管理就不是我们的事了,但如果是在堆上分配的内存空间,当然需要我们来手动的delete了!cocos2dx采用的是在堆上分配内存空间,想想看你在写程序的时候对于cocos2dx中的类是不是大多数都是通过工厂方法获得的一个指针,你见过在栈上分配内存空间的情况吗?所以问题来了,既然在堆上分配内存空间,那么如何管理这个内存空间,什么时候应该释放就是个问题了!在程序中,当我们创建了一个对象的时候,这块内存空间经常是被不同的对象引用,如果删除的早了,有对象还在引用这块内存空间那么程序必然要崩溃!所以cocos2dx引入了引用计数这个内存管理机制。当我们在堆上分配一块内存空间的时候,这个对象的引用计数就是1,当有对象要引用这块内存空间的时候,这个引用计数就增加1,当有对象不再引用这块内存的时候引用计数就减1,当这个引用计数减为0的时候就使用delete删除掉这块内存,这样就做到了当有对象引用的时候会正常的访问这块内存,引用完毕也可以正常的回收。先来看一下如下的代码,有关引用计数的问题就会很清楚了!《pre class="brush:cpp; toolbar: true; auto-links: false;"》//对象创建的时候引用计数被设置为1,这个是在它的构造函数中完成的,它会先调用父类CCOjbect的构造函数 //CCObject的构造函数如下所示 //CCObject::CCObject(void) //, m_uReference(1) {}// when the object is created, the reference count of it is 1 CCSprite * sprite = new CCSprite(); CCLog("retain count:%d",sprite-》retainCount()); //调用retain方法的时候引用计数增加1 sprite-》retain(); CCLog("retain count:%d",sprite-》retainCount()); //调用release方法的时候引用计数减一,当这个引用计数减为0的时候,在release方法中会delete掉这个对象 sprite-》release(); CCLog("retain count:%d",sprite-》retainCount()); //当我们调用autorelease方法的时候会调用这段代码 //CCPoolManager::sharedPoolManager()-》addObject(this); //调用autorelease方法的时候对象会被放到自动回收池中,这个自动回收池在每帧结束的时候会调用一次对象的release方法 sprite-》autorelease(); CCLog("retain count:%d",sprite-》retainCount());《/pre》上边的代码有一处不是很好的理解,就是大家经常说的自动回收机制,也就是上边的autorelease方法,这个方法到底为我们做了什么,有什么作用,我们需要好好的搞清楚!首先需要澄清的一个概念就是帧,我们经常的说每秒多少多少帧,其实这个帧需要多少时间不是固定的,这个需要看每帧我们需要做多少事情,如果没一帧我们需要渲染很多的东西,那这一帧执行的时间当然就会很长的,游戏显得就会很卡,这个时候每秒的帧率就会下降的,所以不是时间决定的帧率,而是帧影响的时间!这个自动回收池就是在每帧结束的时候起作用的,在游戏的每一帧都会有一个大的循环,在一帧开始之前,系统建立了一个内存回收池,在这一帧的过程中,当我们调用了autorelease方法以后,我们的对象就会放到这个内存回收池中,当一帧结束的时候这个内存回收池就会释放掉,这个时候在内存回收池中的对象就会被release一下,也就是说引用计数就会减一,如果这个时候引用计数为0,就会删除对象了。如果引用计数不为0的话对象是不会被删除的,下一帧开始的时候系统又会创建一个内存回收池,这个时候在上一次添加的对象这个时候是不会重新添加到这个内存回收池中的,在这个内存回收池中的对象是你在这一帧中调用了autorelease函数的对象。好了,内存回收池我觉的我已经说清楚了。下面我们来看一下,通常我们的代码都是怎么写的,来看看这个自动回收机制怎么就做到自动回收了!

cocos2dx的问题这是什么错误,我刚学的不怎么会,求大神回答

CCAssert(m_uReference 》 0, "reference count should greater than 0");这句是个断言,在m_uReference《=0时,就会出你那个框。你这个继承于CCObject的类被release过,并且m_uReference为0了。我看不到你是如何创建和使用这个继承类的,所以只能估计一下排查方法:如果继承类是cocos自带的类,比如CCLayer,你创建时是否m_pLayer = CCLayer::create()这样把对象保存到某指针(m_pLayer)),而后又通过点击或者计时器中m_pLayer-》retain()了。你应当在m_pLayer = CCLayer::create()的下一行就执行m_pLayer-》retain()。记住有成员变量或全局变量保存了CCObject对象,那一定要马上retain()。

关于cocos2dx retain到此分享完毕,希望能帮助到您。

cocos2dx retain(这个程序用了模板,但是我不懂其中的参数,是什么意思呐,还有d=new T*[n];语句是什么意思)

本文编辑:admin
cocos2dx retain ,不
Copyright © 2022 All Rights Reserved 威海上格软件有限公司 版权所有

鲁ICP备20007704号

Thanks for visiting my site.