Schönen guten Abend. Mein Name ist Cornix und dies ist mein erster Beitrag in diesem Forum.
Ich habe mir vor nicht allzulanger Zeit den RPG Maker XP beschafft und selbst im autodidaktischen Verfahren begonnen die zugrunde liegende Programmiersprache Ruby zu erlernen.
Allerdings haben sich mir neuerdings folgende Fragen aufgetan welche ich aus eigenem Antrieb nicht in der Lage bin zu beantworten.
1).
Der standart Script "Spriteset_Battle" besitzt 4 lokale Viewports von denen 3 exakt die selben X-, Y-, breiten- und längenangaben besitzen. Sind wirklich 4 Viewports hierfür nötig oder würden auch einfach 2 reichen?
Wenn 2 reichen, ist es dennoch sinnvoller 4 zu verwenden?
2).
Ist es einfacher in einem eigenen Interface die Trefferpunkte der Character durch Balken darstellen zu lassen welche neuerstellte Objekte vom Typ "Sprite" sind oder einfach den Balken als temporäres Bitmap Objekt zu erstellen und einen Blocktransfer des Windowcontents durch zu führen.
Was würde die Performance weniger belasten?
Und falls der Blocktransfer aufwendiger ist, würden die Unterschiede so gravierend sein, dass die Spieler es merken könnten?
Ich danke bereits im Vorraus für alle hilfreichen Antworten.
Cornix.
1) Nun, soweit ich weiß sind da schon vier Viewports nötig. Du hast ja zum einen, das Bild im Hintergrund, dann die Battler von Actors und Enemies und über die sollen ja noch die Battle-Animationen erscheinen können, sowie die Sprites für den dargestellten Schaden. Und dann sollte das Interface im Kampf idealerweise ja auch über den anderen Sprites liegen.
Ich würde also es bei 4 viewports belassen, denn davon lässt sich die Performance mMn nicht groß beeinflussen.
2.) Das ist eigentlich sehr unkompliziert. Zumindest gibt es ein Script im Netz, welches von einem Scripter zur Verfügung gestellt wurde und eben Balkenanzeigen statt nur der plumpen Zahlen einfügt. Performance wird da nicht groß belastet.
Wo du aber aufpassen solltest sind Menüs oder dergleichen, wo viel an Grafiken und anderen Daten geladen werden muss, wenn du sie aufrufst, da kommt es zu merkbaren Performanceeinbußen.
Aber ich denke, das kann man durch kluge Programmierung umgehen.
Irgendwie konnte man ja auch einfach per Script die Framerate allgemein höher setzen als das - hoffentlich - standartisierte 40 Frames/s...
Wie weiß ich leider auch nicht so im Detail ^^;
Ja jede Antwort ist etwas positives, neben dem Informationsgehalt spielt ja bekanntlich auch die allgemeine Aufmerksamkeit eine Rolle. Es ist nunmal immer sehr zu bedauern wenn gepostete Probleme garnicht erst wahrgenommen werden.
Zu 1).
Ich habe RGSS niemals gelernt oder mir von jemandem erklären lassen und kann daher nur aus eigener Erfahrung berichten, aber soweit ich es erlebt habe reicht 1 Viewport vollkommen aus um sowohl den Hintergrund als auch die Battlersprites, Animations und das Interface darzustellen.
Mit einem Viewport hatte ich selbst in meinen Scripten niemals Probleme, ich frage lediglich aus Neugierde warum denn nun von den vermeintlichen Profis 4 verwendet werden, wenn alles bei mir auch auf einem dargestellt werden kann.
Zu 2).
Ich kreire alle benutzten Scripte in meinem Spiel ausschließlich selbst und habe daher keine Ahnung wie andere ihre Arbeit aufbauen.
Ich habe auch im allgemeinen keine allzu große Erfahrung mit Programmierung und Sprachen.
Das Problem warum ich nicht fremder Leute arbeit verwende liegt für mich einfach an der schwachen kontrollierbarkeit.
Ich will alles in meinem Spiel selbst beeinflussen können, habe aber ein persönliches Problem damit andererleute Arbeit zu verstehen. Auch wenn es theoretisch möglich ist scheitere ich fürchterlich daran bestehende Scripte zu verändern.
Daher erstelle ich alles selbst.
Womit ich mich allerdings keineswegs auskenne sind Performance technische Angelegenheiten.
Natürlich kann ich mir einige Antworten logisch herleiten. Zwei Bilder sind auf mehr als eines und verbrauchen daher auch mehr Leistung.
Hierbei ist es aber nicht allzu leicht.
Vielleicht poste ich einmal ein kleines Beispiel zu besagtem Script:
damit erschaffe ich erst temporär eine Bitmap Datei und ein Rectangle und füge den ausgeschnittenen Bildteil in den Content eines Windows über Blocktransfer ein.
Ist dies für den Computer einfacher als einen separaten Sprite für den Balken zu erstellen und zu updaten? Immerhin wird das selbe angezeigt.
1)
die viewports werden wegen der unterschiedlichen z achsen und tönungen benötigt. wenn man alles in ein viewport packt, kann es zu unschönen effekten kommen. zb wegen der screen tönung, die gilt für nur ein bestimmtes viewport. wenn alles in einem ist, wird alles gefärbt. zusätzlich kann es zu überlappungen von animationen/sprites kommen, die durch die viewports verhindert wurden.
2)
es kommt darauf an wie oft aktualisiert wird. im standart ks ist das akzeptabel, wie du es machst.
bei einem schnellen aks wo sich häufig und schnell hintereinander der balken ändert und es auch noch mehrere auf einmal gibt, sollte man eher ein sprite verwenden und per src_rect die position aktualisieren, da bitmap bearbeitungen immer vergleichsweise langsam sind.
(siehe sprite_character, dort wird auch nicht jedes mal wenn der char sich bewegt das bitmap geändert)
@sorata
Graphics.frame_rate = 80
siehe help file
aber dadurch wird nicht nur die fps erhöht, sondern das gesammte spiel.
statt 40 mal wird die schleife in $scene.main nun 80 mal durchlaufen -> spiel läuft doppelt so schnell -> es muss doppelt so viel berechnet werden
theoretisch gehts bis 120 aber die meisten pcs schaffen das gar nicht.
Vielen vielen Dank. Ich glaube diese Antwort ist mehr als ausreichend.
Allerdings hätte ich nun eine weitere Frage schlussfolgernd aus der ersten:
Zu 1).
Ich habe bereits bemerkt, dass Sprites welche den selben Viewport teilen manchmal überlappen, jeh nachdem welches zuletzt gezeichnet wird, wozu sind dann die Sprite internen Z-Koordinaten da?
Immerhin kann ja das Z eines Sprites selbst auch gesetzt werden.
Zu 2).
Aber wenn ich einen Sprite benutze dann wird doch ebenfalls ein Bitmap verwendet und ausgeschnitten um dargestellt zu werden. Wo genau ist der Unterschied in der Performance wenn ich einen Blocktransfer mache?
Ist es die Tatsache, dass die Src_Rect neugesetzt werden muss? Doch das passiert im Sprite ja auch.
Und das Problem, dass ich nun temporär stendig ein neues Bitmap erschaffe von dem ich den Blocktransfer durchführe müsste doch theoretisch, nach meiner Ansicht, beiseite geschafft werden wenn ich das Bitmap nur in der Initialisation als lokale Variable speichere.
1)
die regel, dass sprites mit höherer z koordinate oben liegen, gilt nur für die sprites im selben viewport.
für sprites in unterschiedlichen viewports gilt, dass das sprite mit dem höheren viewport oben liegt.
du kannst dir ein viewport eigentlich wie ein sprite vorstellen und die sprites im viewport sind das bitmap.
2)
das src_rect eines sprites ist immer vorhanden und die information in src_rect wird in Graphics.update IMMER zum rendern verwendet. die zusätzliche arbeit für die CPU ist also nur das ändern der rect daten (und 4 zahlen ändern benötigt kaum rechenleistung)
wenn du jedoch per blocktranfer arbeitest muss die cpu zusätzlich das bitmap bearbeiten (und zwar jedes pixel einzeln kopieren - das ist rechenleistung im vergleich zu 4 zahlen).
die zusätzliche arbeit, die durch das weitere sprite im 1. fall verursacht wird, wird soweit ich weiß von der gpu berechnet und die hat bei nem 2d spiel eh zu wenig zu tun ._.