Can't figure out what is causing this unending Recalculate Style loop - google-chrome-devtools

A client sent me an email saying that he noticed his computer was sluggish, and when he ran diagnostics he determined the cause was that his webpage was using up a bunch of CPU. In trying to debug why his site might be using so much CPU on his computer, I noticed while using Chrome that nothing was happening in the Console, but that in the Timeline, there is an unending loop of "Recalculate Style, Update Layer Tree, Composite Layers" despite nothing happening on the webpage.
Screenshot of timeline: http://i.imgur.com/kW6CedU.png
I tried searching how to determine the cause of this, and found that Canary might help, so I tried the Timeline in Canary and didn't see anything different.
I've read it can be from CSS transitions being written as transition:all instead of the actual property that needs to be transitioned, so I changed all instances of transition:all in the CSS to a singular target (transition:height for example) and still this loop continues.
I'm also not certain that this loop is what is causing his CPU to be taking a hit, but it's my best guess. I noticed that the website constantly had the "loading" circle animation in the window's tab for Chrome, but now it's not doing that anymore. I'm not sure if it's because I changed the CSS transition rules that it isn't constantly "loading" now, nor am I sure it has anything to do with the CPU usage.
Any advice appreciated.

Related

Unity: Fps drops after a while

I am building an Unity application as a visual stimulation for a neuroscience study. Basically, my application just shows several flickering planes periodically. However, I noticed that every time after I ran the application for a few minutes, the fps dropped to around 10~30 shown in the profiler. The drop of fps happened in both editor mode or build. Since my script is totally in cycle, I am guessing there were some accumulative issues like GC or memory leak?
Also, I noticed that when the fps starts to become unstable, I can click the Pause button in the tool bar of the Editor and then resume the application, the fps will become stable for a further period. Therefore, I am wondering what actually happens when the Pause button is clicked? Does pressing the Pause button clear or reset anything so the fps can go back to full?
When I had a similar problem, it helped just turning off "Record" in the Unity profiler. Recording consumes so much memory and the fps drop, especially when there are a lot of function calls (like deep recursions).
It doesn't sound like you are constantly creating new GameObjects and not deleting the old ones, but that would be the 2nd thing that comes to mind.
If you use lot of drag-drop references or in short form [SerializeFields], you will lose performance resulting reduced FPS. Try to get everything you want in Awake, specially MonoBehaviours, this worked for me to increase FPS. By everything I didn't mean you have to keep things hard coded everywhere. Just the classes and other things like gameObjects. Floats, int, bools,strings, lists<> should be okay and better to be serialized.

What is suppressesIncrementalRendering doing?

I'm using the newest version of Xcode and Swift.
I was googling around to make my KWWebView even faster and found the following:
webConfiguration.suppressesIncrementalRendering = true
Documentation says the following:
A Boolean value indicating whether the web view suppresses content
rendering until it is fully loaded into memory.
But what does this mean? Does it mean, the html doesn't not get rendered and shown as long as not all resources like images and javascript files are completely loaded by the WKWebView?
As stated in the documentation it's a flag to tell the webview engine to wait or not till things are set and ready. whether to scan the document (html+related resources) to check for what to be redrawn periodically, or just await the full stuff to be loaded and ready.
WebEngine:
Rendering is a progressive process that depends on the assets (js, Css, images..) that will compose the page. It is important to understand that Turning this feature on or off will simply turn the algorithm of rendering on/off for loaded content.
How to make my page faster?
A lot of factors, rendering algorithm (engine's), how heavy your scripts are(bundle, memory allocation,event pass through and handling, etc..), the size of the images, how well structured your CSS is, and its hierarchical selector orgnisation(css parsing and application).
The order of which the assets are loaded( included) in the page.
You can always check the profiling of your page in (devtools for example) on a modern browser to see how things go, what size of memory it allocates, the bundle size, time for scripting, how the page is designed to consume/utilise device resources.
To make the long story short:
Generally speaking there are THREE main phases with a total of five steps through which your page has to go while living in the browser:
PHASE A: MEMORY/CALCULATION (CPU)
1- Scripting:
PHASE B:( PROCESSING CPU mainly)
2- Styling
3- Layout
PHASE C: (GPU POWER!)
4- Paint
5- Composition
When the browser decides to to update it has to go through these, either a full pass or a partial pass will make a lot of difference. consider the following example
if you have a div, and you decided to create an animation that moves it from the left edge of the screen to the right edge, you see developers doing two approaches:
THOSE WHO JUST WRITE CODE:
change the left value of the div style over time. ( simple right?)
THOSE WHO KNOW THE STUFF:
do a transfom by using translateX or translate3D.
both ways will work, the first will eat up your CPU, while the second will run at a very high FPS.
WHY ?
The first approach plays with sacred left value, that means the browser will have to re-calculate the new left (STEP1) > check style (STEP2) > THEN do a new LAYOUT (STEP 3) > Do a Paint ( step 4) > THEN enter Composition phase (STEP 5)
this will cost a full pass 5 stages that is totally unnecessary!!
The other approach on the other hand, will not require anything but a composition (one step #5) because the matrix manipulation in the GPU (pretty strong ability!) can handle displacements implied by using the translate3d or translateX!! you will see people talking about including a translate3d prop on your CSS elements to push performance (huh!) but the real reason is the above explained. so knowing what happens under the hood can save you.
supperess rendering is about waiting to load everything before starting to show things up, or simply try to handle things as they load..

MKMapView overlays get reset on appDidBecomeActive

I have this map view with a bunch of overlays. When I hit the home button and re-open it, all the overlays disappear for a second and immediately re-appear. At first I thought it was my code that was doing it but I put breakpoints pretty much everywhere and none of my code seems to be triggering the "reset". Even mapView:viewForOverlay: doesn't get called before the overlays reappear.
I thought maybe this is an inevitable behavior of MKMapView, but it seems like Maps.app doesn't do it either — if you calculate a route and quit/re-open the app, the overlays stay there the whole time.
I'm thinking maybe MKMapView clears all of its annotations/overlays by default on quit so it takes less memory while staying backgrounded. Is there any way to avoid this? Kinda like Maps.app does?
EDIT: here's a small project I put together to demonstrate the problem. Just launch it in Simulator, click the home button, and re-open it. You'll see the map path overlay disappear for a moment.
This is more of a follow-up than an actual answer, but basically this issue has been flagged as a bug by Apple. I submitted this as a TSI to Apple a while ago and received the following answer:
Thanks for providing a sample project. I don't see any issues in your
code. At this point I recommend escalating the issue to engineering by
filing a bug about the "flicker" from the MKPolylineView being redrawn
at https://developer.apple.com/bugreporter/ and sending me the bug
number so I can use it to follow up.
I then submitted radar #11041378
Thanks again for your bug report. As it happens, I don't have a
workaround for you at this time. Engineering is still working on the
issue, but I don't have a timeline for a fix.
I'll go ahead and leave this incident open for you as long as bug
11041378 is open. If you have any questions about it's status in the future, or the status of a workaround, feel free to reply back and I
will check it for you.
If you have any comments for engineering, or want to tell the story of
why it's important to your situation, I'd actually encourage you to
put that directly in the bug. Since it's been assigned to engineering,
any comments will go directly to them.
I appended the following comment that describes why the issue is important to me:
This bug feels rather important to me as the user expects to find the
app in the exact state he left it when he quit the app. The flickering
overlays (sometimes disappearing for less than second, other times for
2-3s) may get the user confused about what is going on, when all he
really wants is to interact with the map/overlays right away.
Haven't heard back from Apple since. Hopefully this will get fixed in iOS 6?

Placeholder strange behavior on input

I'm programming an application for iPhone. My application has a login system. In the login system (and somewhere around my app) I have some placeholder in the UITextFields.
After a couple of months working on this app, I noticed a sudden problem that arose once. If I don't write in the text fields that have placeholders nothing happens, if I write something in them, the blue bar that blinks showing where you are in the text becomes very slow. Moreover the ScrollViews that I have become EXTREMELY slow. Some other strange behavior happens when I have a wheel that lets the user pick some choice: the options of the wheel "fall" from the sky while the user rolls it.
All of this happens only if I write something in a UITextField that has some placeholder. If not, nothing of this happens.
I know this sounds REALLY strange, I used a MacOSX program to create a video of the text field becoming slow.
It's .swf.
try to do one thing.. delete this textfiled and create a new one with different name and see is this problem occurring again? also try to set breakpoints in your code and debug your code.
Are you sure you aren't leaking any memory or running an endless loop on the cpu? Try monitoring your app with Instruments and check your cpu activity and memory allocations.

OpenGL performance on iPhone: glAlphaFuncx on the trace

This is kind of weird, but I noticed that up to 40 percents of the rendering time is spent inside glAlphaFuncx. I know that alpha testing is very expensive, but the interesting thing is I do not use it :) No single place of code uses alpha testing, neither do I invoke this function in any other way.
I also checked GL layer for blending on other sorts of stuff which might cause this to happen but it is what it is.
So, if anybody knows what might cause glAlphaFuncx to appear on the performance trace of CPU Sampler, I would be glad to hear it :)
Update: fixed the screenshot link: http://twitpic.com/2afxho/full
Update 2: the function that leads to invokation of glAlpaFuncx contains a single line:
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
Update 3: I tried setting the breakpoint inside this function, but it seems it haven't been invoked at all. I guess profiler is screwed up here...
It's weird that this function appears on a profiler trace, as you say you aren't using it. Try setting a breakpoint in glAlphaFuncx to see from where it is being called.
But anyway, that should not be a problem, glAlphaFunc will just set a state in the GL server side, it doesn't (or should) do any more processing than that. It shouldn't be a performance problem, maybe it's a bug in the GL implementation or in the profiler.
To be sure, you can disable alpha test with glDisable(GL_ALPHA_TEST).
From what I can see, glAlphaFuncx could just be taking the hit for setting up the rendering or pushing the pixels. It could be that it is run either first or last in the rendering.
Do you have an actual performance problem, or are you just trying to find pieces of code to slice off / optimize?
If so, you should set a breakpoint in glAlphaFuncx and see where it is called from and why. To do this, just bring up the debugger console and type "break glAlphaFuncx".
Have you tried explicitly disabling the use of alpha channels?
glDisable(GL_ALPHA_TEST);
http://www.khronos.org/opengles/documentation/opengles1_0/html/glEnable.html
Regardless of system, this sort of behaviour -- time spent presenting what's been drawn -- almost always indicates that the GPU is the bottleneck. Either you are drawing too much (if the framerate is a problem), or the CPU isn't doing enough (if the framerate is fine).
Actually, there's one other possibility -- that the amount of GPU work is fine, but the system is waiting for some kind of vertical retrace period. (That seems unlikely on a device that only ever has an LCD, and doesn't support a raster scan display, but maybe things still notionally work that way internally.) The upshot is still the same as far as the amount of CPU works goes, though, in that you've got time to do more stuff without affecting the frame rate.
I can't explain exactly why glAlphaFuncx specifically is appearing in the call stack, but if it doesn't appear ever to be actually getting called then I'd consider it a red herring until proven otherwise.