Beiträge von hellobomm

    Tomarr
    - Wenn der Rendervorgang unabhängig von den Berechnungen läuft, und ich wie besagt 600 Rechendurchgänge pro Sekunde schaffe, wie oft erfolgt dann das Rendern pro Sekunde? Kann ich das einstellen (idealerweise 60 mal pro Sekunde).
    - In einem anderen Forum hab ich eine andere Aussage gefunden: "while the game logic and the renderer execute on a separate thread they do not operate at independent frame rates. Every render frame corresponds directly to a game logic frame". Und das ist mein Problem
    - Das Projekt ist nicht sehr merkwürdig :) Ich sende nur wichtige Daten an die Maschine, nämlich so oft wie möglich pro Sekunde ob eine Kollision droht oder nicht.




    Phoenix-100
    - hui das ist natürlich schon was Ausgewachsenes: die Framerate auf 60fps stellen und die komplette Simulation schneller ticken. Das betrifft nicht nur actors sondern auch den level blueprint. Ich glaub das wird mir zu steil ....
    Aber ich überleg mal in die Richtung!



    Dankeschön!!

    Nein nein Leute. Vielleicht hab ich mich da falsch ausgedrückt. Sorry.
    Also: In meinem Programm bewege ich ein CAD Modell einer Maschine synchron zu einer baugleichen wirklichen Maschine. Die Aufgabe ist es nun so oft wie möglich pro Sekunde zu überprüfen ob eine Kollision droht um dann die reale Maschine vor eine Kollision zu schützen.

    Mein Programm schafft es 1500 mal pro Sekunde zu prüfen ob eine Kollision droht oder nicht und schickt die Info an die reale Maschine. Droht eine Kollision, schaltet sich die Maschine ab. Diese 1500 Rechendurchgänge pro Sekunde schaffe ich, wenn ich das Rendern ausschalte. Wenn ich das Rendern einschalte, dann schaffe ich nur noch 600 Rechendurchgänge pro Sekunde. Das liegt daran, dass Unreal pro Rechendurchgang einmal die Grafik rendert. Der Rechendurchgang muss warten bis gerendert wurde und das bremst das Programm eben auf 600 Rechendurchgänge pro Sekunde runter.
    Mein Gedanke ist nun das Rendern unabhängig vom Rechendurchgang zu machen. Das Programm soll so oft wie möglich pro Sekunde auf Kollisionen testen aber nur 60 mal pro Sekunde rendern.

    Hi, ok ich erklär das mal.

    Ich habe eine Simulation programmiert, die so oft wie möglich pro Sekunde ihre Rechenergebnisse an ein anderes Programm schicken soll. Wenn ich das Rendern ausschalte schafft sie das etwa 1500 mal pro Sekunde. Der User soll aber noch sehen was in der Simulation grundsätzlich passiert also muss ich das Rendern einschalten. Wenn ich das mache, dann sinkt diese Rate auf 600 pro Sekunde ab. Ein Rechendurchgang (also ein tick) ist dann ein Frame. Die Grafikkarte schickt dann das Bild 600 mal pro Sekunde an den Bildschirm.
    Mein Gedanke ist nun einfach nicht jeden tick zu Rendern (nur mit 60fps). Dann besteht die Hoffnung dass die Simulation wieder schneller wird.


    Danke schon mal!!

    Hallo Leute,

    für eine Simulation muss mein gameloop so schnell wie möglich sein. Ich will das Ergebnis aber nur mit 60fps rendern.

    Momentan schaffe ich 600 ticks pro Sekunde was aber dann auch heisst, dass 600 mal pro Sekunde gerendert wird.
    Mein Gedanke ist nun, dass ich wohl mehr ticks pro Sekunde im gameloop schaffe, wenn das Rendern nur mit 60fps erfolgt.


    Hat irgendwer eine Idee wie ich das hinbekomme?


    Viele Grüße :*

    Alex

    Habs gerade gelöst. Hier der komplette code:

    Code
    UBodySetup* OldBodySetup = MyOldStaticMeshActor->GetStaticMeshComponent()->GetBodySetup();  
    FKAggregateGeom OldAggregateGeom = OldBodySetup->AggGeom;   
    UBodySetup* NewBodySetup = MyNewStaticMeshActor->GetStaticMeshComponent()->GetBodySetup();   
    NewBodySetup->AddCollisionFrom(OldAggregateGeom); 
    NewBodySetup->InvalidatePhysicsData(); 
    NewBodySetup->CreatePhysicsMeshes();

    Hi Butter Fly Games. Danke!!

    Aber wie mach ich das in c++ oder blueprint?
    Ich habe ein EditorUtilityWidget mit dem ich Editor Sachen ausführen kann aber das "Copy Collision from selected Static Mesh" hab ich nicht gefunden.


    Mittlerweile hab ich rausgefunden dass ich mit der Methode:

    UBodySetup* OldBodySetup = MyOldStaticMeshActor->GetStaticMeshComponent()->GetBodySetup();

    FKAggregateGeom OldAggregateGeom = OldBodySetup->AggGeom;

    MyNewStaticMeshActor->GetStaticMeshComponent()->GetBodySetup()->AddCollisionFrom(OldAggregateGeom);


    Nur simple collisions copieren kann. Keine Convex Decomposition Collision Meshes, die ich brauche.

    Hallo beisammen,


    weiß jemand wie man ein Convex Decomposition Collision Mesh von einem StaticMesh (oder StaticMeshActor) in ein anderes kopieren kann?

    Ich habe gelesen dass man dazu das FKAggregateGeom verwendet das sich im BodySetup befindet.
    Also so:



    UBodySetup* OldBodySetup = MyOldStaticMeshActor->GetStaticMeshComponent()->GetBodySetup();

    FKAggregateGeom OldAggregateGeom = OldBodySetup->AggGeom;


    MyNewStaticMeshActor->GetStaticMeshComponent()->GetBodySetup()->AddCollisionFrom(OldAggregateGeom);



    Das funktioniert gut für simple collision aber bei convex decomposition meshes tritt ein komisches Phänomen auf:

    Wenn ich das "Empfänger Mesh" (MyNewStaticMeshActor) dann im editor öffne, sehe ich in der collision Spalte dass da in der Tat 10 neue convex elements aufgelistet werden. Also hat der copy Prozess geklappt ABER die collision meshes werden nicht angezeigt und funktionieren auch nicht (Bild 1)

    So aber hier kommt das Seltsame: Sobald ich irgend eine Änderung mit in der collision Spalte rechts mache (also z.B. einfach "Double Sided Geometry" anklicke werden die collision meshes plötzlich angezeigt und funktionieren! (Bild 2).

    Es scheint also dass man beim Anklicken irgendwas "refresht".
    Hat jemand von euch einen Tip was im Code noch fehlt (das refreshen?) ????


    Danke!!!

    Alex

    Ich habe einen "Hydraulikzylinder" gebaut und dazu zwei Rohre mit einem physics constraint actor verbunden. Nur die Linearbewegung in Zylinderrichtung ist zugelassen.
    Das funzt alles recht gut.

    Den Hydraulkzylinder bewege ich im game frei herum und ich möchte dabei den Ort und die Rotation des phyics constraint actors wissen.
    Das ist wichtig weil ich den Richtung der freigegebenen Bewegung wissen will (die sich ja immer ändert).


    Wenn ich aber Ort und Rotation des phyics constraint actors abfrage, merke ich das sich diese überhaupt nicht ändert. Es kommt immer die Ausgangslage zurück!?!?!??!


    Bin ich doof oder ändert der physics constraint actor während des Spiels seinen Ort und seine Rotation nicht???? *dead*



    Beste Grüße,

    hellobomm

    Vielleicht passt das zum Thema:


    Ich versuche ein CAD Modell das in Creo erzeugt wurde in UE4 zu importieren. Das funzt mit Datasmith sehr gut.

    Aber: die constraints werden nicht importiert. Das CAD Modell hat Gelenke (also constraints wie Kugelgelenk, Scharnier) mit denen man Bewegungen am Bildschirm nachstellen kann.


    Weiß wer wie man ein CAD Modell mit Gelenken in UE4 importiert????

    Thaaanx, Alex

    Der code ist schon ein paar Jahre alt und war ein eigenständiges c++ Programm, geschrieben in Visual Studio. Es wurden dort 8 threads gestartet die mit Höllenspeed Berechnungen machen. Jetzt habe ich den code in ein Unrealprojekt eingebunden. Visual Studio compiliert nun mit den Unreal Einstellungen und seit dem ist jeder der 8 threads um Faktor 10 langsamer.
    Auffallend ist halt dass der Geschwindigkeitsunterschied recht genau dem entspricht den ich damals im alten Programm hatte zwischen "Debug" und "Release". Wenn ich die beiden vergleiche (siehe oben) dann sehe ich, dass bei "Release" maximum Optimization (speed) eingestellt ist.
    Diese Einstellung gibt es in der Unreal config nicht.

    Hi kyodai,
    Unreal gibt die Configurations schon vor.
    Da gibts: DebugGameEditor, DebugGame, Shipping usw.


    Wenn ich die öffne dann kann ich nicht sehr viel auswählen. Schau mal den screenshot.

    Links ist die Configauswahl des Unreal-Projekts (total wenig)
    Rechts die ohne Unreal. Dort kann ich einstellen, dass der code maximal optimiert wird.


    Mag sein dass Shipping dann besser funktioniert. Das hab ich noch nicht ausprobiert (ich bekomme da noch Fehler).

    Hi,


    ich integriere grad Teile meines alten Programms in ein Unrealprojekt und bemerke, dass der compilierte code dieser alten Teile um den Faktor 10 langsamer abläuft als früher. Eigentlich greift Unreal da gar nicht ein weil die alten Teile in einem ausgelagerten thread dahinlaufen.
    Ich kann mir das also nur so erklären dass es an der Art liegt wie compiliert wird.
    Damals, ohne Unreal hatte ich in Visual Studio die Einstellungen "Debug" und "Release". Der mir Release compilierte code lief dabei um Faktor 10 schneller als der mit Debug compilierte code.
    Und jetzt läuft der gleiche code, egal was ich im Visual Studio jetzt einstelle, immer so langsam wie früher der mit Debug compilierte code. 8|

    Könnt ihr mir da helfen?


    Dankeschön!!

    Das wäre super, freezernick!

    Also ich erzeuge im Editor mit Modes->Landscape die Landschaft. Zum Beispiel eine mit 8129x8129 pixeln

    In c++ suche ich danach:


    TArray<AActor*> lands;

    UGameplayStatics::GetAllActorsOfClass(UeWorld, ALandscape::StaticClass(), lands);

    ALandscape* landscape = Cast<ALandscape>(lands[0]);

    UTexture2D* MyTexture2D = landscape->LandscapeComponents[0]->GetHeightmap();


    Und dann ginge es weiter mit dem link den du empfohlen hast:


    TextureCompressionSettings OldCompressionSettings = MyTexture2D->CompressionSettings;

    TextureMipGenSettings OldMipGenSettings = MyTexture2D->MipGenSettings;

    usw.



    Das MyTexture2D das da ausgelesen wird ist maximal 512x512 groß.
    Aber wie du gesagt hast, es ist nicht die Originalgröße.

    Sogar nach der Programmzeile:
    MyTexture2D->UpdateResource();


    Dort werden zwar die MipMaps eliminiert aber die Texturegröße bleibt bei 512x512

    Vielleicht findest du was raus :)

    Hm, was ich benötige ist jeden Vertex der Landschaft (also seine x,y und z Koordinate). Damit baue ich in einer anderen Physikengine (Bullet) ein Terrain.

    Also benötige ich nach dem Bau der Landschaft alle Vertices. Später dann nicht mehr, richtig.

    Ich glaube der Ansatz von freezernick ist schon richtig. Denn wenn ich die MipMaps der Landschaft anschau dann gehen die nur bis maximaler Auflösung von 512x512.


    Ich brauch daher die Originaltextur.

    Hi freezernick,

    danke schon mal für die schnelle Antwort :)

    Mein code sieht dann so aus (Anhang):


    als size_x kommt aber wieder 512 (anstatt 8129)...

    Stimmt die Zeile 221 in der ich die Heightmap aus der ersten LandscapeComponent fische?

    Die Originalwerte in Zeile

    222 OldCompressionSettings = TC_Default(0)
    223 OldMipGenSettings = TMGS_LeaveExistingMips(14)
    224 OldSRGB = false



    Vielleicht magst nochmal drüberschaun. Danke schon mal.

    Hallo Leute, ich bin neu hier :bye:


    Ich bin hier etwas am Verzweifeln bezüglich des Auslesens der heightmap einer Landschaft.



    TInlineComponentArray<ULandscapeComponent*> components;

    landscape->GetComponents<ULandscapeComponent>(components);



    for (auto i = components.CreateIterator(); i; i++)

    {

    FTextureSource& hmap_texture = (*i)->GetHeightmap()->Source;

    check(hmap_texture.IsValid());


    int32 hmap_size_x = hmap_texture.GetSizeX();

    int32 hmap_size_y = hmap_texture.GetSizeY();

    }



    hmap_size_x und hmap_size_y sind nur jeweils 512.


    Das heißt die heightmapgröße ist nur 512x512 obwohl die Landschaft viel größer ist (8129x8129).
    Dementsprechend kann ich nicht auf alle Vertices der Landschaft zugreifen.

    Was mach ich denn hier falsch??

    Bilder

    • pasted-from-clipboard.png