Genauer gesagt, wenn ich diese Funktionalität in einer anderen API (z. B. in OpenGL) von Grund auf neu erstellen müsste, wozu müsste sie fähig sein?
Ich habe eine allgemeine Vorstellung von einigen der Schritte, z. B. wie eine orthografische Projektionsmatrix erstellt und für jeden Draw-Aufruf ein Quad erstellt wird.
Ich bin jedoch nicht sehr vertraut mit dem Batching-Prozess. Sind alle Quads im selben Vertex-Puffer gespeichert? Benötigt es einen Indexpuffer? Wie werden unterschiedliche Texturen behandelt?
Wenn möglich, wäre ich Ihnen dankbar, wenn Sie mich von SpriteBatch.Begin () bis SpriteBatch.End () durch den Prozess führen könnten, zumindest wenn Sie den Standardmodus "Zurückgestellt" verwenden.
xna
spritebatch
David Gouveia
quelle
quelle
Antworten:
Ich habe das Verhalten von SpriteBatch für eine plattformübergreifende Engine, an der ich arbeite, im verzögerten Modus nachgebildet. Hier sind die Schritte, die ich bisher rückgängig gemacht habe:
Spritebatch Konstruktor: schafft ein
DynamicIndexBuffer
,DynamicVertexBuffer
und das Array vonVertexPositionColorTexture
fester Größe (in diesem Fall die maximale Chargengröße - 2048 für Sprites und 8192 für die Eckpunkte).SpriteInfo
Strukturen wird erstellt. Hier werden temporäre Sprite-Einstellungen gespeichert, die beim Stapeln verwendet werden.SpriteBatch.Begin: intern speichert die Werte
BlendState
,SamplerState
usw. festgelegt und überprüft , ob es zweimal ohne ein aufgerufen wurdeSpriteBatch.End
zwischendurch .SpriteBatch.Draw: Nimmt alle Sprite-Informationen (Textur, Position, Farbe) und kopiert sie in eine
SpriteInfo
. Wenn die maximale Stapelgröße erreicht ist, wird der gesamte Stapel gezeichnet, um Platz für neue Sprites zu schaffen.SpriteBatch.DrawString
Gibt einfach einDraw
für jedes Zeichen der Zeichenfolge aus, wobei Kerning und Abstand berücksichtigt werden.SpriteBatch.End: Führt die folgenden Vorgänge aus:
Begin
.SpriteBatch
Shader an.DynamicVertexBuffer
undDynamicIndexBuffer
.Führt den folgenden Stapelvorgang aus:
SpriteBatch.RenderBatch: Führt die folgenden Vorgänge für jeden
SpriteInfo
im Stapel aus:SpriteEffects
sie an.VertexPositionColorTexture
zuvor erstellten Array von Elementen gespeichert . Wenn alle Sprites berechnet wurden,SetData
wird am angerufenDynamicVertexBuffer
und einDrawIndexedPrimitives
Anruf ausgelöst.quelle
SpriteSortMode.Texture
und zeichnen Sie in der gewünschten Reihenfolge. LassenSpriteBatch
Sie dann die Sortierung durchführen.SpriteBatch
aus Bequemlichkeitsgründen für eine Neuimplementierung entschieden . Und ja, es benötigt MonoTouch / MonoDroid, da es nur C # ist!Ich möchte nur darauf hinweisen, dass der XNA SpriteBatch-Code nach DirectX portiert und von einem früheren Mitglied des XNA-Teams als OSS veröffentlicht wurde. Also, wenn Sie genau sehen möchten, wie es in XNA funktioniert , dann gehen Sie.
quelle