- Joined
- Apr 19, 2012
- Messages
- 12,062 (2.74/day)
- Location
- Gypsyland, UK
System Name | HP Omen 17 |
---|---|
Processor | i7 7700HQ |
Memory | 16GB 2400Mhz DDR4 |
Video Card(s) | GTX 1060 |
Storage | Samsung SM961 256GB + HGST 1TB |
Display(s) | 1080p IPS G-SYNC 75Hz |
Audio Device(s) | Bang & Olufsen |
Power Supply | 230W |
Mouse | Roccat Kone XTD+ |
Software | Win 10 Pro |
Steam In-Home Streaming is an ideal way to stream gaming content from your main gaming rig, to a lightweight, low-power and importantly cheap client system in your living room. To test this out, you'll require some specific kinds of hardware, some dubious hardware acceleration techniques, as well as some tests on your network.
It has full controller detection support, so if you plug in an XBox 360 controller into your client machine, it will detect that as your input.
Hardware Requirements
First off, hardware requirements. While it is possible to get this system running on just about anything, for the most ideal 1080@60p performance, you're going to want a good set of hardware, capable of allowing hardware encoding on your gaming rig, as well as decoding on the client machine. This can all be done with software encoding but it's simply too slow unless you're running an i7.
For Gaming rig processors, you're going to want an i5 from just about any architecture, as long as it supports DXVA hardware encoding, or Intel's QuickSync. Baseline it needs to support H.264. Obviously the games you want to play are going to jump on this hardware too, so bare that in mind.
On the Client machine, any modern dual core pentium is ideal. Most of them support QuickSync and DXVA, are low power, and more importantly cheap! You can purchase something more meaty, like an i3, for stronger more reliable decoding during streaming if your budget allows, but another i5 for the client machine feels like a bit of a waste. The Pentium I tested with managed a solid 59FPS during testing on 1080@60p.
You can check for QuickSync support on any Intel product page:
For Graphics cards, the current iteration of SIHS supports both AMD and NVidia, but the AMD encoding and decoding is a little rough for a fair few users. For best results, I ignored both, and set the encoder and decoder to Intel QuickSync or DXVA encoding with the processor. If you want to use a GPU encoding method, I strongly recommend an NVidia GPU for this purpose.
You can decode on the client machine with an NVidia GPU as well, but Intel's iGPU with QuickSync is exceptional at decoding H.264. Why spend the extra money?
Network Requirements
While wireless is a possibility, it's not advisable. Most users are running direct cable, and those who can't are running through PowerLine adapters. I managed an almost flawless experience with AV200 PowerLine units. There was a fair amount of "Network too slow" errors in some cases, but it was few and far between. As such I've ordered some Gigabit AV600 adapters to alleviate that issue in future. That seems to be the baseline for flawless operation.
For those that want to test the wireless option, and see what possible situations a wireless setup will work, see the wireless SIHS thread here:
http://steamcommunity.com/groups/homestream/discussions/0/630802979130451288/
and if you can, submit your data too.
Obviously all of this is subject to input lag as well as general response time issues, but in my SteamStream_Log it was rarely above the 50ms mark, which is not bad considering most of the servers I've joined for various online games have a similar amount of delay.
****
Software Requirements
Ensure you've installed all DirectX9, DirectX10 and DirectX11 Libraries. These are required for hardware acceleration.
****
Setup
The intial setup is extremely simple and easy to do. Simply install Steam on both the Gaming rig and the Client machine, and log into them both on the same network.
Go to Settings > In-Home Streaming and tick Enable streaming
From this area, I recommend you defaulty select the Balanced option under Client options
Head on over into Advanced Host Options and tick Enable hardware encoding, this is what will kickstart the NVidia, QuickSync, or DXVA encoding on the Gaming rig.
Into the Advanced Client Options set the Limit bandwith to Automatic (recommended). After all my testing with bandwidth settings, it seemed to be the best. DO NOT set it to unlimited, as for some obscure reason it just bloats the network connection and causes some major lag. If you have a solid Gigabit backbone running to each node on the network, feel free to try it out.
Set the Limit resolution to whatever your Client machine is hooked up to. In my case it was a 1080p TV.
Also tick Enable hardware decoding to kickstart the NVidia, QuickSync or DXVA decoding, again, as it's vastly quicker and superior in this instance to software.
Only untick Hardware encoding/decoding if using an exceptionally strong CPU on both Host and Client (i7, 8350)
For general monitoring and troubleshooting, tick the Display performance information box
QuickSync Guide
In order to enable QuickSync encoding and decoding, you'll have to follow some steps. First off, go into the BIOS of both Host and Client machines and ensure the iGPU is enabled even if you're primary display adapter is PEG. Also enable the virtualisation, and all other iGPU options available in your BIOS. This is important, as we're going to create a virtual display adapter to force QuickSync on.
Once you've rebooted, ensure you have the most recent Intel HD Graphics driver.
You can obtain that here:
http://downloadmirror.intel.com/24345/a08/Intel Driver Update Utility Installer.exe
Once you've updated and installed, reboot both machines with their updates iGPU driver.
Once you're on your desktop of the machines, Right Click the Desktop and click Screen Resolution
Click Detect to detect inactive video outputs
Select detected display output for Intel HD Graphics and select Try to connect anyway on VGA under the Multiple Displays dropdown menu
Click Apply Changes
Then Select your main display and select Extend these displays under Multiple Displays dropdown menu.
Click Apply again and Keep Changes. Then click OK to exit. To ensure QuickSync is now active, restart the machine and run a program capable of QuickSync usage. These include Handbrake, and Action! (Action! were the providers of this specific tutorial)
Troubleshooting
In order to troubleshoot any errors, you must first stream a game from the client machine. When you're logged into both Steam instances on the same account, the Client machine will have a Stream option instead of a Play option. Ensure you have Display performance information ticked in the client options before you run the game.
Once you've run the game for a few minutes, close it, and browse to C:\Program Files (x86)\Steam\Logs.
From here, open up streaming_log.txt to see information on how your game was streamed. This will tell you what encoders and decoders were used, sound, lag figures, and a number of other figures.
Explain in detail your hardware specs of both machines, your network connection details, and submit your last game stream instance in the streaming_log.txt either in this thread, or over in the Steam In-Home Streaming Discussion area. I shall certainly try my best to evaluate any issues and offer guidance, but the steam area is the place to go. Ensure you post there with the detailed system information at hand.
Before you cause yourself any issues with encoding and decoding errors, check the system specifications of your hardware first, and ensure it supports either NVidia encoding, QuickSync, or DVXA hardware acceleration. Manufacturer websites often display specifications on their product pages.
So far I've successfully ran Sonic All-Stars racing, Darksiders 2, as well as some non-steam games added manually to my library, including Grid Autosport. This was all tested on a stock i5 4670 as the Host, and a Pentium G3220 as a client machine.
Diagnosing IHS Logs - SOURCE
As mentioned in the pages above there's an easily accessible streaming performance display available while playing (by pressing GUIDE+Y or F6).
In addition there are logs stored on the host machine which give an overview of performance at the end of a streaming session.
These logs relate to the "Display" latency shown in the on-screen streaming statistics and network latency (in streaming_log.txt) along with some information on game latency (in the *Trace.txt files).
Looking at the steaming logs lets you:
- see session overview stats
- drill down to see how each step the game video takes towards rendering on the remote machine is performing.
- compare performance of different settings (by comparing the overviews of different sessions)
- possibly identify specific performance bottlenecks during the beta
Finding your streaming logs
If you're streaming from a Windows host you can find your general In-Home Streaming logs in the folders below (without the x86 bit if your machine is running a 32bit windows).
Directory of C:\Program Files (x86)\Steam\logs
12/02/2014 06:54 AM 1,700,905,420 StreamAudioTrace.txt
09/02/2014 09:34 AM 167,143 streaming_log.previous.txt
12/02/2014 06:59 AM 67,312 streaming_log.txt
12/02/2014 06:54 AM 867,258,814 StreamVideoTrace.txt
If using a Linux host (which I haven't yet) it should be trivial to find the streaming logs folder with a trusty find command:
find ~ -name "streaming_log.txt"
For SteamOS hosts the logs are found under
/home/steam/.local/share/Steam/logs
/home/steam/.local/share/Steam/streaming
For MacOS:
Originally posted by ♥♥♥♥matic2000:
OS 10.6.8 Mac users should find their logs in
[user name]/Library/Application Support/Steam/logs
The two *Trace.txt files hold massive detail about audio and video at the frame by frame level. They are kept until cleared manually but only collect data while the streaming graph is displayed. A much more concise versions of them can be taken with the screenshot capture.
If you end up capturing a screenshot and detailed video/audio stats for part of a session they end up as zips in:
Directory of C:\Program Files (x86)\Steam\streaming
12/02/2014 06:41 AM 1,469,755 Dark_Souls-_Prepare_to_Die_Edition_(211420)_02-12-14_06-41-08.zip
12/02/2014 06:53 AM 4,337,432 Tomb_Raider_(203160)_02-12-14_06-53-41.zip
Looking inside one of the zips we can see they have a cut down chunk of the *Trace.txt files and a nice screenshot.
12/02/2014 06:41 AM 3,138,700 Screenshot.png
12/02/2014 06:41 AM 790,068 StreamAudioTrace.txt
12/02/2014 06:41 AM 218,953 StreamVideoTrace.txt
For the moment I'm just looking at the overview stats from the gaming session, which are found in the much lighter streaming_log.txt
Looking at session statistics with streaming_log.txt
For an example I'm going to have a look at DiRT 3, which runs pretty well on my system.
Note: The streaming_log.txt file uses UNIX style line breaks, which Notepad doesn't handle well. If viewing it on a Windows system use Wordpad/write (maybe even Word) to preserve line breaks
[2014-02-20 23:40:05]
=====================================================================
Game: DiRT 3 (44320)
[2014-02-20 23:40:05] Recording on device: Realtek HDMI Output (ATI HDMI Audio)
[2014-02-20 23:40:05] Audio client mix format:
[2014-02-20 23:40:05] format: 65534
[2014-02-20 23:40:05] channels: 2
[2014-02-20 23:40:05] samples/sec: 48000
[2014-02-20 23:40:05] bytes/sec: 384000
[2014-02-20 23:40:05] alignment: 8
[2014-02-20 23:40:05] bits/sample: 32
[2014-02-20 23:40:05] channel mask: 0x3
[2014-02-20 23:40:05] data format: {00000003-0000-0010-8000-00AA00389B71}
[2014-02-20 23:40:05] Initializing audio with 2 channels and 48000 samples/sec
[2014-02-20 23:40:10] Detected 4 logical processors, using 2 threads
[2014-02-20 23:40:10] >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Capture method set to Desktop BitBlt RGB
[2014-02-20 23:40:31] >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Capture method set to Game async D3D11 NV12
The header shows some basic details about the capture methods being used.
It should be mostly the same for every streaming session, but what does look interesting is the Capture method:
Capture method set to Desktop BitBlt RGB
Capture method set to Game async D3D11 NV12
In this case D3 (aka annoyingly mixed-case DiRT 3) is using a newer DirectX 11 "asynchronous" capture method, meaning that it can do some extra steps in parallel.
Now we get to the performance information - the session statistics.
[2014-02-20 23:48:31] "SessionStats"
{
"TimeSubmitted" "1392904111"
"ResolutionX" "1280"
"ResolutionY" "720"
"CaptureName" "Game async D3D11 NV12"
"DecoderName" "VDPAU hardware decoding"
"BandwidthLimit" "10000"
"FramerateLimit" "50"
In this case, I'm running in 720p (ResolutionY) as my (recently upgraded) host machine has a CPU circa 2009 (an AMD Phenom II x4 945 - newer than I thought).
My SteamOS client is using VDPAU hardware decoding (DecoderName). According to wikipedia this is open source and courtesy of Nvidia - thanks Nvidia!
I've manually limited bandwidth to 10Mbps, and left framerate as Automatic - IHS has decided that a cap of 50 frames per second would be best.
The next chunk of SessionStats shows obvious problems that are causing poor performance:
"SlowSeconds" "0"
"SlowGamePercent" "0"
"SlowCapturePercent" "0"
"SlowConvertPercent" "0"
"SlowEncodePercent" "0"
"SlowNetworkPercent" "0"
"SlowDecodePercent" "0"
The Slow* chunks are pretty self exlanatory.
SlowGame - caused by the game itself running slow
SlowCapture - caused by copying the displayed frame into memory taking too long
SlowConvert - Erm... TO BE COMPLETED...
SlowEncode - caused by the CPU (or hardware encoder) taking a long time to encode a frame in to x264.
SlowNetwork - caused by network connection problems, or a lot of competing traffic on the network.
SlowDecode - caused by the client machine taking a long time to decode the frames.
Next we get onto the standard format for the performance statistcs, average (Avg) and standard deviation (StdDev) statistics for the streaming performance metrics.
From the Wikipedia Page on Standard deviation[en.wikipedia.org] (give them a donation or help fix a page - they love that):
In statistics and probability theory, the standard deviation ... shows how much variation or dispersion from the average exists. A low standard deviation indicates that the data points tend to be very close to the [average] a high standard deviation indicates that the data points are spread out over a large range of values.
For our purposes if the StdDev is small compared to Avg it means that there's generally consistent performance for this metric. If it's large it means that that metric could be causing spikey delays.
If the stat measures time it'll be in milliseconds.
"AvgClientBitrate" "63.820789337158203"
"StdDevClientBitrate" "16.055004119873047"
"AvgServerBitrate" "8809.0078125"
"StdDevServerBitrate" "14545.39453125"
ServerBitrate - the video+audo bitrate that the x264 encoder streaming to the client in Kbit/s.
ClientBitrate - bitrate the client is sending data (input and data confirmation) back to the server in Kbit/s
"AvgLinkBandwidth" "61510.49609375"
"AvgPingMS" "1.1842796802520752"
"StdDevPingMS" "0.25608810782432556"
LinkBandwidth - An estimation of available network bandwidth in Kbit/s
PingMS - Network round-trip time between the host and remote client
"AvgCaptureMS" "5.708702564239502"
"StdDevCaptureMS" "2.6058037281036377"
CaptureMS - How long it takes to make a copy of the current frame for encoding
"AvgConvertMS" "4.9717216491699219"
"StdDevConvertMS" "1.6487746238708496"
ConvertMS - TO BE COMPLETED
"AvgEncodeMS" "12.187912940979004"
"StdDevEncodeMS" "2.8964734077453613"
EncodeMS - Time taken to compress the frame for transmission to the client. This is one of the most expensive steps and is very CPU intensive (until hardware encoding is supported).
"AvgNetworkMS" "0.56417733430862427"
"StdDevNetworkMS" "0.11537900567054749"
NetworkMS - Time taken transferring the encoded frame to the client over the network. In a good setup this should be negligible.
"AvgDecodeMS" "3.3226580619812012"
"StdDevDecodeMS" "1.5122100114822388"
DecodeMS - Time taken by the client to decompress the video frame
"AvgDisplayMS" "4.4955034255981445"
"StdDevDisplayMS" "4.8185925483703613"
DisplayMS - Time taken to display the frame on the TV/Monitor
"AvgFrameMS" "43.798892974853516"
"StdDevFrameMS" "10.485637664794922"
FrameMS - Total time taken to stream the frame.
"AvgFPS" "46.833816528320312"
"StdDevFPS" "7.0818371772766113"
}
FPS - Frames per second
Looking at SteamVideoTrace.txt
As mentioned, SteamVideoTrace.txt in the logs folder is a massive file. The better way to go about looking at the frame by frame detail is to capture a screenshot zips (stored in the Steam/streaming directory). The capture of the data and screenshot is triggered in game with pressing F8 (keyboard) or GUIDE+X (controller) and can only be done while the performance graph is displayed.
It gives the same sort of detail as the performance log above, but with detail going down to individual frame by frame timings.
The below chunk is from streaming Tomb Raider (2013)
NETWORK: Ping: 1.19ms, Server: 9603 Kbit/s, Client: 64 Kbit/s, Link: 81516 Kbit/s, Packet loss: 0.00%
Frame: 2582, 24573 bytes, k_EStreamFrameEventStart at 60887.93ms
k_EStreamFrameEventCaptureBegin at 60908.10ms, delta: 20.17ms
k_EStreamFrameEventCaptureEnd at 60915.61ms, delta: 7.51ms
k_EStreamFrameEventConvertBegin at 60915.61ms, delta: 0.00ms
k_EStreamFrameEventConvertEnd at 60915.61ms, delta: 0.00ms
k_EStreamFrameEventEncodeBegin at 60915.61ms, delta: 0.00ms
k_EStreamFrameEventEncodeEnd at 60926.22ms, delta: 10.62ms
k_EStreamFrameEventSend at 60924.76ms, delta: -1.46ms
k_EStreamFrameEventRecv at 60925.36ms, delta: 0.60ms
k_EStreamFrameEventDecodeBegin at 60925.54ms, delta: 0.18ms
k_EStreamFrameEventDecodeEnd at 60927.81ms, delta: 2.27ms
k_EStreamFrameEventUploadBegin at 60927.99ms, delta: 0.18ms
k_EStreamFrameEventUploadEnd at 60928.22ms, delta: 0.23ms
k_EStreamFrameEventComplete at 60937.84ms, delta: 9.61ms
total frame time: 49.91ms, result = k_EStreamFrameResultDisplayed
From this we can see exactly what's happening for individual frames.
Delta is math slang for change in value, so we can see that there's a 20.17ms gap between start of the frame and the start of encoding (where I guess the game is rendering the frame before it can be captured).
The StreamAudioTrace.txt has similar details for the sound data.
Some games, in this case Dark Souls (which uses Direct3D 9 and performs poorly for me over streaming), have an additional chunk between frames.
total frame time: 31.13ms, result = k_EStreamFrameResultDisplayed, latency = 88.71ms (I0.4/G57.2/D31.1)
---------> k_EStreamInputEventStart at 149000.78ms, delta: 0.00ms
k_EStreamInputEventSend at 149000.78ms, delta: 0.00ms
k_EStreamInputEventRecv at 149001.05ms, delta: 0.27ms
k_EStreamInputEventHandled at 149006.61ms, delta: 5.55ms
I think this is covering an additional step required for frame capture under Direct3D 9. It also shows the Input (I), Game (G) and Display (D) latency. Given the frame rate I was initially getting in Dark Souls I'd believe that the game sometimes took 57ms to render.
Attachments
Last edited: