色々と手詰まり中 / magicien 

ここのところ色々なバグや問題に引っかかってあらゆるものが停滞している。以下、駄文。

iOSでclassの変数にアクセスすると、EXC_BAD_ACCESSエラーで落ちる

JSONDecoderで取得したデータにアクセスしようとすると、エラーで落ちる問題があって困惑している。
考えられる原因としては、
  • MainThread以外でJSONDecoderを使っているから?
  • Codableなclassをextendsして使っているから?
  • ARCの処理が変わった?どこかをweakとかunownedとかにしないといけないのか?
  • JSONDecoderかARCのバグ?
といった感じなのだけれど、よくわからない。コールスタックを見ると、こんな感じの見知らぬ関数が呼ばれていた。

  • materializeForSet
  • swift_beginAccess
  • insert
  • reportExclusivityConflict
JSONDecoderで取得したデータにアクセスした時に、排他アクセスチェックが行われ、問題があったのでデバッガにリポートを送信した帰りに変なメモリにアクセスして落ちているようだ。実際は、reportExclusivityConflictが終わり、insertから帰る寸前で何かをやらかしている。スタックに退避したデータをレジスタに書き戻す直前に何かごにょごにょやっているようなのだが、処理を追う気力が無かった...
まぁ元々の問題はどこかで変数書き込み処理がコンフリクトしていることらしいので、それを解決すれば、この問題も自ずと解決するはず。せめて、reportExclusivityConflictの出力がデバッガで受け取れれば良いのだが、その前にエラーで落ちてしまっているようで、原因の究明が難航している。

SCNSkinnerが使えなくなった

ベータ版を使っていた時は大丈夫だったのに。
SCNSkinnerを使うには、boneIndicesとboneWeightsを渡す必要があるのだが、boneIndicesにいつも通りUInt16のデータを渡すと、
[SceneKit] Error: Compiler error while building render pipeline state for node "(null)" (0x1016db2c0): Error Domain=CompilerError Code=2 "Vertex attribute skinningJoints(4) of type uint4 cannot be read using MTLAttributeFormatShort4" UserInfo={NSLocalizedDescription=Vertex attribute skinningJoints(4) of type uint4 cannot be read using MTLAttributeFormatShort4}
というエラーが出る。uint4は4バイトのunsigned intを4つセットにしたベクタ。要するに、2バイトじゃなくて4バイトのデータをくれ、ということなので、UInt32に変換してデータを渡してみると、
[SceneKit] Error: SCNSkinner: bone indices must be uint8 or uint16 (maximum of 2 bytes)
boneIndicesは最大2バイトまでだという。何を言っているのか。
SceneKitに渡せるのは2バイトまで。SceneKitの先にあるMetalに渡す必要があるのは4バイト。詰んだ。

追記:
GLTFQuickLookを作った時に偶然発見したんだけど、NSKeyedArchiverでSCNSceneをNSDataに変換した後、SCNSceneのイニシャライザにデータを渡したら、SCNSkinnerの問題を回避できた... とりあえず、バグが直るまではこれで対応しよう。

その他バグ

以前、いくつかのバグを報告をしたところ、1件だけ反応があり、最新のベータ版OSで再発するか試してくれ、と書いてあったので試したけれど、挙動が変わったものの問題は解決していなかった。報告用のログを集めるのが面倒なのと、ベータ版を使い続けるのが嫌になってダウングレードしてしまったので、返事をせず放置していたら、バグレポートがクローズされてしまった。残りのレポートは応答なし。バグを報告するのが億劫になってきた。でも、SCNSkinnerについてはなんとかしないと先に進めないので、適当に書いて送ろう。
2017/10/28(Sat) 05:39:06