5

c-float array後で使用するために を に保存しようとしNSDictionaryています。
私は当初NSArray、C データを保存するためにを使用していましたNSArrayが、私の意図では遅くなります。

次のコードを使用して、配列を NSDictionary にラップしています。

[self.m_morphPositions setObject:[NSValue valueWithBytes:&positionBuff objCType:@encode(float[(self.m_countVertices * 3)])] forKey:fourCC];

そして、以下を使用して C-Float 配列を取得します。

float posMorphs[(self.m_countVertices*3)];

NSValue *posValues = [self.m_morphPositions objectForKey:name];

[posValues getValue:&posMorphs];

配列を撤回すると、インデックスごとに値がすべて 0.0 に設定されますが、これは間違っています。

どうすればこれを修正できますか?

4

4 に答える 4

2

NSValueおそらく、配列ではなくスカラー値を対象としています。この場合、使用NSDataははるかに簡単になるはずです

NSData* data = [NSData dataWithBytes:&positionBuff length:(self.m_countVertices * 3 * sizeof(float))];
[data getBytes:posMorphs length:(self.m_countVertices * 3 * sizeof(float))];

別の解決策は、配列をヒープに割り当て、NSValueポインターを格納するために使用することです。

于 2013-04-06T13:55:04.463 に答える
1

バイトが NSData にラップされている場合は、バイトを NSDictionary にフィードできます。

それをスキップしたい場合は、値ポインタ関数にNSMapTableand NSPointerFunctionsOpaqueMemory(or ) を使用します。MallocMemory

于 2013-04-06T14:12:26.180 に答える
0

値をエンコードする方法であるかどうかはわかりませんが、配列を構造体にカプセル化すると役立つ場合があります。

// Put this typedef in a header
typedef struct
{
    float values[3];
} PosValues;

あなたのコードで:

// store to NSValue
PosValues p1 = { { 1.0, 2.0, 3.0 } };
NSValue *val = [NSValue valueWithBytes:&p1 objCType:@encode(PosValues)];

// retrieve from NSValue
PosValues p2;
[val getValue:&p2];

NSLog(@"%f, %f, %f", p2.values[0], p2.values[1]. p2.values[2]);

このアプローチの利点は、配列が配列型として維持されることです。また、生の配列は代入できませんが、これらの構造体は代入可能です。

PosValues p1 = { { 1.0, 2.0, 3.0 } };
PosValues p2;

p2 = p1;
于 2013-04-06T14:10:58.550 に答える