creator2.4.10版本spine使用外部图片换装的问题(iOS原生平台)

  • Creator 版本:2.4.10

  • 目标平台: iOS / 模拟器

  • 重现方式:必现

  • 原生IOS报错: thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x8) frame #0: 0x0000000102caec68 mix_shooting-mobilespine::RegionAttachment::setUVs(this=0x0000000105cfc550, u=0, v=0, u2=1, v2=1, rotate=false) at RegionAttachment.cpp:117:13
    frame #1: 0x00000001029e43dc mix_shooting-mobilespine::SkeletonRenderer::updateRegion(this=0x000000013610d430, slotName="boby", texture=0x0000000283fefcc0) at SkeletonRenderer.cpp:1116:17 frame #2: 0x00000001028e8850 mix_shooting-mobilejs_cocos2dx_spine_SkeletonRenderer_updateRegion(s=0x000000016d648eb0) at jsb_cocos2dx_spine_auto.cpp:13428:15
    frame #3: 0x00000001028e84c0 mix_shooting-mobilejs_cocos2dx_spine_SkeletonRenderer_updateRegionRegistry(_v8args=0x000000016d649050) at jsb_cocos2dx_spine_auto.cpp:13434:1 frame #4: 0x0000000102e953c8 mix_shooting-mobilev8::internal::FunctionCallbackArguments::Call(v8::internal::CallHandlerInfo) + 568
    frame #5: 0x0000000102e9494c mix_shooting-mobilev8::internal::MaybeHandle v8::internal::Object v8::internal::(anonymous namespace)::HandleApiCallHelper<false>(v8::internal::Isolate*, v8::internal::Handle v8::internal::HeapObject , v8::internal::Handle v8::internal::HeapObject , v8::internal::Handle 8::internal::FunctionTemplateInfo , v8::internal::Handlev8::internal::Object, v8::internal::BuiltinArguments) + 596 frame #6: 0x0000000102e93fd0 mix_shooting-mobilev8::internal::Builtin_Impl_HandleApiCall(v8::internal::BuiltinArguments, v8::internal::Isolate*) + 276
    frame #7: 0x00000001036c210c mix_shooting-mobileBuiltins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_BuiltinExit + 108 frame #8: 0x000000010364f3c4 mix_shooting-mobileBuiltins_InterpreterEntryTrampoline + 228
    frame #9: 0x000000010364f3c4 mix_shooting-mobileBuiltins_InterpreterEntryTrampoline + 228 frame #10: 0x000000010364f3c4 mix_shooting-mobileBuiltins_InterpreterEntryTrampoline + 228
    frame #11: 0x0000000103647ba4 mix_shooting-mobileBuiltins_ArgumentsAdaptorTrampoline + 228 frame #12: 0x000000010364f3c4 mix_shooting-mobileBuiltins_InterpreterEntryTrampoline + 228
    frame #13: 0x000000010364f3c4 mix_shooting-mobileBuiltins_InterpreterEntryTrampoline + 228 frame #14: 0x000000010364f3c4 mix_shooting-mobileBuiltins_InterpreterEntryTrampoline + 228
    frame #15: 0x0000000103647ba4 mix_shooting-mobileBuiltins_ArgumentsAdaptorTrampoline + 228 frame #16: 0x000000010364f3c4 mix_shooting-mobileBuiltins_InterpreterEntryTrampoline + 228
    frame #17: 0x0000000103647ba4 mix_shooting-mobileBuiltins_ArgumentsAdaptorTrampoline + 228 frame #18: 0x000000010364f3c4 mix_shooting-mobileBuiltins_InterpreterEntryTrampoline + 228
    frame #19: 0x000000010364f3c4 mix_shooting-mobileBuiltins_InterpreterEntryTrampoline + 228 frame #20: 0x000000010364f3c4 mix_shooting-mobileBuiltins_InterpreterEntryTrampoline + 228
    frame #21: 0x000000010364f3c4 mix_shooting-mobileBuiltins_InterpreterEntryTrampoline + 228 frame #22: 0x000000010364f3c4 mix_shooting-mobileBuiltins_InterpreterEntryTrampoline + 228
    frame #23: 0x000000010364f3c4 mix_shooting-mobileBuiltins_InterpreterEntryTrampoline + 228 frame #24: 0x000000010364c904 mix_shooting-mobileBuiltins_JSEntryTrampoline + 164
    frame #25: 0x000000010364c5ac mix_shooting-mobileBuiltins_JSEntry + 172

  • 手机型号:Iphone13

  • 重现概率:必现

参考这个链接做的:

貌似是由于spine动画是MeshAttachment类型的引起的

2赞

你修改下mesh的模式就行了

确实如此,我这边区分了下RegionAttachment和MeshAttachment,分别做了不同处理,参考这个链接中,目前已经不会卡死,不过部分动画还有旋转问题,您这边有代码供我参考下吗?

以前我做过 但是代码不能给你 -

什么旋转问题?

建议你直接别用cocos做引到webgl就行了 cocos的spine好多bug的

我自己搞定了,我把原生平台spine引用外部图片(支持texturePacker打包的纹理集,支持纹理旋转打包)的解决方案贴在这里,方便后续有人观看。大体思路是按照这个链接,链接中存在MeshAttachment卡死的问题,参考这个链接修复了该问题,cocos本身设置骨骼隐藏/显示和插槽的隐藏/显示在原生端不生效,在我的解决方案中均有说明。具体如下:

  1. 复制引擎中cocos2d-x目录到别的地方,设置项目原生开发环境-Cocos2d-x引擎路径为自己的目录。(从官方git下载的引擎目录有各种编译问题,还是直接复制比较靠谱)

  2. 设置NDK路径为自己下载的目录(这里我用android-ndk-r19c测试没有问题)

  3. 如果是2.4.10引擎,那么可以直接使用附件中对应的文件替换,其他版本引擎手动拷贝updateRegion(换装)、setSlotVisible(插槽隐藏)、setBoneVisible(骨骼隐藏)。

  4. 进入cocos2d-x/tools/tojs目录,执行python genbindings.py,看到Generating javascript bindings succeeds.表示生成成功。

  5. 打开引擎目录Resources/builtin/jsb-adapter/engine/jsb-spine-skeleton.js,修改对应行(2.4.10可直接从附件替换)。

  6. ts代码中直接使用如下方法调用原生平台换装:
    if (CC_JSB) {
    if (!regionInfo) {
    return;
    }
    // @ts-ignore
    let jsbTex = new middleware.Texture2D();
    // const spineSkeletonData = cc.internal.SpineSkeletonData.prototype;
    // const textureIdx = spineSkeletonData.recordTexture(regionInfo.texture);
    jsbTex.setRealTextureIndex(0);
    jsbTex.setPixelsWide(regionInfo.rect.width);
    jsbTex.setPixelsHigh(regionInfo.rect.height);
    jsbTex.setNativeTexture(regionInfo.texture.getImpl());

         if (spine) {
             let rt = {
                 x: regionInfo.rect.x, y: regionInfo.rect.y,
                 w: regionInfo.texture.width, h: regionInfo.texture.height
             };
             spine.updateRegion(slotName, jsbTex, rt, regionInfo.degrees,
                 regionInfo.offset);
         }
         return;
     }
    

另附makeRegionInfo方法:
public static makeRegionIno(frame: cc.SpriteFrame, key: string = ‘’) {
if (frame == null) {
return null;
}
let texture = frame.getTexture()
let rect = frame.getRect()
let origSize = frame.getOriginalSize()
let offset = frame.getOffset()
let rotate = frame.isRotated();

        let info = {
            key: key,
            rect: rect,
            origSize: origSize,
            offset: cc.v2(
                (origSize.width - rect.width) * 0.5 + offset.x,
                (origSize.height - rect.height) * 0.5 + offset.y
            ),
            degrees: rotate ? 270 : 0,
            texture: texture,
            frame: frame
        }
        return info
}

spine换装by Lion.zip (25.5 KB)

2赞

https://github.com/EsotericSoftware/spine-runtimes/tree/4.1/spine-ts

1赞