Seite 1 von 12
[Projekt] sfäre aka Bulletmaker
Verfasst: 20.04.2020, 18:26
von marcgfx
Re: [Projekt] Bulletmaker
Verfasst: 20.04.2020, 22:08
von marcgfx
Schüsse können nun in weitere Schüsse explodieren.
Code: Alles auswählen
result.x = time * 200;
result.y = 0;
createBullet(time,0.5,7,0,0,0,function(result, time, dot){
result.x = time*100;
});
So glaube jetzt reichts mal für das mini-projekt vorerst. Mal sehen ob ich es sinnvoll einsetzen kann.
Re: [Projekt] Bulletmaker
Verfasst: 20.04.2020, 23:56
von marcgfx
Wenn Zeitverplempern sinnvoll einsetzen ist, dann wars ein voller Erfolg.
Bullets:
Code: Alles auswählen
result.x = time * 200;
result.a = time;
window.createBullet(time,1,6);
Emitter:
Re: [Projekt] Bulletmaker
Verfasst: 21.04.2020, 09:47
von Alexander Kornrumpf
Ich find's optisch super ansprechend. Wenn du es noch schaffst da Gameplay dranzutackern würde ich es wahrscheinlich kaufen.
Re: [Projekt] Bulletmaker
Verfasst: 21.04.2020, 11:54
von marcgfx
Ja in die Richtung überlege ich auch. Hab mir gar mal Unity runtergeladen. Wäre nur schon spannend zu sehen wie sich das kleine Javascript Programm transferieren lässt.
Spielmässig könnte es sowas wie Mario Maker sein. Man kann sein kleines Bullet Hell Level machen, wo man von A nach B gelangen muss, oder einfach eine gewisse Zeit zu überstehen hat. Evtl. liesse sich das ganze auch ohne Code-Editor machen, wäre zumindest zugänglicher.
Re: [Projekt] Bulletmaker
Verfasst: 21.04.2020, 12:24
von Alexander Kornrumpf
Ich kenne Mario Maker nur aus Erzählungen aber etwas in Richtung Creative Play könnte ich mir hier gut vorstellen.
Re: [Projekt] Bulletmaker
Verfasst: 22.04.2020, 01:07
von marcgfx
Immerhin läuft jetzt schon was in Unity. Das wird für mich denke ich ein ziemlicher Challenge... mal wider mit Typen und Klassen arbeiten. Ich habe natürlich direkt Versucht mein Zeug in Unity reinzuwürgen, anstatt mich einzulesen und sachte an die Geschichte ranzugehen. Die Dreiecke werden über ein Mesh gerendert, dass ich nur teilweise verstehe. Eigentlich wollte ich das ganze mit PointSprites realisieren, aber anscheinend sind die wieder out???
Performance ist relativ bescheiden. Dachte mit Unity könnte ich sicher 1mio von den Dreiecken rendern, aber dann sackt die Framerate auf 4 runter. Bis jetzt hat Javascript für mich die Nase vorn, aber was soll ich nach einem Tag und Null Ahnung meckern.
Re: [Projekt] Bulletmaker
Verfasst: 22.04.2020, 08:01
von Chromanoid
Schau Dir vielleicht gleich von Anfang an das hier an:
https://learn.unity.com/tutorial/entity ... ent-system
Die bauen bei Unity3d gerade einiges um und schaffen zwei Wege Dinge zu tun, einen bequemen und einen performanten.
Re: [Projekt] Bulletmaker
Verfasst: 22.04.2020, 09:59
von xq
Performance ist relativ bescheiden. Dachte mit Unity könnte ich sicher 1mio von den Dreiecken rendern, aber dann sackt die Framerate auf 4 runter. Bis jetzt hat Javascript für mich die Nase vorn, aber was soll ich nach einem Tag und Null Ahnung meckern.
Das geht auch,
aber: Du kannst nicht 500.000 Drawcalls machen, mit jeweils 2 Dreiecken. Hast du die 2D-Utilities oder 3D-Rendering genutzt? Der 2D-Kram müsste eigentlich echt gut batchen
Re: [Projekt] Bulletmaker
Verfasst: 22.04.2020, 11:19
von marcgfx
Ich mach sicher noch vieles falsch, aber so viele draw-calls dürftens nicht sein. Ich benutze ein Mesh object. Eigentlich ist der ganze Javascript code in einem einzigen Objekt verpackt, also die Dreiecke sind keine eigenen Entities.
Code: Alles auswählen
void Start(){
...
mesh = gameObject.GetComponent<MeshFilter>().mesh;
mesh.Clear();
mesh.vertices = vertices;
//mesh.Clear();
//mesh.vertices = new Vector3[maxBuffer];
mesh.uv = uvs;
mesh.triangles = triangles;
}
void Update(){
....
render();
mesh.vertices = vertices;
}
Ich hab ein bisschen getestet und Sachen rumgeschoben. uvs und triangles in Start rüberschieben hat viel gebracht. Mein render Aufruf kostet aktuell sehr viel (berechnet 120k Punkte im Test). Ohne render und vertices, gehts auf 300fps, ohne render sinds etwa 180fps.
Re: [Projekt] Bulletmaker
Verfasst: 22.04.2020, 12:02
von xq
Probier mal aus, Sprite-Entities zu spawnen, statt den Kram selber zu rendern. Das dürfte wahrscheinlich sogar flotter sein
Re: [Projekt] Bulletmaker
Verfasst: 22.04.2020, 12:48
von scheichs
Wie misst du die Performance? Das Stats-Window im Unity-Editor oder im Standalone Build mit eigenem FPS-Counter. Das Stats Window im Editor ist nurn Anhaltspunkt.
Re: [Projekt] Bulletmaker
Verfasst: 22.04.2020, 15:06
von marcgfx
Boa hab grad schon ein bisschen die Schnauze voll von Unity. Überall hats Zeug das ich überhaupt nicht brauche und was ich machen will geht nicht. Ich schaffs nicht mal ein Material auf mein Mesh zu legen. Auf eine Kugel kann ichs draufziehen, aber auf Mesh nicht. Wieso auch immer. Wenn ich einen neuen Shader schreiben will ist dort schon haufenweise Code drin der micht nicht interessiert. ich will einfach eine Farbe ausgeben und brauche weder Glossiness noch Metallic oder sonst so ein Mist. Dranbleiben, wird sicher noch besser.
Performance: Ich hab einfach so ein FPS Asset verwendet
Re: [Projekt] Bulletmaker
Verfasst: 22.04.2020, 15:25
von xq
Ich schaffs nicht mal ein Material auf mein Mesh zu legen. Auf eine Kugel kann ichs draufziehen, aber auf Mesh nicht.
Meshes haben in Unity auch keine Materials. Du hast eine Entity mit einem MeshRenderer, welcher ein Mesh mit einem Material rendert. Dementsprechend musst du das Material im Prefab für dein Objekt setzen oder aber in dem MeshRenderer selber
Re: [Projekt] Bulletmaker
Verfasst: 22.04.2020, 16:19
von marcgfx
Aaaaa danke! Hab jetzt auch noch gecheckt wie ich einen Shader im Material unterbringen kann. Ganz schön verschachtelt das ganze...
Re: [Projekt] Bulletmaker
Verfasst: 22.04.2020, 17:39
von marcgfx
Mir ist mega wichtig, dass es schön ausschaut, also das was ich in Canvas/JS habe sollte auch in Unity machbar sein. Halt mit viel besserer Performance versteht sich...
Mit dem schöner ausschauen habe ich noch meine Mühe. Auch mit 4xAnti-Aliasing find ich das nicht sonderlich rund. Ein bisschen stolz bin ich auf die Kreise dennoch. Ich benutze weiterhin gleichseitige Dreiecke für meine Bullets und habe eine Textur dementsprechend verzerrt, dass am Ende wieder ein Kreis dabei rauskommen soll. Bei genauem hinsehen wird es vermutlich nicht ganz passen. Viel weniger Polygone und Pixel kann ich vermutlich gar nicht mehr rendern pro Kreis?
Musste es grad mal überprüfen und ich bin über die Rundheit des grossen Kreises sehr erfreut, es ist nur minimal verzerrt. Bei der Nahaufnahme wird aber ein anderes Problem offensichtlich...
Re: [Projekt] Bulletmaker
Verfasst: 22.04.2020, 18:01
von marcgfx
Ok, hängt mit dem z-Wert noch irgendwie zusammen. Ich hatte den für die Farbversuche missbraucht...
Wenn ich für jedes Poly den z-Wert minimal erhöhe scheint es korrekt zu rendern, mit dem schönen Nebeneffekt das die Schüsse zuoberst und rot gefärbt sind.
Re: [Projekt] Bulletmaker
Verfasst: 22.04.2020, 18:14
von scheichs
marcgfx hat geschrieben: ↑22.04.2020, 16:19
Aaaaa danke! Hab jetzt auch noch gecheckt wie ich einen Shader im Material unterbringen kann. Ganz schön verschachtelt das ganze...
Jo wenn man von hand-made kommt, braucht man eine gewisse Umgewöhnungszeit. Aber glaube lohnt sich dranzubleiben. :D
Re: [Projekt] Bulletmaker
Verfasst: 23.04.2020, 10:09
von marcgfx
Gestern abend war ich voll stolz auf meine Lösung, wie ich einen Kreis in mein gleichseitiges Dreieck gebracht habe. Mit fixen koordinaten an den Ecken (0,0 - 0,1 - 1,0) habe ich einen Kreis so in eine Textur verzerrt, damit es beim entzerren wieder zum Kreis wird. Genial!
Am selben abend wollte ich meine Lösung erklären, da viel es mir wie Schuppen vor den Augen, dass ich ein Holzkopf bin. Wenn auch einer mit einer interessanten Lösung. Anstatt die Textur zu verwürgen, hätte ich bloss die UV Koordinaten korrigieren müssen, was ich inzwischen getan habe.
Heute morgen sind mir x Ideen durch den Kopf gegangen. Auf alpha kann ich komplett verzichten wenn ich mit additive Blending arbeite. Als Textur für die Kugeln nehme ich jetzt einen Kreis-Gradienten, dachte mir damit kann ich evtl. noch lustige Effekte im Shader machen. Für den Shader habe ich dann was gefunden, dass sich gut angehört hat (verstehe die Shader noch nicht ganz in Unity) und das Resultat verwirrt mich ziemlich. Es ist aber genau was ich haben wollte. Vor allem gibt es scharfe und ziemlich saubere Kanten, obwohl ich eigentlich einen Gradienten in der Textur habe.
Re: [Projekt] Bulletmaker
Verfasst: 23.04.2020, 12:27
von marcgfx
Also paar Sachen sind schon echt krass. Post Processing... wär für mich in WebGL wieder ein längeres Thema zum realisieren. In Unity geht es dermassen einfach, schon geil. Etwas bloom drauf und mein erster custom post-processing shader der ein bisschen spiegelt.
Re: [Projekt] Bulletmaker
Verfasst: 23.04.2020, 14:07
von marcgfx
Mein grösstes Problem wird vermutlich eine Lösung zu finden wie ich die Funktionen in Unity eingeben soll. Ich schaue mir grad Sachen wie MathParser an und dynamic code generation mit CodeDom. Performance und Security sind da die grossen offenen Fragen die ich habe. Evtl. kann ich einfach die Eingabe überprüfen und nur sehr beschränkte Parameter überhaupt zulassen. Dynamisch kompiliert sollte code eigentlich flott sein, ich habe etwas Angst das es mit Tokenizer zu langsam wird.
Als Übergabewerte für eine Funktion müssten time(t), number(n) reichen. An Funktionen braucht es nicht übetrieben viele (abs, min, max, sin, +, -, *, /, %) wären schon mal nett. Alles was nicht dem entspricht könnte ich dann ablehnen.
Re: [Projekt] Bulletmaker
Verfasst: 23.04.2020, 14:34
von xq
Was spricht denn gegen den Einsatz von
NLua?
Das ist nen Lua-Wrapper für .NET und sehr sehr angenehm zu benutzen.
Code: Alles auswählen
using (Lua lua = new Lua())
{
lua.State.Encoding = Encoding.UTF8;
state.DoString (@"
function bullet (val1, val2)
if val1 > val2 then
return val1 + 1
else
return val2 - 1
end
end
");
var scriptFunc = state ["bullet"] as LuaFunction;
// scriptFunc lässt sich dann später beliebig oft aufrufen und der Code muss nicht immer wieder neu geparsed werden:
var res = (int)scriptFunc.Call (3, 5).First ();
}
Re: [Projekt] Bulletmaker
Verfasst: 23.04.2020, 14:46
von marcgfx
Danke! Schau ich mir direkt an. Spricht nichts dagegen, nur dass ich keinen Schimmer habe :)
Re: [Projekt] Bulletmaker
Verfasst: 23.04.2020, 18:15
von marcgfx
Es läuft halbwegs... @xq
Performance ist aber aus mir unbekannten Gründen komplett in den Keller (auch ohne Lua). Werde wohl noch einen Hund ausgraben müssen.
Re: [Projekt] Bulletmaker
Verfasst: 24.04.2020, 12:19
von marcgfx
Ich glaub ich bin dabei das beste Projekt für Javascript in Unity umzusetzen. Hab mir gar schon V8 integration angeschaut, aber sieht irgendwie kompliziert aus. Lua läuft leider sehr langsam für meine Zwecke, aber man ist ja erfinderisch.
Eigentlich berechne ich viel zu viel. Die Strahlen von den Emittern sind eigentlich alle gleich, nur halt rotiert. (Stimmt nicht ganz, in der JS version konnte man noch etwas mehr, aber ich vereinfache mal)
1. Optimierung: Ich berechne nur einen Strahl und alle anderen Punkte rendere ich bloss rotiert um den Emitter.
Ich berechne für die Vorschau 500 Punkte in Lua, dann noch 100 Schüsse im worst case. Kann ich alles schon vorberechnen, es verändert sich ja nicht mit der Zeit. Also 1000 Zeitschritte berechnen, evtl. interpolieren zwischen den Rechenschritten. Nicht 100% genau, aber gut genug.
Immerhin 120fps, was auch immer das für diesen Code bedeutet (ohne Optimierungen war ich bei 3-4fps). Muss noch Profilen, gibt garantiert noch mehr rauszuholen. Aber als nächstes versuch ich jetzt ein Textfeld mit meinem Lua-Emitter zu verbinden.
Re: [Projekt] Bulletmaker
Verfasst: 24.04.2020, 14:48
von marcgfx
13 Sekunden habe ich gezählt um folgendes Script 1000 mal aufzurufen um die Werte vorzuberechnen:
Code: Alles auswählen
Lua lua = new Lua();
lua.State.Encoding = Encoding.UTF8;
lua.DoString(@"
function bullet (result, time)
result.x = 100*time
result.y = 40*math.sin(time*4)
end
");
var scriptFunc = lua["bullet"] as LuaFunction;
float time = 0;
for(var i = 0; i < accuracy; i++, time += step)
{
var r = rarr[i]; r.x = 0; r.y = 0; r.a = 0; r.s = 1;
scriptFunc.Call(r, time);
}
Ist nicht gerade schnell. Ich muss es wohl noch mal anders versuchen. Mit dieser Funktion wollte ich mir in einem Aufruf die 1000 Werte berechnen lassen.
Code: Alles auswählen
function all()
a = {}
steps = 1000
step = 10.0/steps
for i=0,steps do
result = {x=0,y=0,a=0,s=1}
bullet(result, 1)
table.insert(a,result);
end
return a
end
Es gibt ein LuaTable zurück. Der Code der danach entstanden ist, ist ziemlich ekelhaft. Deshalb bin ich zu den 1000 Aufrufen zurück gewechselt.
Aber es läuft mit diesem Ekelcode schneller, aber immer noch viel zu langsam. Je mehr Zeilen ausgeführt werden, desto langsamer. Scheint fast linear zu sein. Für 4 Zeilen 12s, für eine ~3s... mach ich was voll falsch?
Code: Alles auswählen
lua.DoString(@"
function bullet (result, time)
" + code + @"
end
function all()
a = {}
time = 0
steps = "+accuracy+@"
step = 10.0/steps
for i=0,steps-1 do
result = {x=0,y=0,a=0,s=1}
bullet(result, time)
table.insert(a,result);
time = time+step
end
return a
end
");
var scriptFunc = lua["all"] as LuaFunction;
var table = scriptFunc.Call()[0] as LuaTable;
Dictionary<object, object> dict = lua.GetTableDict(table);
int i = 0;
try
{
foreach (KeyValuePair<object, object> de in dict)
{
Console.WriteLine("{0} {1}", de.Key.ToString(), de.Value.ToString());
var r = rarr[i++];
Dictionary<object, object> tmp = lua.GetTableDict(de.Value as LuaTable);
object value;
tmp.TryGetValue("x", out value);
r.x = Double.Parse(value.ToString());
tmp.TryGetValue("y", out value);
r.y = Double.Parse(value.ToString());
tmp.TryGetValue("a", out value);
r.a = Double.Parse(value.ToString());
tmp.TryGetValue("s", out value);
r.s = Double.Parse(value.ToString());
}
}catch(Exception ex)
{
Debug.LogError(ex);
}
Code: Alles auswählen
result.x = 100*time+50
result.a = time
result.s = math.sin(time*6)
result.y = math.sin(time)*60
edit:
http://mathparser.org/ schaut vielversprechend aus
Re: [Projekt] Bulletmaker
Verfasst: 24.04.2020, 15:48
von Chromanoid
Sicher dass Du bei LUA die Auswertung/Kompilierung des Scripts nicht cachen kannst? Ich würde auf keinen Fall irgendwas dynamisch in CLR-Bytecode kompilieren oder überhaupt kompilieren. Sonst verstößt Du auch sicher gegen Apple-Richtlinien usw. falls das mal ansteht. Außerdem ist das vielleicht gar nicht überall möglich (AOT-Kompilierung und so). Einfach einen auswertbaren Ausdruck-Baum generieren - das kann man auch leicht selbst implementieren und ist kein Sicherheitsrisiko (außer DOS-Angriffe, aber da kann man dann auch leicht ein Limit gegen einbauen). Bei
http://mathparser.org/ stimme ich dir zu. Das sieht vielversprechend aus. Und besonders langsam sollte das auch nicht sein. Du musst halt darauf achten, dass Ausdrücke nur einmal geparst werden und nicht bei jedem Aufruf.
Ansonsten könntest Du auch über eine visuelle Sprache nachdenken, das könnte für manche leichter zu handlen sein. Keine Ahnung was da noch gehen soll :) Naja jedenfalls kann man die Graphen, die man da dann zusammen bastelt ja meistens auch direkt auswerten.
Re: [Projekt] Bulletmaker
Verfasst: 24.04.2020, 17:35
von marcgfx
Ja an eine Version nur mit Reglern hab ich auch schon gedacht, was für den Normalanwender :)
Aber mein Windows 7 hat sich grad verabschiedet befürchte ich... Update steckt bei 35% und will nicht mehr. So ein Müll, dachte da der Support eingestellt wird hätte ich endlich meine Ruhe.
edit: Glück gehabt, Windows lebt
Re: [Projekt] Bulletmaker
Verfasst: 24.04.2020, 20:59
von marcgfx
Regler, sooo viele Regler und es fehlen noch mehr Regler. Regelrecht eine Reglerdilemma.
Re: [Projekt] Bulletmaker
Verfasst: 24.04.2020, 23:10
von marcgfx
Als nächstes muss ich mir was gutes Überlegen für das UI. Weil die ganzen Regler kann ich keinem antun... evtl. gibts Rechtecke wo man einen Punkt drin verschieben kann, jede Ecke steht für einen bestimmten Regler, heisst gewisse kombination kann es nicht geben.