Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 14 Next capture
2021 2022 2023
2 captures
13 Jun 22 - 14 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
  • Help Room /
avatar image
0
Question by bwimsett · Aug 04, 2020 at 12:34 PM · 2dspriterendererbatchingdraw callsdynamic batching

Batching Sprites in 2D - "Objects have different MaterialPropertyBlock set"

I've been running the frame debugger on my project as rendering takes the largest chunk of performance. It is a 2D isometric game, where a procedurally-generated forest of overlapping trees is rendered. (Image attached)

To try and improve the performance I've already tried the following:

  • Added everything to the same texture atlas.

  • Using the unlit/cutout shader for textures.

  • Using tight meshes for sprites.

  • Removed all transparency from sprites aside from 0% alpha surrounding tiles

  • Set objects in the scene to be static (although I believe static batching isn't possible with sprite renderers? Can't find confirmation of this...)

I'm still seeing huge numbers of separate dynamic batches being rendered in the frame debugger, with the issue: "Objects have different MaterialPropertyBlock set" (image attached, 1 of 400 draw calls).

Every object in the scene just uses a sprite renderer with the same material, but a different sprite.

Pretty stumped as to how to reduce the number of batches. Each tree sprite on each row has it's own batch, which I'm sure could be reduced somehow.

annotation-2020-08-04-121938.jpg (54.8 kB)
annotation-2020-08-04-122436.jpg (29.5 kB)
Comment
Add comment · Show 1
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image AlexandreBujold · Feb 07 at 10:25 PM 0
Share

Hey @bwimsett , did you ever figure out a solution to your issue? I'm having the same issue, albeit a different scenario.

PS: Love your videos on Lumbermill, best of luck with it all!

1 Reply

· Add your reply
  • Sort: 
avatar image
0

Answer by Pangamini · Mar 16 at 03:29 PM

The materialPropertyBlock message is a bit cryptic, but I think i figured it out. I've noticed, in my project, that if all my sprites are using the same spriteAtlas, then they get batched correctly, but not otherwise. If you think about it, it makes sense. Sprites use alpha blending and rely on draw order instead of depth test. Since they are using sprites from a different atlas, they cannot use the same material without at least using a different texture, set using a materialPropertyBlock. I've noticed that sprites that use the same atlas and stand close to each other get batched properly. Then the texture has to be swapped to new atlas. You can try and use an opaque shader that is not sorted. I've observed that now all sprites are batched per atlas instead of per intended rendering order - which, since the sprites are not actually utilizing the z-test in any way (they all sit in the same 2D plane) leads to incorrect results.

So, you could:

  • Put all your sprites in a single texture of an atlas (test in play mode)

  • Use opaque shader, but make sure that the sprite's overlapping depends on depth instead of render order

Comment
Add comment · Show 1 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Pangamini · Mar 16 at 03:41 PM 0
Share

If you are making a mobile game, it's probably better to just sacrifice the batching rather than disabling tiled GPU optimizations by using alpha testing. I've been running a lot of benchmarks recently, and I've seen barely any effect of batching or its absence on mobile devices, including instancing and SRP batcher

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

354 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

How to create a single sprite from sprites of all children objects with respect to resolution of scene? 1 Answer

Weird bug about flipX being stuck 2 Answers

Sprites using same material do no render where the game object with when Enable GPU Instancing is true 0 Answers

Making an GameObject a child or another GameObject makes sprites dissapear 0 Answers

Why are multiple Sprite Renderers with same sprite taking seperate draw calls? 0 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges