Files
UnrealEngineUWP/Engine/Source/Editor/Cascade/Private/SCascadePreviewViewport.cpp
Olaf Piesche 57dfc6a74d Fix for UE-11697
With many particle emitters open, perf tanks. Cascade is ticking even if the editor tab is not visible/active, which can cause all sorts of performance issues. Cascade ticks through engine tick, so the only way to properly avoid this is to check for ticking of the viewport widget; added a flag to it to keep track of ticking in the last frame, then checking and clearing that in the Cascade tick function.

#codreview nick.atamas dave.ratti

[CL 2523454 by Olaf Piesche in Main branch]
2015-04-23 17:36:57 -04:00

92 lines
2.2 KiB
C++

// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
#include "CascadeModule.h"
#include "Cascade.h"
#include "PreviewScene.h"
#include "Runtime/Engine/Public/Slate/SceneViewport.h"
#include "CascadePreviewViewportClient.h"
#include "SCascadePreviewToolbar.h"
#include "SCascadePreviewViewport.h"
#include "SDockTab.h"
void SCascadePreviewViewport::Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime)
{
SEditorViewport::Tick(AllottedGeometry, InCurrentTime, InDeltaTime);
JustTicked = true;
}
SCascadePreviewViewport::~SCascadePreviewViewport()
{
if (ViewportClient.IsValid())
{
ViewportClient->Viewport = NULL;
}
}
void SCascadePreviewViewport::Construct(const FArguments& InArgs)
{
CascadePtr = InArgs._Cascade;
SEditorViewport::Construct( SEditorViewport::FArguments() );
}
void SCascadePreviewViewport::RefreshViewport()
{
SceneViewport->Invalidate();
}
bool SCascadePreviewViewport::IsVisible() const
{
return ViewportWidget.IsValid() && (!ParentTab.IsValid() || ParentTab.Pin()->IsForeground());
}
TSharedPtr<FSceneViewport> SCascadePreviewViewport::GetViewport() const
{
return SceneViewport;
}
TSharedPtr<FCascadeEdPreviewViewportClient> SCascadePreviewViewport::GetViewportClient() const
{
return ViewportClient;
}
TSharedPtr<SViewport> SCascadePreviewViewport::GetViewportWidget() const
{
return ViewportWidget;
}
TSharedRef<FEditorViewportClient> SCascadePreviewViewport::MakeEditorViewportClient()
{
ViewportClient = MakeShareable(new FCascadeEdPreviewViewportClient(CascadePtr, SharedThis(this)));
ViewportClient->bSetListenerPosition = false;
ViewportClient->SetRealtime(true);
ViewportClient->VisibilityDelegate.BindSP(this, &SCascadePreviewViewport::IsVisible);
return ViewportClient.ToSharedRef();
}
TSharedPtr<SWidget> SCascadePreviewViewport::MakeViewportToolbar()
{
return
SNew(SCascadePreviewViewportToolBar)
.CascadePtr(CascadePtr)
.IsEnabled(FSlateApplication::Get().GetNormalExecutionAttribute());
}
void SCascadePreviewViewport::OnFocusViewportToSelection()
{
UParticleSystemComponent* Component = CascadePtr.Pin()->GetParticleSystemComponent();
if( Component )
{
ViewportClient->FocusViewportOnBox( Component->Bounds.GetBox() );
}
}