mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +08:00
[cocos2d-objc] Closes #442, loading sprites concurrently may crash in spSkeletonData_readSkeletonDataFile and spAtlas_createFromFile due to the underlying Cocos2D-ObjC implementations of spUtils_readFile and _spAtlasPage_createTexture not being thread safe
This commit is contained in:
parent
ffafd67873
commit
1d73c3e220
@ -39,6 +39,7 @@
|
|||||||
bool _debugSlots;
|
bool _debugSlots;
|
||||||
bool _debugBones;
|
bool _debugBones;
|
||||||
bool _premultipliedAlpha;
|
bool _premultipliedAlpha;
|
||||||
|
bool _skipVisibilityCheck;
|
||||||
ccBlendFunc _blendFunc;
|
ccBlendFunc _blendFunc;
|
||||||
CCDrawNode* _drawNode;
|
CCDrawNode* _drawNode;
|
||||||
bool _ownsSkeletonData;
|
bool _ownsSkeletonData;
|
||||||
@ -85,6 +86,7 @@
|
|||||||
@property (nonatomic, readonly) spSkeleton* skeleton;
|
@property (nonatomic, readonly) spSkeleton* skeleton;
|
||||||
@property (nonatomic) bool debugSlots;
|
@property (nonatomic) bool debugSlots;
|
||||||
@property (nonatomic) bool debugBones;
|
@property (nonatomic) bool debugBones;
|
||||||
|
@property (nonatomic) bool skipVisibilityCheck;
|
||||||
@property (nonatomic) spBone* rootBone;
|
@property (nonatomic) spBone* rootBone;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -99,7 +99,11 @@ static const unsigned short quadTriangles[6] = {0, 1, 2, 2, 3, 0};
|
|||||||
|
|
||||||
spSkeletonJson* json = spSkeletonJson_create(atlas);
|
spSkeletonJson* json = spSkeletonJson_create(atlas);
|
||||||
json->scale = scale;
|
json->scale = scale;
|
||||||
spSkeletonData* skeletonData = spSkeletonJson_readSkeletonDataFile(json, [skeletonDataFile UTF8String]);
|
spSkeletonData* skeletonData = nil;
|
||||||
|
|
||||||
|
@synchronized(self.class) {
|
||||||
|
spSkeletonJson_readSkeletonDataFile(json, [skeletonDataFile UTF8String]);
|
||||||
|
}
|
||||||
NSAssert(skeletonData, ([NSString stringWithFormat:@"Error reading skeleton data file: %@\nError: %s", skeletonDataFile, json->error]));
|
NSAssert(skeletonData, ([NSString stringWithFormat:@"Error reading skeleton data file: %@\nError: %s", skeletonDataFile, json->error]));
|
||||||
spSkeletonJson_dispose(json);
|
spSkeletonJson_dispose(json);
|
||||||
if (!skeletonData) return 0;
|
if (!skeletonData) return 0;
|
||||||
@ -113,13 +117,19 @@ static const unsigned short quadTriangles[6] = {0, 1, 2, 2, 3, 0};
|
|||||||
self = [super init];
|
self = [super init];
|
||||||
if (!self) return nil;
|
if (!self) return nil;
|
||||||
|
|
||||||
_atlas = spAtlas_createFromFile([atlasFile UTF8String], 0);
|
@synchronized(self.class) {
|
||||||
|
_atlas = spAtlas_createFromFile([atlasFile UTF8String], 0);
|
||||||
|
}
|
||||||
NSAssert(_atlas, ([NSString stringWithFormat:@"Error reading atlas file: %@", atlasFile]));
|
NSAssert(_atlas, ([NSString stringWithFormat:@"Error reading atlas file: %@", atlasFile]));
|
||||||
if (!_atlas) return 0;
|
if (!_atlas) return 0;
|
||||||
|
|
||||||
spSkeletonJson* json = spSkeletonJson_create(_atlas);
|
spSkeletonJson* json = spSkeletonJson_create(_atlas);
|
||||||
json->scale = scale;
|
json->scale = scale;
|
||||||
spSkeletonData* skeletonData = spSkeletonJson_readSkeletonDataFile(json, [skeletonDataFile UTF8String]);
|
spSkeletonData* skeletonData;
|
||||||
|
|
||||||
|
@synchronized(self.class) {
|
||||||
|
skeletonData = spSkeletonJson_readSkeletonDataFile(json, [skeletonDataFile UTF8String]);
|
||||||
|
}
|
||||||
NSAssert(skeletonData, ([NSString stringWithFormat:@"Error reading skeleton data file: %@\nError: %s", skeletonDataFile, json->error]));
|
NSAssert(skeletonData, ([NSString stringWithFormat:@"Error reading skeleton data file: %@\nError: %s", skeletonDataFile, json->error]));
|
||||||
spSkeletonJson_dispose(json);
|
spSkeletonJson_dispose(json);
|
||||||
if (!skeletonData) return 0;
|
if (!skeletonData) return 0;
|
||||||
@ -217,7 +227,7 @@ static const unsigned short quadTriangles[6] = {0, 1, 2, 2, 3, 0};
|
|||||||
CGSize size = texture.contentSize;
|
CGSize size = texture.contentSize;
|
||||||
GLKVector2 center = GLKVector2Make(size.width / 2.0, size.height / 2.0);
|
GLKVector2 center = GLKVector2Make(size.width / 2.0, size.height / 2.0);
|
||||||
GLKVector2 extents = GLKVector2Make(size.width / 2.0, size.height / 2.0);
|
GLKVector2 extents = GLKVector2Make(size.width / 2.0, size.height / 2.0);
|
||||||
if (CCRenderCheckVisbility(transform, center, extents)) {
|
if (_skipVisibilityCheck || CCRenderCheckVisbility(transform, center, extents)) {
|
||||||
CCRenderBuffer buffer = [renderer enqueueTriangles:(trianglesCount / 3) andVertexes:verticesCount withState:self.renderState globalSortOrder:0];
|
CCRenderBuffer buffer = [renderer enqueueTriangles:(trianglesCount / 3) andVertexes:verticesCount withState:self.renderState globalSortOrder:0];
|
||||||
for (int i = 0; i * 2 < verticesCount; ++i) {
|
for (int i = 0; i * 2 < verticesCount; ++i) {
|
||||||
CCVertex vertex;
|
CCVertex vertex;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user