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

Remove most redundant WebGL calls #4136

Merged
merged 11 commits into from
Nov 15, 2019

Conversation

stalgiag
Copy link
Contributor

@stalgiag stalgiag commented Nov 5, 2019

resolves #3794

This adds some caching to avoid redundancy with many of the most common GL state updates. This puts a little more stress on the CPU but on three different devices (2 laptops, 1 mobile) this PR doubles the framerate with the manual test examples. The number of GL calls is typically reduced by 100-200%.

GL call statisics (Before and After this PR):
performance/spheres -- before: 20,0004 -- after: 10,002
performance/triangles -- before: 17,004 -- after: 9,002
geometryLit -- before: 4,801 -- after: 1,644
geometryUnlit -- before: 1,257 -- after: 462
textures/multipleTextures -- before: 214 -- after: 73
textures/transparentTexture -- before: 101 -- after: 36
geometryImmediate -- before: 373 -- after: 148

Redundancy is removed with calls to:

  • gl.uniformXX()
  • gl.clearColor()
  • gl.enableVertexAttribArray()
  • gl.enable()/gl.disable()
  • gl.depthMask()
  • gl.blendEquation()/gl.blendFunc()

Two improvements that would help further but aren't present in this PR:

  • The uniforms have to be tested against the cache. This isn't terrible for simple data structures but for the matrix arrays this can be sub-optimal on the cpu side. It would be better if each uniform was a data structure that tracked its modified status.
  • I spent some time trying to implement VAOs (via extension) in the handling of attribute BufferDefs. This proved too difficult to pick apart and would require a refactor. The end result would be more readable code with less redundant calls to gl.bindBuffer() and gl.vertexAttribPoint() but is beyond scope for this.

Small unrelated changes made while working on this:

  • Cleanup old manual test examples that are no longer needed
  • Add comment to explain repetition between RendererGL.GL and RendererGL.drawingContext (consider future removal of RendererGL.GL)

@aferriss
Copy link
Contributor

aferriss commented Nov 6, 2019

@stalgiag thanks for cleaning up the old examples! This looks great, I'm excited to try it out. Did you happen to record any fps while you were testing?

@stalgiag
Copy link
Contributor Author

stalgiag commented Nov 7, 2019

@aferriss I haven't recorded any fps. In my testing, I usually saw a 50% - 150% increase in FPS depending on the sketch and device. I have only tested with my phone and laptop in Chrome but I will do more extensive testing before merging and post the results here.

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

Successfully merging this pull request may close these issues.

RendererGL performance improvement
3 participants