TribesNext

Welcome, Guest. Please login or register.
Did you miss your activation email?


TribesNext >  TribesNext.com Forums >  Support >  Video/game settings and you. « previous next »
Pages: [1] 2 3 ... 8 Print
Author Topic: Video/game settings and you.
Blakhart
Juggernaught
Posts: 1603

View Profile
May 28, 2011, 11:40:47 AM »
Greetings T2 players!
It is I, your Tribes Rabbi here with some gems of the settings kind to increase fps or image quality. Or both. Ahem. As with most everything fps is a balance of tradeoffs. Nice image quality vs pure frames per second. If all you want is fps, head straight to the color depth control of your vid card and set it to 16bit and read no further. If you want to see how good t2 (and most any other game) can look  with little fps impact, read on.

To begin with, let us discuss overall video card settings as found in any vid card driver control panel. There are two main controls that we are interested in right now. One of the settings is called Anistropic filtering, the other is the setting for Antialiasing. Aniso sharpens images, especially those in the distance, while anti does the opposite, it smudges images a bit to get rid of the jaggies. jaggies are the jagged lines that come from aliasing of pixels. We need them both for best image quality, but they do cost some fps.

See examples of aniso and anti here:
http://www.extremetech.com/article2/0,2845,2136956,00.asp

Now the vid cards of today, and some slightly older ones, can handle the max anisotropic filtering with very little if any performance impact. In this case often 16x anisoropic filtering is available and will make the game, most any game not just t2, look great while not affecting fps much.

 The real fps killer is antialiasing, more specifically the grievous memory reads and writes and the gpu calcs done on pixels when anti is cranked way up. Any more than 2x antialiasing will drop fps a good deal, and by good deal I mean by a noticeable amount. With the resolutions most lcds run at, and we should all be running at the native resolution of our lcds, high resolution does a lot towards getting rid of jaggies, but hi res is also an fps killer by itself as the vid card must draw x number of pixels by x number of pixels and then perform aniso and anti on them. This means all we need is to run 2x antialiasing to clean up the most horrid of the jaggies as a high res (greater than 1024x768 for example) naturally eliminates jaggies.

Keep in mind that one must force these options in a profile or other method in the driver control panel.
« Last Edit: May 28, 2011, 12:14:51 PM by Blakhart »
Blakhart
Juggernaught
Posts: 1603

View Profile
1: May 28, 2011, 12:00:44 PM »
So now that we have some basic vid card settings under our belts, we can talk about card specifics. By that I mean ati and nvidia. One setting that is kinda common to both ati and nvid is the threaded optimisation control. I have found that on some drivers and some cards you can enable this for t2 and play is fine, other cards and drivers it makes t2 stutter. You will have to test it on your system, if it is available.

Ati cards, when playing t2, should have temporal and/or adaptive antialiasing and Catalyst A.I. disabled for t2. These seem to cause trouble in t2 when enabled. Your mileage may vary but I have had a more stable t2 game without these options enabled. I suggest simply running 2x anti and 16x aniso for ati cards, but you may be able to enable the threaded optimisation.

As to nvid cards, I run 2x anti and 16x aniso and set the Antialiasing-Transparency control to supersampling, wich should be much nicer than when set to Multisampling. Also, I have noticed lag when multisampling was enabled rather than supersampling, wich is very odd since Supersampling is much more gpu and mem intensive than Multisampling. What these settings control is how textures look that have transparent parts, such as leaves on trees and grasses and so on. From what I gather the "alpha test" the game performs to see what is transparent and what is not for textures that are partially transparent is laggy when set to multisample rather than the higher quality supersampling, so in this case it's a win, but not a Charlie Sheen win.

SLI
If you have an sli system, meaning two or more vid cards installed (and I am talking nvid here as I have no experience with ati cards running crossfire), you can play t2 with sli enabled. You must enable sli in your control panel, and then go down and set the sli mode, either split frame rendering or alternating frame rendering. Split frame seems to offer more instant response to input from ouse and kb than alternate frame, and that is odd since split frame causes a lot more communication between the vid cards, meaning more latency is added, than if run in alternating frame mode. Pick one mode and see how it plays for you.
Blakhart
Juggernaught
Posts: 1603

View Profile
2: May 28, 2011, 12:13:23 PM »
In-Game settings
Disable vertex lighting; this is a ue maker. Set pretty much everything full right. The reason why full right is good is cuz it causes the game to force all textures into memory rather than nickle and diming these textures on call, wich causes video card memory traffic that is best avoided as that is also called lag. Set to 32bit color. Disable Interior Textured Fog, this may be an eater of fps with no real benefit. Disable the precipitaion if you find it annoying, and yes it does add to the cost in fps. Set the decals (bullet holes, footprints, etc) to your liking. Enable the texture compression setting and set to fastest - if you notice people walking through you or you walking through people, disable texture compression. Also, the terrain texture cache size line in clientprefs.cs may be set to 4096 rather than the 240 or so that it normaly is.

Some settings to try in clientprefs.cs:
(back up your original cs first)
$pref::OpenGL::maxHardwareLights = "8";
$pref::sceneLighting::cacheLighting = 4;
$pref::sceneLighting::cacheSize = 98304;
$pref::sceneLighting::purgeMethod = "lastModified";
$pref::sceneLighting::terrainGenerateLevel = 4;
« Last Edit: May 29, 2011, 06:19:02 AM by Blakhart »
Blakhart
Juggernaught
Posts: 1603

View Profile
3: May 29, 2011, 06:32:24 AM »
Nvidia goodness:
http://nvidia.custhelp.com/cgi-bin/nvidia.cfg/php/enduser/std_adp.php?p_faqid=2624

"Question
  In the launch drivers for GeForce GTX 400 series GPUs, there was a bug in the Transparency Antialiasing implementation that enabled full-screen supersampling. Is there any way to still get full-screen supersampling in Release 256?
 
  Answer
  Yes. Release 256 drivers do fix the implementation of Transparency Antialiasing (TRAA) and now offer up to 25% performance improvements with TRAA enabled. However, since some of our gaming really enthusiasts liked the full-screen supersampling, we have created a tool for users that allows them to enable 2x, 4x, and 8x full-screen supersampling. "

If you have an nvid card that is an 8800 or newer core, you can use this tool from nvid that will enable full screen SSAA (Super Sample Anti Aliasing) in all games. This makes t2 look better than I have ever seen it. With 2x antialiasing and 16x anisotropic filtering enabled in the driver control panel, just fire up the SSAA tool and set it to 2x SSAA and enjoy. You must also have an nvid driver that is of the 25xxx series or newer. Keep in mind that this full screen SSAA placeas a relatively huge load on your vid card, but if your card has the power to pull it off with playable fps you will be rewarded with outstanding image quality. It really makes t2 look good. Sorry ati cards, this is nvid only. But you had nice image quality all the time so don't feel bad!
Heat Killer
Scout

Posts: 479

View Profile
4: May 31, 2011, 05:07:07 PM »
*slow clap*
Nicely done.

Blakhart
Juggernaught
Posts: 1603

View Profile
5: June 03, 2011, 06:51:08 AM »
Here are some helps for the old time ati cards, the 95/96/97/9800 series.

First off, use a driver that was written when the card was still new - and this advice also applies to just about any vid card. This means mostly the cat 5.11 or thereabouts. This driver will work fine in t2, and has an option to enable threaded optimisation, and should play t2 without stuttering. If the cat 5.11 series doesn't work for your os, not much I can do for you. As to the later ati cards, use a new(er) driver, they should play fine if you follow the above hints on ati cards.



pbjonathan
Nugget
Posts: 3

View Profile
6: June 04, 2011, 06:32:22 PM »
thanks for the info I have a newer nvidia card and some of these settings helped a lot
Blakhart
Juggernaught
Posts: 1603

View Profile
7: June 06, 2011, 06:05:35 AM »
Glad someone finds this info helpfull.

Also, here's a tip from Capt. Kinzi:
Code:
SetPerfCounterEnable(0);
Capt. Kinzi: cook some derms for me!

Copy the above code and paste it into a .txt file, save it, and rename it to fix.cs, pop it into the gamedata/base/scripts/autoexec folder. You can name it anything you want to that is not already taken, actually, as long as it ends in .cs. If you had microstutter in game before due to running t2 on a multicore system, this "fix" should eliminate or at least reduce the stuttering. With my system being as highly strung as it is, I find the game is smoother with it set to 1 rather than 0, most will find 0 (zero, not O) works best. In the pc world, 1 means true, on, or enabled, 0 means false, off, or disabled, at least as far as booleans go. Try it both ways and see what this boolean can do for you!
Blakhart
Juggernaught
Posts: 1603

View Profile
8: June 09, 2011, 04:44:50 AM »
For those with older ati cards and having issues seeing the game menues:

Code:
// ----
//
//  270 fps to 13ms refresh
//
// ----

$radeonAAfix::refresh = 13;

// ----

function GuiCanvas::RadeonAAfix( %this )
{
    if( playGui.isAwake() )
        return;
    if( $fps::real > 10 )
        %this.repaint();

    %refresh = mfloor( $radeonAAfix::refresh );
    $radeonAAfix::thread = %this.schedule( %refresh, RadeonAAfix );
}

package RadeonAAfix
{
    function PlayGui::onWake( %this )
    {
        parent::onWake( %this );
        cancel( $radeonAAfix::thread );
    }

    function PlayGui::onSleep( %this )
    {
        parent::onSleep( %this );
        canvas.RadeonAAfix();
    }
};

activatePackage( RadeonAAfix );
canvas.RadeonAAfix();
Blakhart
Juggernaught
Posts: 1603

View Profile
9: June 15, 2011, 06:09:01 AM »
A word on vsynch.

If you are displeased by screen tearing in game, there is a method to reduce that tearing, and also to reduce heat, noise, and power consumption in your game system.

An example of screen tearing:
http://en.wikipedia.org/wiki/Screen_tearing

What can be done to eliminate screen tearing is to synch each frame rendered of the game with the refresh rate of the monitor as described in the above wiki link.

There actually is a control in t2 to enable this but most operating systems or vid card drivers override this in-game control, so we must use a driver control panel to force vsynch, or even employ a 3rd party app to force vsynch.

Here is an example of a 3rd party refresh rate locker:
http://www.pagehosting.co.uk/rl/

To use it one must rtfm. In short, you set the lock to the same frequency as your monitor's fastest suitable refresh rate. If you have a driver control panel or operating system control that can do this you are better off as it will or should then be automatic in operation rather than having to start the app each time one wished to play. So now we have cleaned up the tearing but we have mucked the performance a bit, haven't we? I mean going from 400fps with tearing to the refresh rate of our monitor (60 to 120Hz in most cases) without tearing, we feel disarmed and helpless against those who are running at a higher fps.

One way to empower ourselves against "high fps barstewards" is to go into the driver control panel and enable triple buffering. Here is why triple buffering is a joy:
http://www.anandtech.com/show/2794

If you enable vsynch, you should enable triple buffering. You will get a much smoother and responsive game and the added buffer will make sure you can drop an old frame that has since passed its accuracy of gamestate for a new one instantly. Well, really your vid card does it for you.


The reduced heat, noise, and power use that I mentioned earlier stems from the locking of the frame rate to vsynch. Your vid card is running nowhere near full throttle, it is loafing along at your refresh rate. This makes the card run much cooler than if it was at 400fps for 20 minutes. Less work in the vid card means less heat, and also less power usage. Your vid card should last much longer. If you have voiltage regulator whine noise in games from your vid card running at wide open throttle, this whine should be reduced or even eliminated if you run vsynch.

Another benefit I find from the combinatiojn of vsynch and triple buffering is the consistency of play. When you are always at (add your refresh rate here) your game is much more predictable than with the fps all over the place as with vsynch disabled.
Blakhart
Juggernaught
Posts: 1603

View Profile
10: June 15, 2011, 06:22:00 AM »
For the folks with onboard grafix:
Code:
// #autoload
// #name = FrameSkippa
// #version = 1.0
// #author = {Geez}Bluez
// #warrior =  Bluez
// #email = Bluez@oldfogieshome.com
// #status = Release
// #include = support/team_tracker.cs
// #description = Increases FPS by skipping predetermined frameskip settings.
// #config = FrameSkippa_Config

function FrameSkippa_GUI(%this) {
new ShellFieldCtrl(FrameSkippa_Config) {
profile = "ShellFieldProfile";
horizSizing = "center";
vertSizing = "center";
position = "131 122";
extent = "138 109";
minExtent = "16 18";
visible = "1";
hideCursor = "0";
bypassHideCursor = "0";
helpTag = "0";

new ShellFieldCtrl() {
profile = "ShellFieldProfile";
horizSizing = "right";
vertSizing = "bottom";
position = "5 4";
extent = "128 26";
minExtent = "16 18";
visible = "1";
hideCursor = "0";
bypassHideCursor = "0";
helpTag = "0";
};
new ShellFieldCtrl() {
profile = "ShellFieldProfile";
horizSizing = "right";
vertSizing = "bottom";
position = "4 83";
extent = "128 22";
minExtent = "16 18";
visible = "1";
hideCursor = "0";
bypassHideCursor = "0";
helpTag = "0";
};
new GuiTextCtrl(frameskipvalue) {
profile = "ShellTextCenterProfile";
horizSizing = "right";
vertSizing = "bottom";
position = "1 85";
extent = "134 22";
minExtent = "8 8";
visible = "1";
hideCursor = "0";
bypassHideCursor = "0";
helpTag = "0";
longTextBuffer = "0";
maxLength = "255";
};
new GuiTextCtrl() {
profile = "BrowserH1Profile";
horizSizing = "center";
vertSizing = "bottom";
position = "7 3";
extent = "124 32";
minExtent = "8 8";
visible = "1";
hideCursor = "0";
bypassHideCursor = "0";
helpTag = "0";
text = "Frame Skippa\'";
longTextBuffer = "0";
maxLength = "255";
};
new ShellBitmapButton() {
profile = "ShellButtonProfile";
horizSizing = "right";
vertSizing = "bottom";
position = "102 50";
extent = "42 38";
minExtent = "32 38";
visible = "1";
hideCursor = "0";
bypassHideCursor = "0";
command = "$pref::FrameSkippa::Value = 5; Frameskippa_set();";
helpTag = "0";
text = "5";
simpleStyle = "0";
};
new ShellBitmapButton() {
profile = "ShellButtonProfile";
horizSizing = "right";
vertSizing = "bottom";
position = "-5 50";
extent = "42 38";
minExtent = "32 38";
visible = "1";
hideCursor = "0";
bypassHideCursor = "0";
command = "$pref::FrameSkippa::Value = 1; Frameskippa_set();";
helpTag = "0";
text = "1";
simpleStyle = "0";
};
new ShellBitmapButton() {
profile = "ShellButtonProfile";
horizSizing = "right";
vertSizing = "bottom";
position = "22 50";
extent = "42 38";
minExtent = "32 38";
visible = "1";
hideCursor = "0";
bypassHideCursor = "0";
command = "$pref::FrameSkippa::Value = 2; Frameskippa_set();";
helpTag = "0";
text = "2";
simpleStyle = "0";
};
new ShellBitmapButton() {
profile = "ShellButtonProfile";
horizSizing = "right";
vertSizing = "bottom";
position = "48 50";
extent = "42 38";
minExtent = "32 38";
visible = "1";
hideCursor = "0";
bypassHideCursor = "0";
command = "$pref::FrameSkippa::Value = 3; Frameskippa_set();";
helpTag = "0";
text = "3";
simpleStyle = "0";
};
new ShellBitmapButton() {
profile = "ShellButtonProfile";
horizSizing = "right";
vertSizing = "bottom";
position = "75 50";
extent = "42 38";
minExtent = "32 38";
visible = "1";
hideCursor = "0";
bypassHideCursor = "0";
command = "$pref::FrameSkippa::Value = 4; Frameskippa_set();";
helpTag = "0";
text = "4";
simpleStyle = "0";
};
new ShellBitmapButton() {
profile = "ShellButtonProfile";
horizSizing = "right";
vertSizing = "bottom";
position = "-5 24";
extent = "147 38";
minExtent = "32 38";
visible = "1";
hideCursor = "0";
bypassHideCursor = "0";
command = "$pref::FrameSkippa::Value = 0; Frameskippa_set();";
helpTag = "0";
text = "Disable/Default 0";
simpleStyle = "0";
};
};
             if($pref::FrameSkippa::Value $= "")
                $pref::FrameSkippa::Value = 0;
                else
                Frameskippa_set();
}
 
package FrameSkippa {
function Frameskippa_set(%this) {
         $frameskip = $pref::FrameSkippa::Value;
         frameskipvalue.setValue("CURRENT SETTING:" SPC ($pref::FrameSkippa::Value)); }
};
activatePackage(FrameSkippa);
callback.add(TeamUpdated, Frameskippa_set);
FrameSkippa_GUI();

What the above code does is "Increases FPS by skipping predetermined frameskip settings".

Like most scripts, this script is support.vl2 aware, so you should have support.vl2 if you do not already. After placing the script (first copy/save as fs.cs or some other desired name) into your autoexec folder you then fire up the game and get to the script option and set it to 2 for some tesing. Play a bit and see if you like it. It is pretty much a full time interpolate script in effect. I find that a setting of 3 is way too much, 2 is just fine and gives a decent apparent boost, and 1 does little to nothing. If you run into ues with this script, and I have, either change settings or disable/delete it and go on your merry way.

This script will show higher fps than refresh rate if you use vsynch and this script. This is normal and vsynch is still working.
« Last Edit: August 14, 2011, 01:56:07 PM by Blakhart »
Blakhart
Juggernaught
Posts: 1603

View Profile
11: June 30, 2011, 05:22:32 AM »
Texture Filtering

Texture filtering is a control found in most vid card driver control panels. This control is basically a cheat control. Cheat in the sense that this control modifies how accurately the vid card renders a scene, either as the scene is presented and according to all setrtings such as aniso or antialias filtration, or if the vid card can skip some filtering routines for the sake of speed or less memory taken.

The settings typically range from High Performance to High Quality, with High Quality pretty much making the vid card respond to every game frame being drawn precisely as the game calls it to be, whereas High Performance allows the vid card to skip a alot of detail that would make the game look better but cost a bit in fps. All you have to remember is High Performance means fast and ugly, High Quality means slower but prettier.  Usually much prettier.

When one installs a vid card driver the driver usualy sets everything to a default of Quality  texture filtering, and while this is not the worst, it is not the best. This filtering level helps vid card makers get higher scores in benchmarks but it costs in image quality in games. And we all know that T2, while looking great in 2001, is quite ugly compared to most pc games of today. This means we should give T2 all the help it can get.

Here's a writeup on the issue with examples:
http://www.firingsquad.com/hardware/ati_nvidia_image_quality_showdown_august06/

Now, if you never noticed the effect of texture shimmer bef\ore, I am sorry to have made you aware, same goes for the need for anisotropic filtering and antialiasing as described above. But shimmer I find to be distracting as it actually moves as you do so it catches the eye. The way to best reduce texture shimmer is to run the control at High Quality to reduce texture shimmering to a minimum. There will still be some shimmer in odd places at High Quality, but much reduced over settings such as High Performance. Try the various texture filter settings to see what is given up for fps performance.

« Last Edit: July 01, 2011, 05:26:29 AM by Blakhart »
Blakhart
Juggernaught
Posts: 1603

View Profile
12: July 04, 2011, 01:14:53 PM »
This script keeps tabs on your ping and fps map by map and creates a hard copy. It logs in the log folder of your t2 install, view it to see your stats as far as system performance goes. As always, copy/save as serverstuff.cs, paste into the autoexec folder of your scripts folder. Works automatically.

Code:
// #autoload
// #name = ServerStuff
// #version = 0.1
// #author = ilys
// #category = ilys' Scripts
// #include = support/callback.cs
// #include = support/mission_callbacks.cs
// #include = support/file_tools.cs

$ServerStuff::ShowHud = 0;
$ServerStuff::PingNum = 0;
$ServerStuff::CurrentPing = 0;
$ServerStuff::TotalPing = 0;
$ServerStuff::MaxPing = 0;
$ServerStuff::MinPing = 0;
$ServerStuff::AvPing = 0;
$ServerStuff::PLNum = 0;
$ServerStuff::CurrentPL = 0;
$ServerStuff::TotalPL = 0;
$ServerStuff::MaxPL = 0;
$ServerStuff::MinPL = 0;
$ServerStuff::AvPL = 0;
$ServerStuff::FPSNum = 0;
$ServerStuff::CurrentFPS = 0;
$ServerStuff::TotalFPS = 0;
$ServerStuff::MaxFPS = 0;
$ServerStuff::MinFPS = 0;
$ServerStuff::AvFPS = 0;
$ServerStuff::ServerTimeSec = "0"@0;
$ServerStuff::ServerTimeMin = "0"@0;
$ServerStuff::ServerTimeHour = "0"@0;
$ServerStuff::MapTimeSec = "0"@0;
$ServerStuff::MapTimeMin = "0"@0;
$ServerStuff::MapTimeHour = "0"@0;

package ServerStuff {
function PlayGui::onWake(%this)
{
Callback.add(onMatchStart, "ServerStuffReset");
Callback.add(onGameOver, "ServerStuffExportLog");
Callback.add(onUserClientDrop, "ServerStuffExportServerLog");
parent::onWake(%this);
if(!isObject(PlayGui)) return;
if(isObject(ServerStuffHud)) return;
new GuiControlProfile ("SSHudLabel")
{
fontType = "Univers Condensed";
fontSize = 16;
fontColor = "255 255 255";
justify = "center";
};
new GuiControlProfile ("SSHudText")
{
fontType = "Univers Condensed";
fontSize = 16;
fontColor = "0 255 0";
justify = "center";
};
new ShellFieldCtrl(ServerStuffHud)
{
profile = "GuiChatBackProfile";
horizSizing = "left";
vertSizing = "bottom";
extent = "300 185";
visible = "0";
new GuiTextCtrl()
{
profile = "SSHudLabel";
horizSizing = "right";
vertSizing = "bottom";
position = "0 0";
extent = "100 16 ";
visible = "1";
text = "Server Name:";
};
new GuiMLTextCtrl(SSServerName)
{
profile = "SSHudText";
horizSizing = "right";
vertSizing = "bottom";
position = "100 0";
extent = "200 16 ";
visible = "1";
};
new GuiTextCtrl()
{
profile = "SSHudLabel";
horizSizing = "right";
vertSizing = "bottom";
position = "0 20";
extent = "100 16 ";
visible = "1";
text = "Server IP:";
};
new GuiMLTextCtrl(SSServerIP)
{
profile = "SSHudText";
horizSizing = "right";
vertSizing = "bottom";
position = "100 20";
extent = "200 16 ";
visible = "1";
};
new GuiTextCtrl()
{
profile = "SSHudLabel";
horizSizing = "right";
vertSizing = "bottom";
position = "0 40";
extent = "100 16 ";
visible = "1";
text = "Server Map Name:";
};
new GuiMLTextCtrl(SSServerMapName)
{
profile = "SSHudText";
horizSizing = "right";
vertSizing = "bottom";
position = "100 40";
extent = "200 16 ";
visible = "1";
};
new GuiTextCtrl()
{
profile = "SSHudLabel";
horizSizing = "right";
vertSizing = "bottom";
position = "0 60";
extent = "100 16 ";
visible = "1";
text = "Server Map Type:";
};
new GuiMLTextCtrl(SSServerMapType)
{
profile = "SSHudText";
horizSizing = "right";
vertSizing = "bottom";
position = "100 60";
extent = "200 16 ";
visible = "1";
};
new GuiTextCtrl()
{
profile = "SSHudLabel";
horizSizing = "right";
vertSizing = "bottom";
position = "0 80";
extent = "100 16 ";
visible = "1";
text = "Current Ping:";
};
new GuiMLTextCtrl(SSCurPing)
{
profile = "SSHudText";
horizSizing = "right";
vertSizing = "bottom";
position = "100 80";
extent = "200 16 ";
visible = "1";
};
new GuiTextCtrl()
{
profile = "SSHudLabel";
horizSizing = "right";
vertSizing = "bottom";
position = "150 80";
extent = "100 16 ";
visible = "1";
text = "Average Ping:";
};
new GuiMLTextCtrl(SSAvPing)
{
profile = "SSHudText";
horizSizing = "right";
vertSizing = "bottom";
position = "250 80";
extent = "200 16 ";
visible = "1";
};
new GuiTextCtrl()
{
profile = "SSHudLabel";
horizSizing = "right";
vertSizing = "bottom";
position = "0 100";
extent = "100 16 ";
visible = "1";
text = "Lowest Ping:";
};
new GuiMLTextCtrl(SSMinPing)
{
profile = "SSHudText";
horizSizing = "right";
vertSizing = "bottom";
position = "100 100";
extent = "200 16 ";
visible = "1";
};
new GuiTextCtrl()
{
profile = "SSHudLabel";
horizSizing = "right";
vertSizing = "bottom";
position = "150 100";
extent = "100 16 ";
visible = "1";
text = "Highest Ping:";
};
new GuiMLTextCtrl(SSMaxPing)
{
profile = "SSHudText";
horizSizing = "right";
vertSizing = "bottom";
position = "250 100";
extent = "200 16 ";
visible = "1";
};
new GuiTextCtrl()
{
profile = "SSHudLabel";
horizSizing = "right";
vertSizing = "bottom";
position = "0 120";
extent = "100 16 ";
visible = "1";
text = "Current FPS:";
};
new GuiMLTextCtrl(SSCurFPS)
{
profile = "SSHudText";
horizSizing = "right";
vertSizing = "bottom";
position = "100 120";
extent = "200 16 ";
visible = "1";
};
new GuiTextCtrl()
{
profile = "SSHudLabel";
horizSizing = "right";
vertSizing = "bottom";
position = "150 120";
extent = "100 16 ";
visible = "1";
text = "Average FPS:";
};
new GuiMLTextCtrl(SSAvFPS)
{
profile = "SSHudText";
horizSizing = "right";
vertSizing = "bottom";
position = "250 120";
extent = "250 16 ";
visible = "1";
};
new GuiTextCtrl()
{
profile = "SSHudLabel";
horizSizing = "right";
vertSizing = "bottom";
position = "0 140";
extent = "100 16 ";
visible = "1";
text = "Lowest FPS:";
};
new GuiMLTextCtrl(SSMinFPS)
{
profile = "SSHudText";
horizSizing = "right";
vertSizing = "bottom";
position = "100 140";
extent = "200 16 ";
visible = "1";
};
new GuiTextCtrl()
{
profile = "SSHudLabel";
horizSizing = "right";
vertSizing = "bottom";
position = "150 140";
extent = "100 16 ";
visible = "1";
text = "Highest FPS:";
};
new GuiMLTextCtrl(SSMaxFPS)
{
profile = "SSHudText";
horizSizing = "right";
vertSizing = "bottom";
position = "250 140";
extent = "200 16 ";
visible = "1";
};
new GuiTextCtrl()
{
profile = "SSHudLabel";
horizSizing = "right";
vertSizing = "bottom";
position = "0 160";
extent = "100 16 ";
visible = "1";
text = "Total Time:";
};
new GuiMLTextCtrl(SSServerTime)
{
profile = "SSHudText";
horizSizing = "right";
vertSizing = "bottom";
position = "100 160";
extent = "200 16 ";
visible = "1";
};
new GuiTextCtrl()
{
profile = "SSHudLabel";
horizSizing = "right";
vertSizing = "bottom";
position = "150 160";
extent = "100 16 ";
visible = "1";
text = "Map Time:";
};
new GuiMLTextCtrl(SSMapTime)
{
profile = "SSHudText";
horizSizing = "right";
vertSizing = "bottom";
position = "250 160";
extent = "200 16 ";
visible = "1";
};
};
playGui.add(ServerStuffHud);
if(isObject(HM) && isObject(HudMover)) hudmover::addhud(ServerStuffHud,"ServerStuff");
ServerStuffUpdateHud();
ServerStuffUpdatePL();
ServerStuffUpdateTime();
ServerStuffUpdatePing();
ServerStuffUpdateFPS();
}

function OptionsDlg::onWake( %this )
{
if($ServerStuff::Binds != 1)
{
$RemapName[$RemapCount]="Toggle SSHud";
$RemapCmd[$RemapCount]="ServerStuffToggleHud";
$RemapCount++;
$ServerStuff::Binds = 1;
}
GlobalActionMap.copyBind(moveMap, ServerStuffToggleHud);
parent::onWake( %this );
}

function handleClientJoin(%msgType, %msgString, %clientName, %clientId, %targetId, %isAI, %isAdmin, %isSuperAdmin, %isSmurf, %guid)
{
parent::handleClientJoin(%msgType, %msgString, %clientName, %clientId, %targetId, %isAI, %isAdmin, %isSuperAdmin, %isSmurf, %guid);
if(StrStr(%msgString, "Welcome to Tribes") != -1) $ClientRep = $PlayerList[%clientID];
}

function ServerStuffToggleHud( %val )
{
if (%val)
{
$ServerStuff::ShowHud = !$ServerStuff::ShowHud;
ServerStuffHud.setVisible($ServerStuff::ShowHud);
if ($ServerStuff::ShowHud) ServerStuffUpdateHud();
}
}

function ServerStuffUpdateHud()
{
$SSServerName = MissionCallback.getServerName();
SSServerName.setValue($SSServerName);
$SSServerIP = MissionCallback.getServerAddress();
SSServerIP.setValue($SSServerIP);
$SSServerMapName = MissionCallback.getMissionName();
SSServerMapName.setValue($SSServerMapName);
$SSServerMod = MissionCallback.getServerMod();
$SSServerMapType = MissionCallback.getMissionType();
SSServerMapType.setValue($SSServerMod @ " - " @ $SSServerMapType);
}

function ServerStuffUpdatePing()
{
$ServerStuff::PingNum++;
$ServerStuff::TotalPing = $ServerStuff::TotalPing+$ServerStuff::CurrentPing;
$ServerStuff::AvPing = mFloor($ServerStuff::TotalPing / $ServerStuff::PingNum);
if($ServerStuff::CurrentPing > $ServerStuff::MaxPing || $ServerStuff::MaxPing == 0)
$ServerStuff::MaxPing = $ServerStuff::CurrentPing;
if($ServerStuff::CurrentPing < $ServerStuff::MinPing || $ServerStuff::MinPing == 0)
$ServerStuff::MinPing = $ServerStuff::CurrentPing;
SSCurPing.setValue($ServerStuff::CurrentPing@" / "@$ServerStuff::CurrentPL@"%");
SSAvPing.setValue($ServerStuff::AvPing@" / "@$ServerStuff::AvPL@"%");
SSMinPing.setValue($ServerStuff::MinPing@" / "@$ServerStuff::MinPL@"%");
SSMaxPing.setValue($ServerStuff::MaxPing@" / "@$ServerStuff::MaxPL@"%");
if ($ServerStuffPingSchedule != 0) cancel($ServerStuffPingSchedule);
$ServerStuffPingSchedule = schedule(2500, 0, ServerStuffUpdatePing);
}

function ServerStuffUpdatePL()
{
commandToServer( 'getScores' );
$ServerStuff::PLNum++;
$ServerStuff::CurrentPL = $ClientRep.packetLoss;
$ServerStuff::TotalPL = $ServerStuff::TotalPL+$ServerStuff::CurrentPL;
$ServerStuff::AvPL = mFloor($ServerStuff::TotalPL / $ServerStuff::PLNum);
if($ServerStuff::CurrentPL > $ServerStuff::MaxPL || $ServerStuff::MaxPL == 0)
$ServerStuff::MaxPL = $ServerStuff::CurrentPL;
if($ServerStuff::CurrentPL < $ServerStuff::MinPL || $ServerStuff::MinPL == 0)
$ServerStuff::MinPL = $ServerStuff::CurrentPL;
if ($ServerStuffPLSchedule != 0) cancel($ServerStuffPLSchedule);
$ServerStuffPLSchedule = schedule(5000, 0, ServerStuffUpdatePL);
}

function ServerStuffUpdateFPS()
{
$ServerStuff::FPSNum++;
$ServerStuff::TotalFPS = $ServerStuff::TotalFPS+$ServerStuff::CurrentFPS;
$ServerStuff::AvFPS = mFloor($ServerStuff::TotalFPS / $ServerStuff::FPSNum);
if($ServerStuff::CurrentFPS > $ServerStuff::MaxFPS || $ServerStuff::MaxFPS == 0)
$ServerStuff::MaxFPS = $ServerStuff::CurrentFPS;
if($ServerStuff::CurrentFPS < $ServerStuff::MinFPS || $ServerStuff::MinFPS == 0)
$ServerStuff::MinFPS = $ServerStuff::CurrentFPS;
SSCurFPS.setValue($ServerStuff::CurrentFPS);
SSAvFPS.setValue($ServerStuff::AvFPS);
SSMinFPS.setValue($ServerStuff::MinFPS);
SSMaxFPS.setValue($ServerStuff::MaxFPS);
if ($ServerStuffFPSSchedule != 0) cancel($ServerStuffFPSSchedule);
$ServerStuffFPSSchedule = schedule(2500, 0, ServerStuffUpdateFPS);
}

function ServerStuffUpdateTime()
{
$ServerStuff::ServerTimeSec++;
if(strLen($ServerStuff::ServerTimeSec) == 1) $ServerStuff::ServerTimeSec = "0"@$ServerStuff::ServerTimeSec;
if($ServerStuff::ServerTimeSec == 60)
{
$ServerStuff::ServerTimeSec = "0"@0;
$ServerStuff::ServerTimeMin++;
if(strLen($ServerStuff::ServerTimeMin) == 1) $ServerStuff::ServerTimeMin = "0"@$ServerStuff::ServerTimeMin;
}
if($ServerStuff::ServerTimeMin == 60)
{
$ServerStuff::ServerTimeMin = "0"@0;
$ServerStuff::ServerTimeHour++;
if(strLen($ServerStuff::ServerTimeHour) == 1) $ServerStuff::ServerTimeHour = "0"@$ServerStuff::ServerTimeHour;
}
$ServerStuff::ServerTime = $ServerStuff::ServerTimeHour @ ":" @ $ServerStuff::ServerTimeMin @ ":" @ $ServerStuff::ServerTimeSec;
$ServerStuff::MapTimeSec++;
if(strLen($ServerStuff::MapTimeSec) == 1) $ServerStuff::MapTimeSec = "0"@$ServerStuff::MapTimeSec;
if($ServerStuff::MapTimeSec == 60)
{
$ServerStuff::MapTimeSec = "0"@0;
$ServerStuff::MapTimeMin++;
if(strLen($ServerStuff::MapTimeMin) == 1) $ServerStuff::MapTimeMin = "0"@$ServerStuff::MapTimeMin;
}
if($ServerStuff::MapTimeMin == 60)
{
$ServerStuff::MapTimeMin = "0"@0;
$ServerStuff::MapTimeHour++;
if(strLen($ServerStuff::MapTimeHour) == 1) $ServerStuff::MapTimeHour = "0"@$ServerStuff::MapTimeHour;
}
$ServerStuff::MapTime = $ServerStuff::MapTimeHour @ ":" @ $ServerStuff::MapTimeMin @ ":" @ $ServerStuff::MapTimeSec;
SSServerTime.setValue($ServerStuff::ServerTime);
SSMapTime.setValue($ServerStuff::MapTime);
if ($ServerStuffTimeSchedule != 0) cancel($ServerStuffTimeSchedule);
$ServerStuffTimeSchedule = schedule(1000, 0, ServerStuffUpdateTime);
}

function ServerStuffReset()
{
ServerStuffUpdateHud();
error("Resetting Settings");
$ServerStuff::PingNum = 0;
$ServerStuff::CurrentPing = 0;
$ServerStuff::TotalPing = 0;
$ServerStuff::MaxPing = 0;
$ServerStuff::MinPing = 0;
$ServerStuff::AvPing = 0;
$ServerStuff::PLNum = 0;
$ServerStuff::CurrentPL = 0;
$ServerStuff::TotalPL = 0;
$ServerStuff::MaxPL = 0;
$ServerStuff::MinPL = 0;
$ServerStuff::AvPL = 0;
$ServerStuff::FPSNum = 0;
$ServerStuff::CurrentFPS = 0;
$ServerStuff::TotalFPS = 0;
$ServerStuff::MaxFPS = 0;
$ServerStuff::MinFPS = 0;
$ServerStuff::AvFPS = 0;
$ServerStuff::MapTimeSec = "0"@0;
$ServerStuff::MapTimeMin = "0"@0;
$ServerStuff::MapTimeHour = "0"@0;
}

function ServerStuffExportLog()
{
error("Exporting Log");
%SSSave = new FileObject();
%SSSave.openForWrite("logs/");
%SSSave.close();
%SSSave.openForAppend("logs/ServerStuff.log");
%SSSave.appendLine("logs/ServerStuff.log", "");
%SSSave.appendLine("logs/ServerStuff.log", "Log Date: " @ formatTimeString("mm/dd/yy") @ "\tLog Time: " @ formatTimeString("HH:nn:ss"));
%SSSave.appendLine("logs/ServerStuff.log", "Server Name: " @ $SSServerName);
%SSSave.appendLine("logs/ServerStuff.log", "Server IP: " @ $SSServerIP);
%SSSave.appendLine("logs/ServerStuff.log", "Server Map Name: " @ $SSServerMapName);
%SSSave.appendLine("logs/ServerStuff.log", "Server Map Type: " @ $SSServerMod @ " - " @ $SSServerMapType);
%SSSave.appendLine("logs/ServerStuff.log", "Lowest Ping: " @ $ServerStuff::MinPing@"/"@$ServerStuff::MinPL@"%" @ "\tLowest FPS: " @ $ServerStuff::MinFPS);
%SSSave.appendLine("logs/ServerStuff.log", "Highest Ping: " @ $ServerStuff::MaxPing@"/"@$ServerStuff::MaxPL@"%" @ "\tHighest FPS: " @ $ServerStuff::MaxFPS);
%SSSave.appendLine("logs/ServerStuff.log", "Average Ping: " @ $ServerStuff::AvPing@"/"@$ServerStuff::AvPL@"%" @ "\tAverage FPS: " @ $ServerStuff::AvFPS);
%SSSave.appendLine("logs/ServerStuff.log", "Total Time: " @ $ServerStuff::ServerTime @ "\tMap Time: " @ $ServerStuff::MapTime);
%SSSave.close();
%SSSave.delete();
ServerStuffReset();
}

function ServerStuffExportServerLog()
{
ServerStuffExportLog();
$ServerStuff::ServerTimeSec = "0"@0;
$ServerStuff::ServerTimeMin = "0"@0;
$ServerStuff::ServerTimeHour = "0"@0;
error("Closing Schedules");
if ($ServerStuffTimeSchedule != 0) cancel($ServerStuffTimeSchedule);
if ($ServerStuffFPSSchedule != 0) cancel($ServerStuffFPSSchedule);
if ($ServerStuffPingSchedule != 0) cancel($ServerStuffPingSchedule);
if ($ServerStuffPLSchedule != 0) cancel($ServerStuffPLSchedule);
error("Killing Hud");
if (isObject(ServerStuffHud))
{
playGui.remove(ServerStuffHud);
ServerStuffHud.delete();
}
}

function NetBarHud::infoUpdate(%this, %ping, %packetLoss, %sendPackets, %sendBytes, %receivePackets, %receiveBytes)
{
parent::infoUpdate(%this, %ping, %packetLoss, %sendPackets, %sendBytes, %receivePackets, %receiveBytes);
$ServerStuff::CurrentPing = mFloor(%ping);
$ServerStuff::CurrentFPS = mFloor($fps::real);
}
};
activatePackage(ServerStuff);

Example output:
Log Date: 07/04/2011   Log Time: 16:59:57
Server Name: Goon Haven
Server IP: 67.222.138.111:28000
Server Map Name: SoylentGreen
Server Map Type: classic - Capture the Flag
Lowest Ping: 48/0%   Lowest FPS: 94
Highest Ping: 167/6%   Highest FPS: 102
Average Ping: 77/0%   Average FPS: 97
Total Time: 01:26:31   Map Time: 00:18:03
Blakhart
Juggernaught
Posts: 1603

View Profile
13: July 16, 2011, 04:11:29 AM »
A word on network settings.

If you have the ability to control certain network settings such as interrupt request moderation, it may be beneficial to game play to do so. Each network event triggers an interrupt to the cpu. The cpu must then stop doing whatever it is doing and see to that net irq. Then it can continue to do whatever it was doing before. Or in the case of smp systems, one core can handle the net irq while the other goes about its business.

The int moderation control moderates the total interrupts seen by the cpu. If the IM control is set to adaptive, the networking driver and os tcp/ip stack tracks the interrupts and when they get to a distracting level to the cpu, the network driver slows the interrupts and bundles them into a single package with one interrupt. When this happens in a game it causes lag. This lag is due to the fact that the network driver has retained net packets for a set time and then released them in a single and delayed interrupt to the cpu for processing. By the time your game gets these delayed packets they may be far too old to mean anything as the action on screen has already chamged. This interrupt moderation is a boon to overworked webservers and other servers, but not to a game client or a game server.

Immediate attention to each and every packet is what game clients and game servers need above all else as far as networking goes if that game is an online game like an fps such as Tribes. In role playing or turn based strategy games, this interrupt moderation may not be noticeable, in an fps it will be.

Many Intel based netwrok cards, both add ins and onboard, have the ability to moderate net interrupts and can have this setting changed by the user. In my case I right click networking icon on the desktop, scroll down to properties, right click the net adaptor, properties, and click the configure button. Click advanced, performance options, proiperties, interrupt moderation rate, and set it to your liking. Off should give immediate packet attention to each packet as it arrives. Adaptive should do close to the same unless there is a lot of activity coming from your network adaptor, as adaptive only impedes and bundles packets if they get too great for the cpu as determined by the adaptive algorithm. Hit ok, then close everything and your system may want to restart before serttings take place.

 Some nvidia motherboards can also bundle packets with their onboard net cards. In the case of nvid netcards, you have two choices, one is cpu and the other is network throughput. In this case set it to netwrok throughput for lowest packet latency.

Test your game with the various moderation settings and see if it helps or hurts your gaming.
« Last Edit: July 16, 2011, 04:18:13 AM by Blakhart »
Blakhart
Juggernaught
Posts: 1603

View Profile
14: July 16, 2011, 04:33:07 AM »
A word on timeslices or quanta.

Timeslices, or quanta for windows weenies,  is the time in milliseconds that a cpu is tasked to run a thread. A thread is the code that actually gets executed by the cpu. There are normaly two choices in timeslices or quanta available to a user,  adjust for best performance of programs, and adjust for best performance of background services. Now it may seem logical to spend most cpu time on programs running in the forground rather than what is being done in the background, wich means network access, disk acces, etc stuff hidden from the user. But like everything, there is a tradeoff. With set to programs, timeslices are devoted to the forground app as much as possible and only interrupted by important events such as network activity. The time in milliseconds a app may hold the attention of the cpu is what is varied here by this control.

But what happens if we set it to background apps rather than forground? An interesting thing. All actrivities get the same equal timeslice, but that timeslice is made much longer in duration than when set for programs on the desktop. Some gamers may find it a benefit to increase the duration of their app timselices as that greatly increases the total time the cpu can spend on the game thread. See, with this control set to programs, programs get priority, but a smaller timeslce is given overall. With set to background, all threads get the same increased duration timeslice. Give this control a try and see if it plays better for you.

I find this control in xp and server2003 (the os's I use) by right clicking on my computer icon, properties, advanced, performance, advanced,  click background services. You should not have to reboot for this setting alteration. In other os's I have no clue but if it is an M$ os you should be able to find the control and give it a shot. You can do the same adjustment in Linux os by renicing your app.
Pages: [1] 2 3 ... 8 Print 
« previous next »
Jump to:  

irc.quakenet.org / #TribesNext Powered by SMF 1.1.21 | SMF © 2005, Simple Machines
anything