Dreikblack Posted November 4, 2024 Share Posted November 4, 2024 Code from https://www.ultraengine.com/learn/Entity_Staticize?lang=cpp Added fps counter to title, disabled VSync, fixed mover include Release mode 2500-2580 fps, hit space to make light static - 1700-1800 fps #include "UltraEngine.h" #include "Components/Motion/Mover.h" using namespace UltraEngine; int main(int argc, const char* argv[]) { //Plugin for texture loading auto plugin = LoadPlugin("Plugins/FITextureLoader"); //Get display auto displays = GetDisplays(); //Create window auto window = CreateWindow("Ultra Engine", 0, 0, 1280, 720, displays[0], WINDOW_TITLEBAR | WINDOW_CENTER); //Create framebuffer auto framebuffer = CreateFramebuffer(window); //Create world auto world = CreateWorld(); world->SetAmbientLight(0.1); world->RecordStats(true); //Create camera auto camera = CreateCamera(world); camera->SetClearColor(0.25); camera->SetPosition(0, 2, 0); camera->Move(0, 0, -5); //Build scene auto tunnel = LoadModel(world, "https://github.com/UltraEngine/Documentation/raw/master/Assets/Models/Underground/tunnel_t.glb"); tunnel->SetRotation(0, 180, 0); tunnel->Staticize(); auto cage = LoadModel(world, "https://github.com/UltraEngine/Documentation/raw/master/Assets/Models/Underground/fancage.glb"); cage->Staticize(); auto fan = LoadModel(world, "https://github.com/UltraEngine/Documentation/raw/master/Assets/Models/Underground/fanblades.glb"); fan->SetPosition(0, 2, 0); auto mover = fan->AddComponent<Mover>(); mover->rotationspeed.z = 300; auto light = CreatePointLight(world); light->SetColor(2, 2, 2); light->SetRange(10); light->SetPosition(0, 2, 2); light->SetColor(4.0); //Display text auto orthocam = CreateCamera(world, PROJECTION_ORTHOGRAPHIC); orthocam->SetClearMode(CLEAR_DEPTH); orthocam->SetRenderLayers(128); orthocam->SetPosition(float(framebuffer->size.x) * 0.5, float(framebuffer->size.y) * 0.5f); auto font = LoadFont("Fonts/arial.ttf"); auto text = CreateSprite(world, font, "Shadow polygons: 0", 14.0 * displays[0]->scale); text->SetPosition(2, framebuffer->size.y - 16.0f * displays[0]->scale); text->SetRenderLayers(128); auto text2 = CreateSprite(world, font, "Press space to make the light static.", 14.0 * displays[0]->scale); text2->SetPosition(2, framebuffer->size.y - 16.0f * 2.0f * displays[0]->scale); text2->SetRenderLayers(128); //Main loop while (!window->KeyHit(KEY_ESCAPE) and !window->Closed()) { world->Update(); world->Render(framebuffer, false); window->SetText("FPS: " + String(world->renderstats.framerate)); if (window->KeyHit(KEY_SPACE)) { light->Staticize(); text2->SetHidden(true); } text->SetText("Shadow polygons: " + String(world->renderstats.shadowpolygons)); } return 0; } Quote Link to comment Share on other sites More sharing options...
reepblue Posted November 4, 2024 Share Posted November 4, 2024 That's the exact opposite what it should be doing! 😭 Quote Cyclone - Ultra Game System - Component Preprocessor - Tex2TGA - Darkness Awaits Template (Leadwerks) If you like my work, consider supporting me on Patreon! Link to comment Share on other sites More sharing options...
Josh Posted November 4, 2024 Share Posted November 4, 2024 There are two opposing factors: Static lights don't have to render as much geometry when a shadow is updated, because they store a a shadow map for all the static objects. The static shadow map has to be copied to the dynamic shadow map at the start of the shadow update. In situations where you have a small amount of dynamic geometry and a large amount of static geometry, like a single character walking through a room made up of a lot of polygons, then a static light will perform faster because it only has to render the character to update the shadow. However, that texture copy does incur a cost, and it could be possible in some situations that cost would be greater than the savings you get by skipping the static geometry, even though fewer polygons are being drawn. I don't know if that is the case here. I will test this against 0.9.7 and check to see if they produce the same result. Quote My job is to make tools you love, with the features you want, and performance you can't live without. Link to comment Share on other sites More sharing options...
Dreikblack Posted December 23, 2024 Author Share Posted December 23, 2024 Tested 0.9.7: ~2800 fps initially ~2540 after making lights static I felt that something was wrong because i had no big difference before 0.9.8 in my game as well. Quote Link to comment Share on other sites More sharing options...
Josh Posted February 19 Share Posted February 19 Okay, so the cost of the static texture copy is greater than I expected. You can overall faster speed this way in some situations, but you have to be saving a lot of shadow polygons. Higher-resolution shadows are much more expensive to copy and will offset the savings you get from not rendering a lot of extra polygons. In this test I used a spotlight and created an extra 5,000,000 polys in the scene that don't have to be drawn in the shadow when it goes static. #include "UltraEngine.h" using namespace UltraEngine; int main(int argc, const char* argv[]) { //Get display auto displays = GetDisplays(); //Create window auto window = CreateWindow("Ultra Engine", 0, 0, 1280, 720, displays[0], WINDOW_TITLEBAR | WINDOW_CENTER); //Create framebuffer auto framebuffer = CreateFramebuffer(window); //Create world auto world = CreateWorld(); world->SetAmbientLight(0.1); world->RecordStats(true); //Create camera auto camera = CreateCamera(world); camera->SetClearColor(0.25); camera->SetPosition(0, 2, 0); camera->Move(0, 0, -5); camera->SetRenderLayers(1); //Build scene auto tunnel = LoadModel(world, "https://github.com/UltraEngine/Documentation/raw/master/Assets/Models/Underground/tunnel_t.glb"); tunnel->SetRotation(0, 180, 0); tunnel->Staticize(); auto cage = LoadModel(world, "https://github.com/UltraEngine/Documentation/raw/master/Assets/Models/Underground/fancage.glb"); cage->Staticize(); auto fan = LoadModel(world, "https://github.com/UltraEngine/Documentation/raw/master/Assets/Models/Underground/fanblades.glb"); fan->SetPosition(0, 2, 0); //auto light = CreatePointLight(world); auto light = CreateSpotLight(world); light->Turn(0, 180, 0); light->SetColor(2, 2, 2); light->SetRange(15); light->SetPosition(0, 2, 2); light->SetColor(2.0); light->SetRenderLayers(1 | 2); light->SetShadowmapSize(1024); std::vector<shared_ptr<Entity> > instances; instances.reserve(1000); auto base = CreateSphere(world); base->SetCollider(NULL); base->SetRenderLayers(2); for (int n = 0; n < instances.capacity(); ++n) { auto inst = base->Instantiate(world); inst->SetPosition(0, 0, -10); inst->Staticize(); inst->SetRenderLayers(2); instances.push_back(inst); } //Main loop while (!window->KeyHit(KEY_ESCAPE) and !window->Closed()) { if (window->KeyHit(KEY_SPACE)) { light->Staticize(); } world->Update(); world->Render(framebuffer, false); window->SetText("FPS: " + String(world->renderstats.framerate) + " Shadow polys: " + String(world->renderstats.shadowpolygons) + " Scene polys: " + String(world->renderstats.polygons)); fan->Turn(0, 0, 1); } return 0; } Quote My job is to make tools you love, with the features you want, and performance you can't live without. Link to comment Share on other sites More sharing options...
Josh Posted February 19 Share Posted February 19 You will also see an overall savings if the shadow resolution is low, like in this test. I did not create extra polygons, and just the simple scene runs faster with a static light when the shadow resolution is set to 256. #include "UltraEngine.h" using namespace UltraEngine; int main(int argc, const char* argv[]) { //Get display auto displays = GetDisplays(); //Create window auto window = CreateWindow("Ultra Engine", 0, 0, 1280, 720, displays[0], WINDOW_TITLEBAR | WINDOW_CENTER); //Create framebuffer auto framebuffer = CreateFramebuffer(window); //Create world auto world = CreateWorld(); world->SetAmbientLight(0.1); world->RecordStats(true); //Create camera auto camera = CreateCamera(world); camera->SetClearColor(0.25); camera->SetPosition(0, 2, 0); camera->Move(0, 0, -5); camera->SetRenderLayers(1); //Build scene auto tunnel = LoadModel(world, "https://github.com/UltraEngine/Documentation/raw/master/Assets/Models/Underground/tunnel_t.glb"); tunnel->SetRotation(0, 180, 0); tunnel->Staticize(); auto cage = LoadModel(world, "https://github.com/UltraEngine/Documentation/raw/master/Assets/Models/Underground/fancage.glb"); cage->Staticize(); auto fan = LoadModel(world, "https://github.com/UltraEngine/Documentation/raw/master/Assets/Models/Underground/fanblades.glb"); fan->SetPosition(0, 2, 0); //auto light = CreatePointLight(world); auto light = CreateSpotLight(world); light->Turn(0, 180, 0); light->SetColor(2, 2, 2); light->SetRange(15); light->SetPosition(0, 2, 2); light->SetColor(2.0); light->SetRenderLayers(1 | 2); light->SetShadowmapSize(256); //Main loop while (!window->KeyHit(KEY_ESCAPE) and !window->Closed()) { if (window->KeyHit(KEY_SPACE)) { light->Staticize(); } world->Update(); world->Render(framebuffer, false); window->SetText("FPS: " + String(world->renderstats.framerate) + " Shadow polys: " + String(world->renderstats.shadowpolygons) + " Scene polys: " + String(world->renderstats.polygons)); fan->Turn(0, 0, 1); } return 0; } Quote My job is to make tools you love, with the features you want, and performance you can't live without. Link to comment Share on other sites More sharing options...
Josh Posted February 19 Share Posted February 19 I also discovered that the default world shadow quality setting is making all shadows twice as high-res as they are defined to be, by default. This is certainly going to skew our results... Quote My job is to make tools you love, with the features you want, and performance you can't live without. Link to comment Share on other sites More sharing options...
Solution Josh Posted February 19 Solution Share Posted February 19 In the next build you will probably see a small increase with the default example. The savings gets a lot more when the scene is more complex. The primary issue is our shadow maps are too big. I fixed the default world setting and I am making the default size 512x512 for point, spot, and box lights, the same as it was in Leadwerks 4. Quote My job is to make tools you love, with the features you want, and performance you can't live without. Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.