Danke für das Vertrauen. :>
Neuer Release
rpgss-0.9.0.7z
Screen Blending wurde nun komplett in Assembler geschrieben. Leider lässt sich Screen Blending nicht mit SIMD optimieren, weil die Screen Buffer-Pixel im RGB565-Format sind und damit ungeeignet für SIMD (das Entpacken und Verpacken ist zu teuer). Dennoch ist Screen Blending in RPGSS äußerst schnell und mit der Implementierung in Assembler konnte ich größtenteils Verbesserungen von 50-100% erzielen.
Kleiner Tipp an dieser Stelle: Wer viele und große Images jeden Frame zeichnet, kann bessere Performance erzielen, indem er die Images zuerst auf ein Image-Buffer und den Buffer dann auf den Screen zeichnet. Image-Blending ist in der Regel SIMD-optimiert und damit viel schneller als Screen-Blending.
Partikel + Blend Modes = Awesome
Echt genial! Die Zeichenmethoden von RPGSS sind echt hammer!
Wird langsam echt mal Zeit für's offizielle DynRPG v0.2 ^^
Wie sieht's mit der Performance aus, Kyuu?
PeAcE
MorDen
gibts das auch bewegt? ^^
Freut mich, dass jemand sie nützlich findet. :>
Wovon genau?
Die Performance der Grafikroutinen? Echt schwer zu sagen, da die Performance von so vielen Faktoren abhängt (Prozessor, Blend Mode, Algorithmus, Anzahl der gezeichneten Pixel, etc.).
Bei der Partikel-Demo unten schaffe ich beispielsweise 350 Partikel gleichzeitig auf einem Pentium 4 (3,4 GHz) bei 60 FPS. Auf einem Core i3 (3,3 GHz) schaffe ich mehr als das Fünffache (wobei die Anzahl der gezeichneten Pixel pro Frame bereits bei 350 Partikeln in Millionenhöhe liegt!).
Wenn es dich interessiert, könnte ich ein paar Benchmarks veröffentlichen (wenn ich mal Zeit habe). Oder du machst deine eigenen Benchmarks. ;>
Download
kranker scheiß
really looking forward to whatever this is.
Hey. Ich hab ne Frage.
Folgende Map hat eine Lightmap.
Diese benutzt verschiedene Photoshop-Blendmodes (Color Dodge, Overlay, Multiplizieren etc. etc.).
Da sich diese ja nicht einfach so in den Maker übertragen lassen (zumindest nicht ohne Parallax), dachte ich, ich verzichte auf ein paar schönere Effekte und komprimier das ganze auf einen Effekt.
Den LE-Manager kann ich ja aufgrund fehlender Unterstützung für BlendModes eh momentan streichen, deshalb habe ich mit den verfügbaren Blend Modes in spritelib rumgespielt.
(Mix, 100 Opacity)
(Multiplizieren)
Wie man sieht, sind die Ergebnisse nicht wirklich ansehlich. Ist da irgendwas in die Richtung geplant? :0
Das erste Bild ist aus Photoshop (wobei es mehrere Layer sind; der unterste ist die Map und alle drüber liegenden sind Lightmaps mit unterschiedlichem Blending)? Und deine Frage ist, ob es möglich ist, die Blend Modes aus Photoshop hinzuzufügen? Habe ich das richtig verstanden? :o
Neue Blend Modes hinzufügen ist kein Problem, ich müsste nur an die Blending-Formeln kommen. :<
Was den LE-Manager angeht: In der Datei LightmapManager.lua, in Zeile 54, ist der Aufruf von game.screen.draw. Dort einfach den Aufruf um den Blend Mode-Parameter erweitern. Der Blend Mode gilt dann natürlich für alle Maps. Es ist selbstverständlich auch möglich den LE-Manager um mehrere Lightmap-Layer zu erweitern. Will den eh noch in der nächsten Zeit überarbeiten, damit Lightmaps eine Tiefe (Z-Position) bekommen.
Das wäre optimal, ja. Im Moment ist die gängige Art für solche Lichteffekte, den Effekt direkt als Parallax mit der Map einzufügen. Dadurch werden natürlich Events und der Hero nicht vom Effekt erfasst, und diese müssen entweder manuell eingefärbt oder einfach ignoriert werden. Wenn man die direkt als Picture mit dem passenden Blend Mode einfügen könnte, sähe das echt super aus.
Ich kann dir ja mal nen Breakdown der benutzten Blend Modes geben:
Ganz unten ist natürlich die Map
![]()
Dann Weiches Licht / Soft Light
Ineinanderkopieren / Overlay
Farbig Abwedeln / Color Dodge
Multiplizieren / Multiply
Und das wird einfach so drübergelegt
Bezüglich der Formeln hab ich nicht wirklich Ahnung von der Implementierung, ich kann lediglich etwas googlen und >>sehr<< >>vielversprechend<< >>aussehende<< >>Ressourcen<< finden. °-o (Die obigen Bilder wurden übrigens in Photoshop CS5 gemacht, ich weiß nicht, ob sich da was über die Versionen geändert hat.)
Hm, ok. Multiply ist eh schon drin. Color Dodge und Overlay sollten kein Problem sein. Soft Light könnte für die Echtzeitanforderungen eines Spiels aber zu langsam sein, zumindest in der "exakten" Version (Wurzel muss gezogen werden). Das könnte ich aber mit einem LUT, oder mit einer angenäherten Version beschleunigen. Ich teste es mal am Wochenende aus.
@goldenroy:
Sorry, aber daraus wird nichts. Die Blend Modes sind ungeeignet für Software Blending in Echtzeit. Habe die Blend Modes bis jetzt zwar nur in C++ ausprobiert, aber selbst in Assembler wird sich vermutlich nicht viel ändern. Hätte ich bloß OpenGL + Shader zu Verfügung... :/
Geändert von Kyuu (03.08.2014 um 16:11 Uhr)
Okay, das ist schade, aber nicht allzu tragisch. ^-^
Mir ist aber noch eine andere Sache aufgefallen: Gibt es einen simplen Weg, um festzustellen, ob sich ein Charakter bewegt? <Character>.moving gilt ja nur fürs Bewegen durch Move Event und es gibt afaik auch keinen Sprite-Offset (wie weit die Grafik vom eigentlichen Eventblock entfernt ist, wenn das != 0 ist, dann ist das Event ja in Bewegung). Es gibt natürlich den üblichen Weg über das abgleichen von Koordinaten, aber vielleicht hat Dyn ja Zugriff auf was simpleres als das. :0
Echt? Das war mir noch gar nicht bewusst. Kann's jetzt auch nicht ausprobieren, da ich mitten in einem Systemwechsel stecke.
Soweit ich mich erinnern kann, haben Character-Objekte aber einen Haufen Attribute, anhand derer der Maker Bewegungen interpoliert. Das heißt, es gibt höchstwahrscheinlich einen Weg herauszufinden, ob ein Character gerade in Bewegung ist, unabhängig davon, ob ein Move-Event oder was auch immer den Character bewegt. Ich schau mal was sich machen lässt, sobald ich wieder die Gelegenheit bekommen.
Beim onComment des DynRPG wird ja als Argument die EventID des entsprechenden Events übergeben.
Gibt es eine Möglichkeit diese ID auch beim RPGSS zu übergeben (z.B. mit einem zusätzlichen @callID das als erstes Argument die EventID an die LUA-Funktion übergibt.
Edit:
Warum wirft dieses Stück Code den Fehler "no member named 'charsetId'"? Ich möchte gerne das Charset durch das Script ändern lassen. Oder ist das nicht möglich?
function change(eventID)
event = game.map.findEvent(eventID)
event.charsetId = 2
end
Geändert von benzor (09.08.2014 um 19:00 Uhr)
Ja, ist möglich. Ich baue es in die nächste Version ein.
Weil ich noch keinen Setter für das charsetId-Attribut geschrieben habe.
Bei einigen Attributen macht eine Zuweisung keinen Sinn, z.B. weil es keine Auswirkung hätte. Dort, wo ich mir nicht sicher war (und zu faul war zum Testen :>), habe ich den Setter vorerst ausgelassen.