Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

easy_profiler integration #1531

Merged
merged 8 commits into from Jun 29, 2017
Merged

easy_profiler integration #1531

merged 8 commits into from Jun 29, 2017

Conversation

rokups
Copy link
Collaborator

@rokups rokups commented Apr 28, 2017

This PR integrates easy_profiler replacing old and not really useful on-screen profiler.

Features:

  • Profiling data is cached and sent over network (easy mobile device and application startup profiling)
  • Profiling data can be saved to file and loaded later
  • Profiler recognizes different threads
  • Options for changing profiled block color (displayed in profiler tool). Events are orange, resource loading is blue
  • Profiler tool is using Qt5. On systems where Qt is not available cmake will display warning but engine will still build
  • C# support, requires projects to define ATOMIC_PROFILING.
  • Profiler is enabled automatically for debug builds
  • Command line parameters to set profiler port and enable/disable application listening for profiler connections

In the future easy_profiler maintainers plan support for dx11/12, opengl, vulkan and cuda profiling. Maintainers were very helpful and implemented non-scoped profiler blocks on my request. Tracking arbitrary values (my request as well) is already in the works, this will be useful for tracking c#/js object counts and what not.

I found a way to do reasonably low-overhead c# code block profiling using lambda. There is still a chance to optimize a little by defining custom bindings to Profiler::BeginBlock() which takes const char* as parameter. It looks like this:

Profiler.Block("BlockName", () => {
    // Code here
});

I did not add js support, however it is trivial. Is there a spot somewhere we could add some extra code for typescript to use much like Script/AtomicNET/AtomicNET/Core/Profiler.cs? In js it would look like so:

Profiler.block("BlockName", function() {
    // Code here
});

Can we set engineParameters_ from c#/js applications? If we can - how? We need this in order to make listening for profiler connections opt-in instead of opt-out.

TODO:

  • js support
  • Add ATOMIC_PROFILING to debug configurations of C# projects
  • Make profiler not listen by default
  • Add manual optimized bindings for Profiler::BeginBlock()

Please review.

@JoshEngebretson
Copy link
Contributor

Great, thanks 👍, I'll give this a whirl later today once I can get back to macOS

@JoshEngebretson
Copy link
Contributor

JoshEngebretson commented May 16, 2017

Great work! It is a lot more stable on macOS and the UI seems to be working other than the thread ID's which are still not quite being calculated properly. I did try and disconnect and then reconnect and the Qt profiler app hangs on macOS when doing this... can you disconnect/reconnect for you?

EDIT: Force quitting the Profiler application and restarting it and I could reconnect to the player app and start capturing again, so is Profiler app specific

EDIT 2: I get this crash quite a bit, seem to be able to trigger it with right click select of the timespan, though also believe I got it once when Profiler app was in background process:

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   Profiler                      	0x0000000103ba02dc EasyGraphicsView::onIdleTimeout() + 14828 (blocks_graphics_view.cpp:1635)
1   Profiler                      	0x0000000103bb20da QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (EasyGraphicsView::*)()>::call(void (EasyGraphicsView::*)(), EasyGraphicsView*, void**) + 122 (qobjectdefs_impl.h:143)
2   Profiler                      	0x0000000103bb2030 void QtPrivate::FunctionPointer<void (EasyGraphicsView::*)()>::call<QtPrivate::List<>, void>(void (EasyGraphicsView::*)(), EasyGraphicsView*, void**) + 80 (qobjectdefs_impl.h:163)
3   Profiler                      	0x0000000103bb1f56 QtPrivate::QSlotObject<void (EasyGraphicsView::*)(), QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) + 166 (qobject_impl.h:121)
4   org.qt-project.QtCore         	0x0000000104ada22b QMetaObject::activate(QObject*, int, int, void**) + 731
5   org.qt-project.QtCore         	0x0000000104ad3320 QObject::event(QEvent*) + 48
6   org.qt-project.QtWidgets      	0x0000000103e1a58d QApplicationPrivate::notify_helper(QObject*, QEvent*) + 269
7   org.qt-project.QtWidgets      	0x0000000103e1ced2 QApplication::notify(QObject*, QEvent*) + 5906
8   org.qt-project.QtCore         	0x0000000104aa9544 QCoreApplication::notifyInternal2(QObject*, QEvent*) + 164
9   org.qt-project.QtCore         	0x0000000104afe9d6 QTimerInfoList::activateTimers() + 1142
10  libqcocoa.dylib               	0x00000001078deae2 QCocoaEventDispatcherPrivate::activateTimersSourceCallback(void*) + 18

screen shot 2017-05-16 at 12 06 08 pm

@JoshEngebretson
Copy link
Contributor

I was able to profile on Android (awesome! 🚀 ) and the thread id's appear to be the same number:

screen shot 2017-05-16 at 12 35 03 pm

@rokups
Copy link
Collaborator Author

rokups commented Jun 6, 2017

@JoshEngebretson easy_profiler maintainers did some work on networking and threading. Our changes were upstreamed as well. I rebased this branch on to master, cleaned it up, updated easy_profiler, fixed crash with event profiling (its a bit dirty, but works great). I squashed all commits as they were more wandering in the woods than meaningful work.. Squashing ate your changes, but rest assured your mark in history of humanity was presedved :)

Please test profiler tool on MacOS. I commented out that socket.listen() loop for now and i hope it will work without said loop and i can clean it up from commit history altogether.

@JoshEngebretson
Copy link
Contributor

@rokups Awesome sauce! Thanks, and will test and review as soon as possible 👍

@cas4ey
Copy link

cas4ey commented Jun 11, 2017

@JoshEngebretson Hello! I'm collaborator of easy_profiler. I saw you had a crash in GUI. Does the problem still exist? If yes, could you, please, send me .prof file with which you had the problem?

@JoshEngebretson
Copy link
Contributor

JoshEngebretson commented Jun 11, 2017

Hello @cas4ey , thanks for your excellent work on easy_profiler! I have not reproduced any crashes in recent testing of the profiler branch, will let you know if I do 👍

easyprofiler

@rokups
Copy link
Collaborator Author

rokups commented Jun 12, 2017

@JoshEngebretson i updated to latest profiler code and rebased on to engine master. Connection log spam is no longer there and it seems network quirks are fixed. Please test how it fares on MacOS.

Also please point me to some example of manual binding example for c# and to some example how to add extra code for js. I would like to try adding something like AtomicNET/Core/Profiler.cs
to javascript.

@JoshEngebretson
Copy link
Contributor

JoshEngebretson commented Jun 12, 2017

Awesome, I'll be able to test this later today. I'll also provide some guidance for C#/JS 🐫

Edit: Looks like there are some include path issues with the profiler on Windows/macOS according to the logs, note CI builds in release

@rokups
Copy link
Collaborator Author

rokups commented Jun 13, 2017

Something weird is going on here and i cant figure it out. Could you please take a look? Search build log for -- Library type: SHARED (easy profiler library type). Due to this it should be STATIC. This variable is created here, but according to cmake docs it only creates CACHE variable if it is missing. Otherwise value is left intact. I confirmed it testing on my machine. Something odd is going on here. I also had to add this workaround for mac build because it didnt work with CXX_STANDARD 11 even though cmake version is high enough to support it. If you got any ideas whats going on here i am all ears.

@JoshEngebretson
Copy link
Contributor

I am not sure on the CMake workaround, 3.1.2 is what is on build box. If we're modifying the stock easy_profiler CMake, please mark with // ATOMIC BEGIN and // ATOMIC END block with a note about modification, this helps when updating and also removing changes when they are no longer necessary.

I'll have a look at the build when I get a chance here, won't be too long ;) Great work!

@JoshEngebretson
Copy link
Contributor

@AtomicBuildBot retest this please

1 similar comment
@rokups
Copy link
Collaborator Author

rokups commented Jun 14, 2017

@AtomicBuildBot retest this please

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/bin)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These output overrides cause an error when building for multiple platforms as each platform's binaries will be in the same location, in the source instead of build tree:

%ATOMIC_ROOT%/Source/ThirdParty/easy_profiler/easy_profiler_core/Release

instead of for example:

%ATOMIC_ROOT%/Artifacts/Build/Mac/Source/ThirdParty/easy_profiler/easy_profiler_core/Release
%ATOMIC_ROOT%/Artifacts/Build/IOS/Source/ThirdParty/easy_profiler/easy_profiler_core/Release
%ATOMIC_ROOT%/Artifacts/Build/Android/Source/ThirdParty/easy_profiler/easy_profiler_core/Release

Disabling these output directory overrides, and ./Build_AtomicEditor.sh --with-android --with-ios works. I think this is a fine solution, though should put // ATOMIC BLOCKS and a description of why disabled. This isn't standard CMake for a third party library and should probably be addressed upstream.

@rokups
Copy link
Collaborator Author

rokups commented Jun 15, 2017

Finally it builds \o/ @JoshEngebretson thank you very much for spotting that easy_profiler cmake quirk. Fresh set of eyeballs are a great thing o/ I will try to upstream that change as well.

@rokups
Copy link
Collaborator Author

rokups commented Jun 15, 2017

I am afraid at least on windows profiler deployment is complicated.

profiler_gui can not build if engine links to static runtime because prebuilt Qt libraries link to dynamic msvc runtime. profiler_gui links to easy_profiler lib here, and lib inherits static runtime from the engine.

We can build profiler_gui with -DATOMIC_DYNAMIC_RUNTIME=1, however then editor and few other targets fail to build because CEF links to static runtime.

We have to do one of the following on windows:

  • Build Qt linking to static msvc runtime.
  • Build CEF linking to dynamic msvc runtime.
  • Generate -DATOMIC_DYNAMIC_RUNTIME=0 and build engine without providing it access to Qt. Generate build with -DATOMIC_DYNAMIC_RUNTIME=1 and build profiler_gui only. Copy profiler tool with Qt dlls to static build directory for distribution.

add_subdirectory(profiler_gui)
# ATOMIC BEGIN
if (MSVC AND "${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
message(STATUS "Profiler GUI can only be built in Release builds with MSVC compiler.")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this cause the easy profiler cmake to look for debug Qt libs? If so, maybe can be configured to use Release Qt libs regardless in easy profiler scripts? If not, or another reason, lemme know. I think this is acceptable, though would be good to have Profiler client available in debug builds, which could also be sorted later.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do not think it is possible to kick certain targets into "Release" build when everything else is building as "Debug". But maybe we could just remove -DDEBUG=1 (which is implicit) and use /MD and have release build within debug build. That that might work, i will try.

@@ -143,6 +143,8 @@ else ()
endif ()
endif ()

# ATOMIC BEGIN
if (0)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch on the install stuff

if (MSVC)
add_library(easy_profiler_md ${EASY_OPTION_LIB_TYPE} ${SOURCES} resources.rc)
foreach(prop COMPILE_DEFINITIONS COMPILE_OPTIONS CXX_STANDARD CXX_STANDARD_REQUIRED INCLUDE_DIRECTORIES INTERFACE_COMPILE_DEFINITIONS INTERFACE_COMPILE_OPTIONS INTERFACE_INCLUDE_DIRECTORIES INTERFACE_LINK_LIBRARIES)
get_target_property(val easy_profiler ${prop})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fancy footwork, the cmake is strong with this one! 🐫

# ATOMIC BEGIN
target_link_libraries(profiler_gui Qt5::Widgets)
if (TARGET easy_profiler_md)
target_compile_options(profiler_gui PRIVATE /MD)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very nice and clean 👍

@rokups
Copy link
Collaborator Author

rokups commented Jun 22, 2017

Again sorry for taking forever. Real life and summer caught up to me.

Sometimes i can be idiot of epic proportions. I completely forgot the fact that Qt ships both release and debug builds of their libraries. Forcing a release (/MD) build in otherwise debug build of engine was causing issues and completely unnecessary. Once i realized this it was easy to have it build debug version of profiler that links to dynamic msvc runtime just like rest of Qt. It all works perfectly. I also rebased branch on latest master.

To deploy profiler dlls on windows we are supposed to run this: C:\Qt\5.9\msvc2017_64\bin\windeployqt.exe --no-angle --no-opengl-sw --no-translations C:\Atomic-easy_profiler\AtomicGameEngine\Artifacts\Build\Profiler\Release\Profiler.exe. It dumps minimal required Qt libraries into directory where Profiler.exe is located.

@JoshEngebretson please give it a spin on MacOS and let me know if something is still missing or if is it complete now.

#1566 makes Add manual optimized bindings for Profiler::BeginBlock() goal obsolete so i am crossing it out.

Also please point me to some example how to add extra code for js. I would like to try adding something like AtomicNET/Core/Profiler.cs
to javascript.

If profiling on MacOS works as expected and when i add this js bit i think this PR will be complete.

@JoshEngebretson
Copy link
Contributor

@rokups Absolutely zero worries man, this is a mega-feature! 😎

I am really swamped here today, will test at first opportunity. That's good news on the Windows side of things, thanks for R&D'ing it

Also, I haven't forgotten #1566. I'll look into whipping up a quick hand binding example for the profiler if that gets hairy (or for the meantime).

@HeadClot
Copy link

This is insane. Just saw the Repo for easy profiler. Super happy to see this in AGE :)

@Type1J
Copy link
Collaborator

Type1J commented Jun 23, 2017

@rokups This is great! Good job!

@rokups
Copy link
Collaborator Author

rokups commented Jun 23, 2017

Thanks for applauds guys :) 👏

@JoshEngebretson optimized c# bindings are working. One more piece of the puzzle is that generated c# projects do not have ATOMIC_PROFILING defined. It should be defined at least in debug builds and it is ok if it is defined even if engine is built without ATOMIC_PROFILING. I can not find where i should change that. Halp 🆘

@@ -12,12 +13,16 @@ public partial class Profiler : AObject
{
#if ATOMIC_PROFILING
var profiler = AtomicNET.GetSubsystem<Profiler>();
profiler?.BeginBlock(name, file, line, color, (byte)status);
if (profiler != null)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't need AtomicNET here, AObject has GetSubsystem on it, the static AtomicNET flavor is only for getting a subsystem outside of a AObject derived instance. Also, it might be good to locally cache so doesn't look up per block.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't need AtomicNET here, AObject has GetSubsystem on it

👍

locally cache

You mean Profiler.Block() should not be static so that caller gets Profiler and reuses that reference?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I mean so don't need to call GetSubsystem per block, which is not a terribly expensive call, though still, if that gets ugly that's fine, can cross bridge if it is an issue 🐫

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BTW, will this be the first C# code profiled with easy_profiler @cas4ey?, awesome work again @rokups 🥇

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This caching of subsystem pointers seem to comes up rather often. Maybe it would be better idea for next PR to cache engine subsystems as weak pointers in Context?

@@ -750,7 +751,15 @@ namespace Atomic
}
#endif

#if ATOMIC_PROFILING
ATOMIC_EXPORT_API void csi_Atomic_Profiler_BeginBlock(Profiler* profiler, const char* name, const char* file, int line, unsigned int argb, unsigned char status)
{
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's make sure the csi_Atomic_Profiler_BeginBlock is available in the shared library, whether profiling is enabled or not... will avoid missing symbols. Can ifdef the profiler usage, also could add a one time log warning (controlled by a local static bool), which warns if called without profiling support in binary

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will do

@JoshEngebretson
Copy link
Contributor

The C# solution generator has support for adding constants, though not for debug vs release I don't think right now, example:

"defineConstants" : ["ATOMIC_DESKTOP"],

Would be a pretty easy add for supporting debug/release specific flags:

pgroup.CreateChild("DefineConstants").SetValue(String::Joined(constants, ";").CString());

@@ -12,7 +12,7 @@ public partial class Profiler : AObject
[CallerLineNumber] int line = 0)
{
#if ATOMIC_PROFILING
var profiler = GetSubsystem<Profiler>();
var profiler = AtomicNET.Context.GetProfiler();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When it is right, it is right, very 🐫 !

brucelee

@rokups
Copy link
Collaborator Author

rokups commented Jun 28, 2017

@JoshEngebretson i cleaned up commit history, now it is in a state to be merged. Updated easy_profiler to latest code on their develop branch too and all custom modifications are marked with atomic comments. The last bit missing is bit for js profiling.

Copy link
Contributor

@JoshEngebretson JoshEngebretson left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very impressive work @rokups!!! I think we can get this landed in short order, I went through and did a final review with some comments. Let me know what you think, it is close, really close... a joy to review, A+ 😄

setup_target()
if (ARG_TOOL)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice add and good standardization for tool bins 👍

{
#if ATOMIC_PROFILING
var profiler = AtomicNET.Context.GetProfiler();
if (profiler != null)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Still buzzing on new Context getters, great work there, it did make a Context.Profiler property too, right ;)

@@ -23,6 +23,7 @@
"name": "AtomicNET",
"atomicNET" : true,
"outputType" : "Library",
"defineConstants" : ["ATOMIC_PROFILING"],
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it is ok to define ATOMIC_PROFILING by default for now, we're going to want to be able to define difference constants per build, though that is for another day.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

People would be profiling a release build anyhow, this flag missing on release builds would certainly cause some confusion.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I mean the equivalent of ${ATOMIC_RELEASE_OFF}, for release builds the ATOMIC_PROFILING define should default off in C#, no need to worry about it now.

@@ -32,6 +32,7 @@ elseif (ATOMIC_DATABASE_ODBC)
endif ()

if (WIN32)
option (ATOMIC_D3D11 "Use DirectX 11" ON)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We're not quuuuite ready to switch the D3D11 switch on by default, is this doing that?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure how that happened, will fix ;)

target_compile_options(Atomic PUBLIC "$<$<CONFIG:Release>:${ATOMIC_MSVC_RUNTIME}>")
target_compile_options(Atomic PUBLIC "$<$<CONFIG:RelWithDebInfo>:${ATOMIC_MSVC_RUNTIME}>")
target_compile_options(Atomic PUBLIC "$<$<CONFIG:MinSizeRel>:${ATOMIC_MSVC_RUNTIME}>")
target_compile_options(Atomic PUBLIC $<$<CONFIG:Debug>:${ATOMIC_MSVC_RUNTIME}d> $<$<NOT:$<CONFIG:Debug>>:${ATOMIC_MSVC_RUNTIME}>)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sometimes CMake makes my eyes cross, nice work

@@ -43,20 +43,24 @@ const StringHash StringHash::ZERO;
StringHash::StringHash(const char* str) :
value_(Calculate(str))
{
#if ATOMIC_PROFILING
RegisterSignificantString(str, *this);
#endif
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the reason for registering all StringHash strings as being significant with profiling enabled?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need this for being able to recognize event names. Events as you know are sent using StringHash, but profiler needs actual strings for data to be useful. See here.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, this is definitely an area to keep an eye on, and maybe for future improvement. It registers every time a string is converted to a StringHash, ouch... I know this is the only way right now, hopefully this doesn't come up on the top of the profiler ;)

It it does, maybe we can introduce a separate ATOMIC_PROFILING_EVENTS for enabling event profiling...

}

StringHash::StringHash(const String& str) :
value_(Calculate(str.CString()))
{
#if ATOMIC_PROFILING
RegisterSignificantString(str, *this);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This one too, just noting...

@@ -264,20 +264,12 @@ void BackgroundLoader::FinishBackgroundLoading(BackgroundLoadItem& item)
// If BeginLoad() phase was successful, call EndLoad() and get the final success/failure result
if (success)
{
#ifdef ATOMIC_PROFILING
#if ATOMIC_PROFILING
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On these profiling changes, I don't think we need to pepper ATOMIC modification blocks everywhere, we've diverged... next update, I guess see what run into and maybe adjust, though think modification blocks would just add noise in these cases

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was reason why i did not add these comments elsewhere. We know that profiler subsystem was replaced therefore profiler changes should be ignored when merging from upstream. I am adding them to requested spots anyhow ;) Maybe we can find a way for got to help us do merges and make these comments thing of the past. I plan to look into it next ;)

#ifdef ATOMIC_PROFILING
if (profiler)
profiler->EndBlock();
#endif
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Another sign of code improvement, not needing to explicitly EndBlock, winning! 🏅

@@ -8,6 +8,7 @@ option(ATOMIC_EDITOR "Build Editor" ON)
option(ATOMIC_DATABASE_SQLITE "Enable SQLite database subsystem" OFF)
option(ATOMIC_DATABASE_ODBC "Enable ODBC database subsystem" OFF)
option(ATOMIC_IK "Enable inverse kinematics subsystem" OFF)
option(ATOMIC_PROFILING "Enable profiler" ${ATOMIC_RELEASE_OFF})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

${ATOMIC_RELEASE_OFF} is very cool!

@rokups
Copy link
Collaborator Author

rokups commented Jun 28, 2017

@JoshEngebretson requested changes landed. Once you review i will squash Changes requested in code review into easy_profiler integration in order to keep best appearances 👍

@JoshEngebretson
Copy link
Contributor

Great, cleared for landing, I'll just do some final binary testing once you have the commits arranged, thanks!

@JoshEngebretson
Copy link
Contributor

This would also be a good PR to add yourself to AUTHORS.md 🌟

@rokups
Copy link
Collaborator Author

rokups commented Jun 28, 2017

Already there, Rokas Kupstys ;)

@JoshEngebretson
Copy link
Contributor

Haha, awesome, you're a Super Contributor :) If you want to add yourself to the Atomic Game Engine credits block, I think you should.. and technically, part of the contributing agreement: CONTRIBUTING.md

camels4

@JoshEngebretson
Copy link
Contributor

@AtomicBuildBot retest this please


find_package(Qt5Widgets)

if (NOT Qt5Widgets_FOUND)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is supposed to be if (Qt5Widgets_FOUND)? I think a crumb may have been introduced when testing the warning message.

@JoshEngebretson
Copy link
Contributor

JoshEngebretson commented Jun 28, 2017

@rokups I made some tweaks and added JS/TS Profiler.BeginBlock support, feel free to look over and cherry pick into PR: d826df8

I also had some problems on CI Mac, so:

@AtomicBuildBot retest this please

@JoshEngebretson
Copy link
Contributor

JoshEngebretson commented Jun 29, 2017

@rokups You absolutely shredded on the new Profiler subsystem 🎸 , very impressive work! It has also been a lot of fun working on this feature with you, LEVEL UP! 🌟

A hearty THANKS from 🐫 everywhere, and special thanks to @cas4ey for such an excellent profiling library and client, which Atomic now uses to profile C++, C#, JavaScript/TypeScript!!!

LANDING! ✈️

@JoshEngebretson JoshEngebretson merged commit 0c52b46 into AtomicGameEngine:master Jun 29, 2017
@Type1J
Copy link
Collaborator

Type1J commented Jun 29, 2017

This is pretty awesome @rokups!

@rokups rokups deleted the feature/easy_profiler branch June 29, 2017 17:30
@cas4ey
Copy link

cas4ey commented Jun 30, 2017

Whoa! Great news! 👍
@rokups Thanks for your great work on the integration and for your valuable suggestions for easy_profiler 🥇
@JoshEngebretson It's a pleasure to create useful things which could help people 😃

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants