使用Creator一个月,各种不熟。但是使用中发现一个奇葩问题。
由于游戏中一个场景使用Camera。所以在这个场景中添加了一个Camera。但是使用iOS调试的时候发现奇葩问题。频繁切换Scene的时候。进入到有Camera的场景发现一些元素被culling掉了。花了半天看了看源码。发现一个问题。直接贴代码。
这是在CCCameraNode.cpp中的代码。我加入一个变量来修复这个问题。
CameraNode::CameraNode()
{
_mat.setIdentity();
_cameraInstance = this;
++_instanceCount;
cocos2d::log("camera Instance create");
visitingIndex = 0;
}
CameraNode::~CameraNode()
{
if (!_commands.empty())
{
for (const auto& c : _commands)
{
delete c.beforeVisitCommand;
delete c.afterVisitCommand;
}
_commands.clear();
}
// 修复camera释放错误问题
cocos2d::log("camera Instance release");
--_instanceCount;
if (_instanceCount == 0) _cameraInstance = nullptr;
}
由于在js层对象释放是延迟的。这里在C++层的Camera释放直接将instance设置成空。就会出现,在切换scene的时候,js层的Camera延迟释放,然后新创建了一个Camera,这时候,instance保存的是新的实例没错,但是等到js层的release到来的时候instance变成空。但是其实在js里面camera对象是还在的。释放老的camera导致这个全局对象没了。在render里面导致取不到camera,culling出错。
还有发现两个leak。
CCNode的_beforeVisitCallback和_afterVisitCallback被new了之后没有delete。
在CCDownloader-apple.mm中的taskDict没有在dealloc中设置成nil,在iOS的leak测试中会出现leak,这里猜测是不是那里有循环引用。由于没太多时间就没有深究。