• Keeping Ahead of the Mobile Monetization Game

Building your free-to-play game is just one piece of the puzzle. You still face the problem that’s plagued everything on the app store since its inception in 2009: How do you get paid? Monetization in the mobile market has gotten better since those digital wild west days, but how it is being done evolves quicker than it’ll take you to finish reading this piece.

Put simply, there are some big trends to track in the mobile ad space, right now: Real-Time Bidding (RTB) and app-ads.txt — to name a few. But to see where things are headed, you also need to take a quick look back.

In 2009, some apps were $50. Others sold for 99 cents. There were no best practices, just lots of experimentation. A developer — one of the earliest on the App store — realized that it’s really hard to advertise your app if you’re not featured. JRBO understood the real life need for a performance ad network and monetization tool that works well. So, after some tinkering, the team created an ad server for their own games. That offshoot project did so well, it spun out a whole new company: AdColony. Since then, AdColony has pioneered a number of technologies and approaches to the market that have earned them trust with developers and advertisers, alike. “‘How are we going to port this premium console game to mobile?’ is the question we had to quickly ask ourselves,” says ForwardXP CEO, Steve Nix. “Guilt Battle Arena came out on Switch, Xbox One, PC, and PS4 in 2018 and we thought having a free to play version would be a better route. When we started thinking of monetization partners, AdColony immediately came to mind. They put a lot of effort into their SDK over the years.” Nix continued, “There are a lot of great tools in their SDK and a lot of great ways to optimize your monetization.” “In fact,” Nix adds, “Any competent game developer with familiarity in Unity, iOS or Android can implement the SDK without any real problems.” Brian Truman Executive Director, Digital Ad Revenue and Operations at GSN Games adds, “AdColony’s technology has always been pretty solid. Five years ago, when we first started working with them - it was a no-brainer if you were putting ads in an app. Other developments have come along as well as other solid competitors, but I’ve always felt good about working with AdColony. They have people that know what they are doing, keep investing in their platform, and they continue to push the mobile ads industry forward.” Trend 1: An eye on Real-Time Bidding RTB monitor media solutions is one of those big pushes you’re going to see in the next six to 12 months. Its unrealistic to expect AdColony — or any single network — to be on the only SDK in most apps. It does happen occasionally, but most people are going to want a few different options. After all, if you’re selling something on eBay, you don’t want just one bidder in on the action. So you integrate a mediation partner. Here’s where things will dramatically change. Up to now, mobile has seen a waterfall setting for the bidding of ad inventory. Let’s just take an example here: You got three networks bidding and the app developer’s saying they want to sell this view for$2 at a minimum. Instead of going to everyone at once, “Hey what have you got for at least $2?” they’ll go to waterfall auction one, first. The bid is below the threshold, so the developer moves to the second bid that just so happens to be at$2.25. Great, but what about number three’s bid for a $6 ad? That request never makes it down because bidder two hit the baseline. With RTB (sometimes called advanced mediation) everybody gets a bid, happening in real time. “With RTB, it becomes much more efficient.” Truman adds.“It also provides a more competitive environment where all the networks have bids for every impression. We started testing with AdColony late last year — one of the early adopters of this technology. Them, along with Facebook, have been really out front with this.” RTB is the best way for advertisers and brands to reach more devices. An added bonus is that it will increase transparency for who will be delivering the best value for monetization. Needless to say, moving to RTB is really important. Sit on the sidelines too long and publishers will start seeing non-RTB traffic dwindle and get much lower quality ads over time. Trend 2: Third party authentication with app-ads.txt The other important trend to watch is the implementation of app-ads.txt. This has been a long-time standard for the web, designed to check that someone selling inventory on a site has permissions to do just that. The IAB released their standards in March for app-ads.txt. So publishers who are using monetization platforms that don’t support app-ads.txt are going to see a huge drop in demand. It’s going to take a while to be ramped up before that comes to a head — 2020, by some estimates. That said, there is no reason to delay making the change. It’s a low-effort switch that unlocks a lot of revenue for you in the future. AdColony’s SDK has that support planned on the near-term roadmap. Better still, the SDK provides OTA updates for some features - and this change is one of those things that will soon get automatically baked into what people are already using. Taking advantage of AdColony’s$5 million AMP fund

As you continue eyeing the ever-moving goal posts in mobile monetization, AdColony recently announced a $5 Million Advanced Monetization Program (AMP) to give a taste of what the SDK and tools can do for your apps. The program is aimed squarely at incentivizing publishers, offering 100 percent revenue share for 90 days, a 15 percent user acquisition credit, and up to 10 percent bonus on first position waterfall deals to those who participate. “I hope that developers take advantage of it,” says Truman. “What makes it really appealing is that there are some acknowledged risks when you’re an app developer and you’re going to spend time to integrate an SDK. That may mean you have to choose between a network you’re familiar with, so there’s an opportunity cost. The AMP fund mitigates that cost and perhaps give some additional benefits if it works out for the developer.” The other thing to consider is the experience you get working with any ad network. Truman says that AdColony “has some unique tools and settings in an easy-to-use dashboard compared to other networks out there.” So far, AMP has attracted a huge influx of people - groups that are both large and small. The goal, quite frankly, is to make that decision to monetize a whole lot easier. Nix adds, “We don’t have a lot of development budget to optimize our game for free play and if there’s something available to help maximize revenue from the game through AdColony’s platform, even better.” If you’d like to learn how to sign up for the AMP fund, read this story on the AdColony blog. Report Article User Feedback This reads a little like a press release or advertisement, I'm not sure what I've learned about general advertising within the mobile space that doesn't seem specific to the adcolony platform... Share this comment Link to comment Share on other sites Create an account or sign in to comment You need to be a member in order to leave a comment Create an account Sign up for a new account in our community. It's easy! Register a new account Sign in Already have an account? Sign in here. Sign In Now • Advertisement • Advertisement • Latest Featured Articles • 0 • 0 • 0 • 2 • 0 • Featured Blogs • Advertisement • Popular Now • 11 • 16 • 10 • 9 • 56 • Similar Content • I'm thinking on developing my own breeding game. Should be easy enougth to create the basic game mechanics and mostly the planning phase is done. I'll use "NimbleBit"s "Pocket Frogs" (https://en.wikipedia.org/wiki/Pocket_Frogs and https://play.google.com/store/apps/details?id=com.nimblebit.pocketfrogs&hl=de) as example, because my idea is in some ways quite similar. Android is the first platform I want to target, with optional expanding later to IOS and perhaps Windows. First Problem: I'm quite not sure about what language or engine I should use. I know this question is mainly based on opinion, but based on what I plan to do, is there an engine to prefer and why, or should I build it from scratch and wich language should I use then? At the moment my best bet would be on unity or python. Any suggestions here? Second (and most significant) Problem: I want to create a large amount of - let's call it - monsters, that differs in color, pattern, color of the pattern and partly shape, but I don't get the trick behind it. So the question here is: How to create reusable monsters that differ in the above mentioned characteristics, with the lowest possible number of graphics. My thoughts and attempts on that topic: I looked at Pocket Frogs, and except shape they do exact the same with their frogs what I want to do. But I really don't get how they created over 38.000 (!!!) individual frogs, and the game still doesn't use that much space. I first tried to extract the graphics from the games files to puzzle together what they did. But I could not find them. However I think I figured out some parts of this secret just by looking at the frogs ingame: I think they used a basic frog model. 16 to be exact, to create 16 background frogs in all the colors. On top of them they just displayed the different patterns. But - and thats the mystery - the patterns are in different colors too and I still dont believe they made 16*104=1664 different pattern graphics. So what trick am I missing here? Some kind of mask? Can I use the same technique to create different additional shapes for my monsters? And how did they made the feet moving. If the pattern on the feet are extra graphics, that would be another 1664 graphics. Any idea on how I can make this work, or on how did they make this work will be very appreciated! Thx • By khawk Lightstream, an innovator in cloud-native live streaming technology, today announced its IRL (In Real Life) plan for broadcasters who stream events from their phones or mobile live streaming setups. Streaming out in the world away from a computer and without a strong internet connection can be a challenge. Lightstream’s new IRL plan provides capabilities that streamline setup time and gear required to produce a professional stream from any location, any device and any connection. “Part of our mission at Lightstream has been to empower new creative possibilities and our new IRL streaming plan does just that,” says Stu Grubbs, CEO of Lightstream. “Lightstream Studio is powered by our cloud-native live video editing pipeline allowing creators to set up their production in advance, remotely control it, and have their streaming video automatically produced to their specifications from anywhere in the world while in-flight to their viewers.” With a Lightstream IRL plan, streamers set up their project and scenes via any browser-enabled device with their overlays, RTMP source and final channel destination. Broadcasting to Lightstream from any location will automatically layer on the media in that project on its way to their channel – whether that be Twitch, Mixer, YouTube, Facebook Live, or a custom destination. Similar to Lightstream’s unique integration with Xbox and Mixer, there is no need to have Lightstream Studio open in a browser window. The new IRL Plan includes the following features: Customize with Overlays & Alerts Streamers can create multiple custom layouts, upload and position overlays, and use any integrated alerts service they prefer to easily personalize their mobile or IRL broadcast to better engage their audience. Auto Go Live Projects can be set to automatically start streaming to the broadcaster’s channel as soon as an incoming feed is detected. Auto BRB If connection is lost, the RTMP layer will go transparent until connection is re-established. Position an image directly behind your feed that will automatically appear to keep viewers updated. Disconnect Protection Lightstream Cloud will continue broadcasting and keeps the broadcaster’s channel live until signal is regained so the audience doesn’t leave. Remote Control Start, stop, and switch scenes on any mobile device. Stay Mobile with Headless Mode Go live without having Lightstream Studio open. Lightstream will automatically composite on your layers in the cloud. Max Quality & Duration Increase Stream at 720p 60 fps for up to 12 hours per broadcast. For more information and to sign up for the IRL Plan, please visit https://golightstream.com/irl. For more information about Lightstream and its products, please visit https://www.golightstream.com. Be sure to follow Lightstream on Twitter for the latest updates and community happenings. View full story • By khawk Lightstream, an innovator in cloud-native live streaming technology, today announced its IRL (In Real Life) plan for broadcasters who stream events from their phones or mobile live streaming setups. Streaming out in the world away from a computer and without a strong internet connection can be a challenge. Lightstream’s new IRL plan provides capabilities that streamline setup time and gear required to produce a professional stream from any location, any device and any connection. “Part of our mission at Lightstream has been to empower new creative possibilities and our new IRL streaming plan does just that,” says Stu Grubbs, CEO of Lightstream. “Lightstream Studio is powered by our cloud-native live video editing pipeline allowing creators to set up their production in advance, remotely control it, and have their streaming video automatically produced to their specifications from anywhere in the world while in-flight to their viewers.” With a Lightstream IRL plan, streamers set up their project and scenes via any browser-enabled device with their overlays, RTMP source and final channel destination. Broadcasting to Lightstream from any location will automatically layer on the media in that project on its way to their channel – whether that be Twitch, Mixer, YouTube, Facebook Live, or a custom destination. Similar to Lightstream’s unique integration with Xbox and Mixer, there is no need to have Lightstream Studio open in a browser window. The new IRL Plan includes the following features: Customize with Overlays & Alerts Streamers can create multiple custom layouts, upload and position overlays, and use any integrated alerts service they prefer to easily personalize their mobile or IRL broadcast to better engage their audience. Auto Go Live Projects can be set to automatically start streaming to the broadcaster’s channel as soon as an incoming feed is detected. Auto BRB If connection is lost, the RTMP layer will go transparent until connection is re-established. Position an image directly behind your feed that will automatically appear to keep viewers updated. Disconnect Protection Lightstream Cloud will continue broadcasting and keeps the broadcaster’s channel live until signal is regained so the audience doesn’t leave. Remote Control Start, stop, and switch scenes on any mobile device. Stay Mobile with Headless Mode Go live without having Lightstream Studio open. Lightstream will automatically composite on your layers in the cloud. Max Quality & Duration Increase Stream at 720p 60 fps for up to 12 hours per broadcast. For more information and to sign up for the IRL Plan, please visit https://golightstream.com/irl. For more information about Lightstream and its products, please visit https://www.golightstream.com. Be sure to follow Lightstream on Twitter for the latest updates and community happenings. • If you plan on jumping into Unity Addressables Pooling, be careful. You better make sure the object pool is not empty. [The original post with its formatting can be found at Unity Addressables Pooling] In previous posts, I showed you how to load content in your game without limits. Well, sure there are limits, but you are not likely to reach them if you did a good job at implementing your asset content management system. And I'm pretty sure you'll get it right enough if you followed my advice. But so far, I can say we are missing one important piece of the puzzle, though. I mean, we're missing many, but today I want to focus on a very specific one: latency. What's latency? Latency is the time it takes between starting something and finishing it. It is some sort of delay that we usually want to avoid. You suffer latency when cooking your microwave popcorn, for instance. There, you start the microwave and have to wait for 3 to 5 minutes. And we want to eat popcorn right away, so this kind of latency is bad. When we get into the field of games, things get worse than cooking popcorn. In games, milliseconds matter. Everything above 20ms makes competitive multiplayer a bit more unfair. But in this post, we're not talking about multiplayer games. We will be talking about the latency we suffer when we load and display an asset using Addressables for Unity. And actually, we will do something about it. We'll implement a simple Unity Addressables Pooling System. Will you jump in the pool? Quick Navigation (opens in a new tab) Level 1 Developer: Simple Unity Addressables Loading Level 2 Developer: Unity Addressables Pooling 1. Warm-up the asynchronous pool 2. Helping our Gameplay: take an item from the pool 3. Saving CPU time: return the item to the pool 4. Freeing up memory: disable the pool Level 3 Developer: Smart Unity Addressables Pooling Performance Networking Automatic Pooling Level 1 Developer: Simple Unity Addressables Loading Yes, I know. We've done this several times. We take a prefab, mark it as Addressable and we assign it to a script that loads the prefab whenever it makes sense. And this gives you big benefits over traditional asset management workflows based on direct references. In short, using Addressables gives you... To read more on this, visit my introductory post on Unity Addressables Benefits: 3 Ways to Save Your Game. In this blog post, I'll stick to showing my tremendously complex sample project setup. Unity Addressables Simple Setup Oh nevermind, it was just a prefab instantiated through the Addressables API... This works most of the time just fine for any game. However... This loading and instantiation process has some latency to it. Unity has to fetch the required asset bundle, load the prefab and its dependencies and instantiate. The loading process should take well below 1 ms. But things get messy when we add more complexity to this object. If we add animators, particle systems, rigid bodies and such, Unity can surely end up stealing 10 ms away from us. Activating these components can take a significant amount of time. And if the asset bundles are served over the network and they were not ready, then we're speaking of seconds, even minutes. How terrifying would your game be if by the time your final boss is spawned the player already reached the end of the dungeon? This is my guess: as terrifying as profitable. A typical solution in Unity relies on adding object pools. There're many object pools you can find online for Unity. The issue is, they're not Addressables-ready. But now, you'll get one. Level 2 Developer: Unity Addressables Pooling Let me warn you here: the needs for a pooling system greatly vary from project to project. Here I'll be giving you a simple system that you can tweak to match your needs. This is what you'll want from this pooling system: In case you were wondering: yes, I re-used the icons from the previous section. Busy times here. Before we jump into the code, I'll show you the test I prepared. 1. Warm-up the asynchronous pool By now, the prefab and its content are not loaded in memory. The pool is enabled and loads the prefab based on Addressables. Then, it instantiates several objects and deactivates them all, paying the price of Awake, Start, OnEnable and OnDisable. By now, the prefab contents are in memory. Addressables Pooling: Warm-up 2. Helping our Gameplay: take an item from the pool A user takes an item from the pool and puts it somewhere in the scene through the synchronous method Take(). The user pays the activation (OnEnable) time, which depends on the complexity of their prefab. Addressables Pooling: Take 3. Saving CPU time: return the item to the pool The user gets tired of their new toy and returns it to the pool. The pool deactivates it and puts it under its hierarchy, paying the price of OnDisable. Addressables Pooling: Return 4. Freeing up memory: disable the pool After some time, we know we will not need this item anymore. We disable the pool and therefore it'll free up all the used memory, even though the indirect reference is still present in the pool. Addressables Pooling: Disable The strength of this method relies on memory management. We pay the memory price when we decide to. With traditional Unity Object Pools, we paid the memory overhead all the time, even if the prefab was never instantiated. Now, how does the code look like? 01: public class GamedevGuruPoolUserTest : MonoBehaviour 02: { 03: [SerializeField] private AssetReference assetReferenceToInstantiate = null; 04: 05: IEnumerator Start() 06: { 07: var wait = new WaitForSeconds(8f); 08: 09: // 1. Wait for pool to warm up. 10: yield return wait; 11: 12: // 2. Take an object out of the pool. 13: var pool = GamedevGuruPool.GetPool(assetReferenceToInstantiate); 14: var newObject = pool.Take(transform); 15: 16: // 3. Return it. 17: yield return wait; 18: pool.Return(newObject); 19: 20: // 4. Disable the pool, freeing resources. 21: yield return wait; 22: pool.enabled = false; 23: 24: // 5. Re-enable pool, put the asset back in memory. 25: yield return wait; 26: pool.enabled = true; 27: } 28: } That's a pretty normal piece of code for testing. If there's anything relevant to mention is line 13. Why do we look for the pool passing our asset to GetPool? The idea behind that is that you might need several pools, one for each asset type, so you need a way to identify the pool you want to access. I don't particularly like static methods that access static variables, but you should adapt the code to the needs of your game. By the way, you don't need to copy all the code yourself. I prepared a repository you can access for free. Visit the GitHub Repository And how's the code for the pool itself? 01: public class GamedevGuruPool : MonoBehaviour 02: { 03: public bool IsReady { get { return loadingCoroutine == null; } } 04: 05: [SerializeField] private int elementCount = 8; 06: [SerializeField] private AssetReference assetReferenceToInstantiate = null; 07: 08: private static Dictionary allAvailablePools = new Dictionary(); 09: private Stack pool = null; 10: private Coroutine loadingCoroutine; 11: 12: public static GamedevGuruPool GetPool(AssetReference assetReference) 13: { 14: var exists = allAvailablePools 15: .TryGetValue(assetReference.RuntimeKey, out GamedevGuruPool pool); 16: if (exists) 17: { 18: return pool; 19: } 20: 21: return null; 22: } 23: 24: public GameObject Take(Transform parent) 25: { 26: Assert.IsTrue(IsReady,$"Pool {name} is not ready yet"); 27: if (IsReady == false) return null; 28: if (pool.Count > 0) 29: { 30: var newGameObject = pool.Pop(); 31: newGameObject.transform.SetParent(parent, false); 32: newGameObject.SetActive(true); 33: return newGameObject; 34: } 35: 36: return null; 37: } 38: 39: public void Return(GameObject gameObjectToReturn) 40: { 41: gameObjectToReturn.SetActive(false); 42: gameObjectToReturn.transform.parent = transform; 43: pool.Push(gameObjectToReturn); 44: } 45: 46: 47: void OnEnable() 48: { 49: Assert.IsTrue(elementCount > 0, "Element count must be greater than 0"); 50: Assert.IsNotNull(assetReferenceToInstantiate, "Prefab to instantiate must be non-null"); 51: allAvailablePools[assetReferenceToInstantiate.RuntimeKey] = this; 52: loadingCoroutine = StartCoroutine(SetupPool()); 53: } 54: 55: void OnDisable() 56: { 57: allAvailablePools.Remove(assetReferenceToInstantiate); 58: foreach (var obj in pool) 59: { 60: Addressables.ReleaseInstance(obj); 61: } 62: pool = null; 63: } 64: 65: private IEnumerator SetupPool() 66: { 67: pool = new Stack(elementCount); 68: for (var i = 0; i < elementCount; i++) 69: { 70: var handle = assetReferenceToInstantiate.InstantiateAsync(transform); 71: yield return handle; 72: var newGameObject = handle.Result; 73: pool.Push(newGameObject); 74: newGameObject.SetActive(false); 75: } 76: 77: loadingCoroutine = null; 78: } 79: } I know, somewhat long, but I want to post it here so I can explain what's going on.
Like I said before, in line 14 we're getting the right pool for you, as in this article we aim to have a pool per prefab. We use the runtime key for this matter, which is the string we use to identify our addressable assets. Other variations can include using generics and enums to use a single pool object instead.
In lines 30-33, we take one object from the pool, we parent it and then activate it. You might want to add more arguments to this function, such as position and rotation.
We do the opposite in lines 41-43. Like the child who rebels and leaves home only to come back after just an hour, we accept it back. We deactivate it and parent it back to our pool game object.
And then it is time to warm up the pool and empty it in lines 52 and 60. We pre-warm the pool when it is enabled by instantiating and deactivating 8 prefabs. Finally, we call Addressables.ReleaseInstance to free up memory.
The strategy here is clear: enable the pool when we suspect we will need it and disable/destroy it when we don't.

Level 3 Developer: Smart Unity Addressables Pooling
There are so many variations of Unity Addressables Pooling systems.
It all really depends on your objectives for your game.
Performance
You could, for instance, prioritize performance. If that is the case, you certainly don't want to activate/deactivate entire game objects on the pool's Take and Return calls.
Activations are extremely expensive. What you want there is to enable/disable certain components instead, such as renderers, animators, canvases, etc.. You'd stop paying the draw calls while not paying activation times.
Something you could also avoid is excessive parenting, as we also pay a high price for it.
If this is your case, you might want to go for PerformancePool.
Networking
Did you ever use Photon, PlayFab, Mirror or any other networking solution to add multiplayer possibilities to your game?
If so, you might have noticed you often have to assign a prefab somewhere so these systems instantiate it when required.
But what if your prefab is based on Addressables?
Well, in that case, you can still profit from a more specialized plug and play pool version: NetworkedPool.
Automatic Pooling
If performance is not required and you'd rather save time, you can also make your life easier and still get the benefits of pooling.
You could go for the AutomaticPool component, which will take care of loading and unloading prefabs for you. What is more interesting, it'll free up its entire memory after a certain time has passed without users requiring the prefab.
If you are interested in these Plug And Play components, you'll be happy to know they will be included in my upcoming Addressables for the Busy Developer course.
Highly-skilled game developers and I will start a sprint to transform and level up the way we make games in Unity.