Ist eine unterschiedliche physikalische Adresse für eine Textur Verweis auf die „gleiche Textur“ wirklich ein Problem?
Ich habe das Standard-Beispielspiel-Projekt ausgeführt, aber Setup für Obj-C. Ich habe einen Texturatlas, der so etwas wie das Bild unten wäre. Beachten Sie jedoch, dass ich das durch TexturePacker ausgeführt habe. Der tatsächlich generierte Atlas von Xcode ist also anders.
ich tun, wie Sie gesagt haben und erstellt zwei Texturen mit dem gleichen Namen.
self.myTextureAtlas = [SKTextureAtlas atlasNamed:@"MyTexture"];
self.tex0 = [self.myTextureAtlas textureNamed:@"tex0"];
self.tex1 = [self.myTextureAtlas textureNamed:@"tex0"];
Wie Sie sagten, die Zeiger für tex0
und tex1
sind unterschiedlich. Zumindest gibt es Konsistenz zwischen Swift und Obj-C.
Allerdings glaube ich nicht, dass dies ein Problem/Bug ist. Was ich vermute, ist, dass sie die Implementierung so geändert haben, dass die zurückgegebene SKTexture
eine neue "Instanz" ist, die zugrunde liegende Textur jedoch immer noch dieselbe ist.
Ich werde OpenGL sprechen, da das ist, was ich meine Motoren schreiben. Metall wird immer noch Ähnlichkeiten haben.Eine grundlegende Unterstruktur hat nur zwei wichtige Eigenschaften: einen Texturnamen (dies ist der OpenGL-Texturname) und UVs. Wenn Sie darüber nachdenken, was als die "Gleichheit" für die Übereinstimmung mit Equatable
gilt, würde es höchstwahrscheinlich auf Gleichheit gegen diese 2 Punkte prüfen. Der Texturname ist der Name der Atlas-Textur, und die UVs sind die UVs innerhalb des Atlas, die den Bereich der bestimmten Sub-Textur darstellen.
Um diese Hypothese zu testen, habe ich eine GPU-Frame-Capture auf diesem durchgeführt. Mit Xcode 8 scheint das ziemlich fehlerhaft zu sein. Mit Metal ist es zu 100% abgestürzt. Ich habe es gezwungen, OpenGL zu verwenden, und habe es geschafft, eine Bildaufnahme zu bekommen. Wie erwartet, wenn ich mir alle Texturressourcen anschaue, sehe ich nur eine Textur für meinen Atlas.
Texture # 3 ist MyTexture.
Wenn ich die textureRect Dump, die die UVs zu sein scheinen, kann ich sehen, sie sind die gleichen:
Tex0 Rect 0,001618 0,793765 0,139159 0,203837
Tex1 Rect 0,001618 0,793765 0,139159 0,203837
Basierend darauf scheint es, dass beide self.tex0
und self.tex1
, obwohl unterschiedliche physikalische Adressen, immer noch beide auf die gleiche Sub-Textur zeigen.
Beachten Sie, dass ich SpriteKit nicht mehr verwende. Mein aktueller Renderer verwendet Handles für Texturen, beim Abrufen können Sie jedoch Handle-Objekte mit unterschiedlichen physischen Adressen abrufen. Sie alle dereferenzieren immer noch auf die wahre Textur, da sie immer noch auf dieselbe zugrunde liegende Texturinstanz verweisen.
Ich denke, ich sehe nicht wirklich diff Zeiger ein Problem, vorausgesetzt, sie verweisen immer noch die gleiche zugrunde liegende Textur (dh. Nicht mehr Textur Speicher zugeordnet ist).
Oh, interessante Frage, iOS10 hört nie in Erstaunen versetzen zu .. –
Zwischen dies und das Erstellen von SkPhysicsBodies (Texturen) dauert 10x so lange sie mich wirklich über – Knight0fDragon
schraubt Also, endlich ... BOOM! Das ist ein echter Fehler :-(... das lässt mich viel über die letzte Langsamkeit während meines Spiels (nach dem Spielen von 20 Levels) nur in iOS 10 nachdenken. –