🎉 Celebrating 25 Years of GameDev.net! 🎉

Not many can claim 25 years on the Internet! Join us in celebrating this milestone. Learn more about our history, and thank you for being a part of our community!

Dell World 2018 in Las Vegas

Published April 28, 2018
Advertisement

Alright. I finished my project for Dell this evening. It took me about two and a half months to complete it, though the first month or so was very light work. The work ramped up quite significantly towards the last two weeks and I was working weekends for the last two weeks. The good news is, I finished perfectly on time, on budget, and to specifications. As far as project management goes, this went perfectly! Tomorrow afternoon, I am flying out to Las Vegas to attend the Dell World Expo and will be hovering in the background making sure the booth attendants get properly trained and I can fix any problems that arise (including hot fixes). I will be most interested in seeing the reactions of people as they try out my app and looking for new business opportunities.

Anyways, here is a youtube video which shows the app as of tonight (pardon my awkward voice):

So, I think it would be valuable to go into a bit of post-mortem detail on what went well and what can be done better next time, and what I learned from the experience.

First and foremost, I learned that I should NOT be charging an hourly rate for my work. I am a contracted *company*, not an employee. Hourly wages are an employee mentality which I need to break my mind away from. I need to think more like a business, where I bid for a project to make profits, get payments, and then pay employees an hourly rate out of the total project budget. If I charge hourly rates, the incentive structure is inverted in disfavor of good engineering and efficient work. If you work too fast, too efficiently, you get paid less money and thus, working slow and inefficiently is rewarded. If you charge by project instead, the faster and more efficiently you work, the more you are rewarded. I also need to start thinking in terms of hiring and managing other people and calculating their time and costs into the project proposal budget. It's useful to know how long everything takes so that I can properly estimate an accurate project cost. The better I can be at estimating true project costs, the more competitive I can be. I've been seriously undercharging for what I've done, so that will change from here on out. I will not charge an hourly wage, I will charge by project and its costs will be based on the scope and requirements of the project. I think the minimum I will charge is $50k per project?

So, let's get technical on this interactive video project. Here's some really important details to consider:

  • When you are playing a 360 video inside of a sphere, the data rate of the video needs to be around 15mpbs. Any more than that, and you start running into video stutter.
  • You should not use transparency or chroma keying in your video. If you chroma key, the lossiness of an MP4 will cause color bleed on the edges. If you decide to use transparency on and alpha channel, you're going to be outputing an MOV using a lossless PNG, which will cause the filesize to skyrocket (ie, 90 seconds of video = 900Mb).
  • Leap Motion can be a teensy bit finicky, even after the Orion update. It's trying to do its best with noisy image data, so you're sometimes going to get false positives. Sometimes, it won't know whether the hand it sees is a right hand or a left hand. For some frames, it may incorrectly see a "grip" gesture, so you should try to account for that with a frame buffer.
  • Leap Motion doesn't really have events for when a hand left its view frustum, but you really, really need to know when this happens. Especially if the hand has an object attached to it. You'll have to create your own events and event handlers for gaining and losing a hand and decide what you want to do with a held object.
  • When it comes to gripping to move the camera vs grabbing to activate and object, you want to be very careful about how far you put objects away from the player camera. If they are trying to turn their view with their hands but their hands overlap an interactive object, they may accidentally trigger that object interaction and get frustrated. I found that 85cm away from the player camera is a good value. This can be adjusted without recompile by physically moving the leap motion closer or further from the player.
  • Cheat as much as you can. Buy as many premade art assets as you can. Sub contract people out to fill in the gaps.
  • Beware that some art assets you purchase may be unusable garbage. The DNA strands I bought for $25 were useless. I ended up creating my own programmatically and they turned out better than a what I would have gotten with a static mesh.
  • Play test with people who have never seen the project before. Don't tell them anything, except, "Hey, try this app out" and start it on the intro screen. Watch where they get lost, then design UI cues to fix that.
  • It's worth your time to get familiar with the media player code on the engine side. The better you understand how it works and what it's limitations are, the easier it is to work smarter. I initially didn't do my due diligence and I just spent maybe 15 minutes looking over the API. I didn't see how to figure out the length of a video file, so I made that into a function parameter value. If you have 19 videos, that means you have to right click each one, go to properties, go to the details tab, and then find the length and convert it to total seconds, just so you can enter it in as a function input parameter. And then, if your video guy sends you an edit, you need to find and update this value. It got tedious, so I eventually looked it up programmatically.
  • Videos don't loop out of the box. The "loop" functionality applies to a playlist of videos, not an individual video. If you want to loop a video, you have to add that functionality in yourself based off of the video duration. Oh, and by the way, when you get to the end of a video, you have to seek to the beginning and that means you're going to have a few black frames. I think most video playback systems will buffer the next few frames automatically, but if you want your video to loop, it's not going to start buffering the first few frames when it reaches the end of the file. That would require an engine mod and I didn't have the time to invest in that (though I certainly have the technical capability). It was just easier to produce a video which had several loops in the video and just accept the black frames during the loop cycle. We had a 10 second loop which we turned into a 90 second clip with 9 loops in the video. A few black frames once every minute and a half was a lot more tolerable than black frames once every 10 seconds.
  • You only want to play one video at a time. We took the last frame from each 360 video and turned it into a texture. Once a 360 video completes, I replace the video material with a texture material and let the video player play different videos. You want to make sure that the end still texture is a scene which doesn't have any moving parts to it so that the transition from video to end still is seamless and unnoticeable. This is something to keep in mind when you're doing video production on set and doing clip sequencing during video editing.
  • If you have 2D videos in a 360 sphere environment, you don't want to make the 2D surface a curved surface. If you need to change the distance of the video from the viewer, the curvature perspective changes and you'd have to create a new mesh to account for it. It costs too much time and effort and there isn't enough payoff to make it worthwhile.
  • Video transitions are a great polish feature. Fade to black, fade in from black, scaling from an axis, shrinking to an axis, all are great ways to prepare the viewer for the video content. Combine it with audio SFX and VFX to really sell it (I could have done a lot better here, but I was pressed for time).
  • If you have voice over audio and you're trying to time things with it, you want to do things at 1/10th of a second precision and note in a separate document your timings (Any greater precision has diminishing returns on noticeable value). I used Audacity to examine a WAV file and note the timings.
  • I used the same video sphere for every 360 video. Every interactive menu was spawned dynamically
  • I bound number buttons to key storyboard points. I also created buttons to skip forward 5 seconds in a video. This really helps to develop, test and iterate faster when you have video. You don't want to sit through 90 seconds of video to see if the event at the end fired correctly. Waiting is a waste of time. These controls are also going to be super useful for booth attendants. They can skip to particular scenes, reset a scene, or restart the whole app at the push of a button to be ready for the next person in line.
  • It's never going to be perfect. You can always find new things to add before it is finally "perfect". If the app is consider done only when it's perfect, it will never be done. Even now, there are things I'd want to spend lots of time fixing and changing and I'd feel better about it. But it's good enough. I feel a bit nervous about showing something I feel is imperfect, but... I've also seen my own app hundreds of times. People seeing it for the first time won't see its imperfections like I do. A big part of effective development is deciding what to let go and what to focus on.

I went and gave a quick demo at a local meetup and made a new connection which might turn into a future business opportunity. It's worth showing what you're working on, but do be prepared with a decent pitch. Who are you? What do you do? What are you working on? What does it do? Why is it useful/cool? What's the value proposition? etc.

Yesterday I went to a sponsored happy hour filled with tech people. I brought a 10 minute youtube video of my app. It was too long. I need a shorter sizzle reel to show people. I also need an elevator pitch. I got stalked by an investor and I was totally unprepared for that meeting.
"Are you working for a company?"
"Yes..."
"Is it yours?"
"Yes"
"What's it called?"
"uh.... Wobbly Duck Studios..." (cringe)
"What do you do?"
"I make VR games? And... now I made this new thing that's not VR and I don't really know what to call it?"
"Cool. Do you have a patent for it?"
"No, I just invented it a few weeks ago and I can't afford a patent." (Not that I want to patent it anyways or even care about patents, but in USA, company valuations are based on patent portfolios and that determines VC interest)
"What stage is your company in? Seed round? Series A?"
"Uh... I'm entirely self funded and broke?" (I don't know how to answer this)
"Do you have any employees?"
"I had one a few years ago, but then I ran out of money and he quit. I'm still surviving though, so I guess that's okay?"
"Oh, okay. Well, I have to go use the bathroom. Bye!" (flimsy pretext for them to escape further conversation with someone they're not interested in)

The reality is that I honestly don't care about investors anymore. I consider talking to them a waste of time. I used to care and chased them, and before I met with one, I'd spend *days* going over notes in preparation for it. No amount of prep can fix my general amateur CEO levels though, and they see that and I don't get any interest, much less funding. Why waste my time prepping for days to get nothing, when instead I could be spending my time doing something actually valuable, like developing products? Why would I want to give away equity and control of my company to outsiders who are only looking to 10x their principle at any cost? Especially at my current stage and low valuation? I can take on increasingly larger and more profitable projects to fund myself and keep 100% of my company to myself. And why would I want to measure my company value based on the number of employees I have? Full Time Employees in a pre-revenue start up are a drain on capital and generally a huge mistake (Something I learned the hard way), so head count is not a good measure of valuation. What matters is positioning, product market fit, your IP portfolio, your human talents, and how its all managed with respect to the market ecosystem.

Anyways, I must be sure to remember all that I've learned so far and apply that towards business and future projects. I honestly think I could make a few million dollars in the next few years if I apply myself correctly, but that's going to depend on building a track record of successful projects and a history of pleased customers. I think if I can do this, I can fund my game development indefinitely and build a core team around it, while also building a core team around building and delivering other software apps. I'm feeling cautiously optimistic about my future prospects right now. I think I'll have some bigger announcements in the next month or two :)

Previous Entry The Blackwood Witch
Next Entry June 2018
2 likes 3 comments

Comments

MagForceSeven

Lookin' good dude.

Regarding looping video problems: If there is looping support on playlists but not on individual video, couldn't you make a playlist of 1 video and loop that? or, fill in whatever the minimum number of videos is in with the same movie?

Another alternative: could you treat a non-looping playlist like a ring buffer? Always keep two copies of the movie in the playlist (the current and the next).  When 'current' completes, remove it from the playlist, next becomes current, append a new copy that becomes next.

Of course both of these assume that the playlist playback doesn't introduce black frames when switching from one movie to the next within the playlist.

April 29, 2018 07:06 PM
slayemin
On 4/29/2018 at 12:06 PM, MagForceSeven said:

Lookin' good dude.

Regarding looping video problems: If there is looping support on playlists but not on individual video, couldn't you make a playlist of 1 video and loop that? or, fill in whatever the minimum number of videos is in with the same movie?

Another alternative: could you treat a non-looping playlist like a ring buffer? Always keep two copies of the movie in the playlist (the current and the next).  When 'current' completes, remove it from the playlist, next becomes current, append a new copy that becomes next.

Of course both of these assume that the playlist playback doesn't introduce black frames when switching from one movie to the next within the playlist.

Thanks! I dug into the engine source code to see how it did video playback and created a new video playback class with a few wrapper functions which allows me to play individual videos and toggle whether they loop or not. The only problem now is that a looping video doesn't buffer the beginning frames as it reaches the end of file, so I still get the black frames. That's almost certainly going to require a modification of the engine and then staying on top of source code changes with version updates. A possible hack would be to have another sphere start playing a video a few frames before the first one ends and then quickly toggle sphere visibility? It would be sort of like double buffering screens similar to how DirectX does page flipping.

May 05, 2018 12:59 AM
d000hg

It's not a black and white choice between an employee charging an hourly rate or a company charging per project - this is kind of flawed logic.

  1. Employees don't charge an hourly rate, they have an annual salary
  2. Freelancers don't charge a "wage" they have an hourly rate
  3. Charging on an hourly basis is not "employee mentality" it's simply one model. I bet your lawyer bills on an hourly rate. Gigantic consultancy companies bill at hourly (or more likely daily) rates.

Billing hourly/daily is great if a project isn't well defined or there's a service element to it. It has pros and cons just as project costing does, in terms of mindset, risk and reward. For instance billing hourly can tempt you to spin things out but project billing can tempt you to do a rushed job that's just good enough. You might get paid less for working really fast billing hourly, but you can bill more if you are really that good. Hourly lets you flex the scope and adjust things to the customer's demands because you're not thinking about the extra hours you're working "for free". Project lets you plan further ahead in terms of accepting contracts, ramping up resources, but you have to put in more time defining the requirements and factor that into your billing, and be happy to butt heads with your customer.

My preferred model is somewhere in between, more a monthly agreed billing for a set number of resources. 

 

Anyway, great job!

June 07, 2018 01:23 PM
You must log in to join the conversation.
Don't have a GameDev.net account? Sign up!
Profile
Author
Advertisement
Advertisement