使用 unity(3D)12.04 时游戏性能下降怎么办?

使用 unity(3D)12.04 时游戏性能下降怎么办?

自从我全新安装 ubuntu 12.04 以来,我的游戏性能大幅下降

我的电脑配备 Nvidia Geforce GTX 460、AMD Phenom II X4 965 CPU 和 4GB RAM,我使用 nvidias 专有驱动程序。

我主要使用 Linux 客户端玩 Heroes of Newerth。我从 ubuntu 9.10 开始玩,使用专有 nvidia 驱动程序时从未遇到过任何性能问题。我的 fps 始终达到垂直同步帧上限 60。

由于我运行的是 ubuntu 12.04,因此帧率大约为 30-45 fps,游戏体验总体上非常滞后。我知道很多人在使用 nvidias 295.40 驱动程序时遇到问题,遗憾的是 ubuntu 12.04 默认安装了该驱动程序。因此我手动安装了最新的稳定版 295.49、最新的测试版 302.07,甚至 ubuntu 11.10 中使用的旧版本 295.33(我从未遇到过任何性能问题)。这浪费了我的时间,因为我在使用这 4 个驱动程序版本时都遇到了相同的性能问题。

当我使用 Unity 2D 时,我的 fps 会恢复到 60,并且整体游戏性能非常好。因此,只有在运行 ubuntu 12.04 版本的 Unity 时才会遇到这些问题。

我也尝试删除主目录中的 .config 和 .compiz-1 文件夹,但使用 unity 时游戏性能仍然很差。

我不知道下一步该怎么做...有人知道我该如何进一步调试这个问题吗?也许我可以提供更多数据来更好地分析问题?也许可以尝试摆弄一些 compiz 设置?

这种性能倒退确实令人沮丧,我正在考虑下载《Heroes of Newerth》的 Windows 客户端并回到双启动,因为这简直是不可接受的。

任何帮助均感激不尽。

答案1

这不是一个真正的解决方案,但至少它可能是一个(希望)有用的解决方法(除了简单地使用 Unity 2D)。

在开始游戏之前,打开 Nautilus(文件管理器)并转到/usr/share/application。打开终端,输入metacity --replace,然后按回车键。不要惊慌,Unity 界面会消失,但这是我的意图。从文件管理器启动游戏(游戏启动器应该在我提到的文件夹中)。玩完游戏后,在unity --replace终端窗口中输入,然后按回车键。您的桌面现在已恢复到原来的状态。
这应该可以工作,因为可能是在后台运行的 Unity 导致了问题。

另外,我会将此报告为错误。这肯定是需要修复的问题。如果您提交错误报告,请务必在此处留下链接,以便遇到此问题的其他人可以将其标记为“影响他们”,这样可以更快地修复它。

答案2

您可以随时更新到 304.22 Nvidia Beta 驱动程序,看看会发生什么。我在使用 Ubuntu 12.04 LTS 时遇到了严重的性能问题,Nvidia 295.59 版本和 302.07 版本似乎修复了一些小问题。大多数问题已通过更新最新的 304.22 驱动程序得到解决。现在我的 GeForce 性能终于与 Windows XP 相当,但一些应用程序仍然存在小问题,但情况确实有了显着改善。您应该始终使用最新的 Nvidia 驱动程序,即使它们是 BETA 版本,因为似乎 Nvidia 团队没有在较新的内核和 Ubuntu 滚动更新上测试较旧的稳定版本,从而导致意外的问题和问题。问题是 Nvidia 需要开源他们的驱动程序,以便 Ubuntu 维护者和 Linux 开发人员可以保持一切同步,但这是一个持续的讨论,不会很快得到解决 :-(

您可以获得它们http://www.geforce.com/drivers/beta-legacy

304.22 驱动程序有大量大规模修复,例如:

  • 增加了对以下 GPU 的支持:
    • GeForce GTX 680M
      Quadro K1000M
      Quadro K2000M
  • 增强了 IncludeImplicitMetaModes Xconfiguration 选项的功能:
  • 即使在初始化 X 时使用了多个显示设备,也会为主显示设备添加隐式 MetaModes。
  • 即使显示设备的模式池中没有具有该分辨率的模式,也会为常见分辨率添加隐式元模式。
  • 扩展了 IncludeImplicitMetaModes 配置选项的语法,例如,控制
    使用哪个显示设备来创建隐式 MetaModes。

  • 有关详细信息,请参阅 README 中IncludeImplicitMetaModes X 配置选项的描述。

  • 修改了 RandR 1.0/1.1 请求 RRGetScreenInfo 和 RRSetScreenConfig 的处理方式(例如 `xrandr -q --q1` 和 `xrandr --size ...` 以及 `xrandr --orientation ...`),使它们可以在 MetaModes 上运行。这是 NVIDIA X 驱动程序版本 295.xx 及更早版本中的行为,但 302.xx 版本改变了这些 RandR 1.0/1.1 请求的处理方式,使其可以在单个 RandR 输出模式下运行。
  • 通过对 IncludeImplicitMetaModes 和 RandR 1.0/1.1 处理进行上述更改,全屏应用程序(例如基于 SDL 的应用程序、Wine)应该具有更多可用的分辨率,并且应该能够更好地与多种显示器配置进行交互。
  • 修复了一个错误,该错误可能导致 G8x、G9x 和 GT2xx GPU 从挂起状态唤醒后显示黑屏或损坏。
  • 修复了调用 fork(3) 时可能导致某些 OpenGL 程序挂起的几个错误。
  • 修复了 nvidia-settings 错误,该错误导致使用 --display-device-string 选项进行的 ProbeDisplays 查询结果格式不正确。
  • 提高了显示器热插拔时对 nvidia-settings 控制面板更新的响应能力。
  • 修复了设置某些变换时导致显示损坏的错误,尤其是在平移变换后的显示时。
  • 修复了导致第一次热插拔显示器时生成额外 RandR 事件的错误。
  • 修复了导致名称中带有“@”的 X11 模式行被拒绝的错误。
  • 增加了对 DisplayPort 1.2 分支设备的支持,允许将多个显示器连接到显卡上的单个 DisplayPort 连接器。
  • 修复了当上下文绑定渲染到 RGB 覆盖可绘制对象时导致大多数 OpenGL 纹理上传速度很慢的错误。
  • 修复了在某些 MCP7x (IGP) GPU 上重新启动 X 服务器后导致 HDMI 上的音频无法工作的错误。
  • 更新了 X 配置选项“UseDisplayDevice”以遵守任何 GPU 上的值“none”。
  • 在 nvidia-installer 中添加了对 DKMS 的支持。通过 DKMS 安装内核模块允许在更改为其他 Linux 内核时自动重建模块。请参阅 README 和 nvidia-installer 帮助文本或“--dkms”选项。
  • 添加了 RandR 输出属性 _ConnectorLocation、ConnectorNumber、ConnectorType、EDID、_GUID 和 SignalFormat。有关这些属性的详细信息,请参阅 README。
  • 将 Base Mosaic 支持扩展至所有 G80+ SLI 配置,最多可容纳三个显示器。
  • 修复了当多个 DisplayPort 显示器连接到一个 GPU 时导致某些显示器无法从 DPMS 挂起模式唤醒的错误。
  • 从 nvidia-settings 控制面板的“X Server XVideo 设置”页面中删除了 XVideo 属性的控件。XVideo 属性可以在 XVideo 播放器应用程序中配置,也可以通过 xvattr 等实用程序配置。
  • 修复了导致 XVideo 适配器上的所有端口共享色彩校正设置的错误。
  • 删除了对以下 X 配置选项的支持:
    • SecondMonitorHorizSync
      SecondMonitorVertRefresh
    可通过 NVIDIA HorizSync 和 VertRefresh X 配置选项实现类似的控制。请参阅 NVIDIA 驱动程序 README 了解详情。
  • 修复了在不同 VT 上的 X 服务器之间切换时导致 NVIDIA 3D Vision Pro 无法正常工作的错误。
  • 当对显示设备应用旋转、反射或变换(通过 RandR 或 MetaMode 语法)时,添加了对桌面平移的支持;以前在这种情况下平移会被忽略。
  • 答案3

    编辑:X 现在可以通过 xscreensaver 锁定

    嗨!试试这个,我用它取得了很好的效果,主要是用于游戏!因为它不会被 Unity 管理,所以你也可以获得很好的结果!

    我创建了这个脚本,它可以创建一个新的 X 会话并运行一个命令或打开一个终端,以便您可以在那里运行它。

    打开NewX.sh

    #!/bin/bash
    
    function FUNCisX1running {
      ps -A -o command |grep -v "grep" |grep -q -x "X :1"
    }
    
    useJWM=true
    useKbd=true
    while [[ ${1:0:2} == "--" ]]; do
      if [[ "$1" == "--no-wm" ]]; then #opt SKIP WINDOW MANAGER (run pure X alone)
        useJWM=false
        shift
      elif [[ "$1" == "--no-kbd" ]]; then #opt SKIP Keyboard setup
        useKbd=false
        shift
      elif [[ "$1" == "--isRunning" ]]; then #opt check if new X :1 is already running
        if FUNCisX1running; then
          exit 0
        else
          exit 1
        fi
      elif [[ "$1" == "--help" ]]; then #opt show help info
        echo "usage: options runCommand"
    
        # this sed only cleans lines that have extended options with "--" prefixed
        sedCleanHelpLine='s"\(.*\"\)\(--.*\)\".*#opt" \2"' #helpskip
        grep "#opt" $0 |grep -v "#helpskip" |sed "$sedCleanHelpLine"
    
        exit 0
      else
        #echoc -p "invalid option $1"
        echo "PROBLEM: invalid option $1"
        $0 --help
        exit 1
      fi
    done
    #echo "going to execute: $@"
    #runCmd="$1" #this command must be simple, if need complex put on a script file and call it!
    runCmd="$@" #this command must be simple, if need complex put on a script file and call it!
    
    #if ! echoc -q -t 2 "use JWM window manager@Dy"; then
    #  useJWM=false
    #fi
    
    # run in a thread, prevents I from ctrl+c here what breaks THIS X instace and locks keyb
    if ! FUNCisX1running; then
      xterm -e "\
      echo \"INFO: hit CTRL+C to exit the other X session and close this window\";\
      echo \"INFO: running in a thread (child proccess) to prevent ctrl+c from freezing this X session and the machine!\";\
      echo \"INFO: hit ctrl+alt+f7 to get back to this X session (f7, f8 etc, may vary..)\";\
      echo ;\
      echo \"Going to execute on another X session: $runCmd\";\
      sudo X :1"&
    fi
    #sudo chvt 8 # this line to force go to X :1 terminal
    
    # wait for X to start
    while ! FUNCisX1running; do
      sleep 1
    done
    
    # run in a thread, prevents I from ctrl+c here what breaks THIS X instace and locks keyb
    if $useJWM; then
      if [[ ! -f "$HOME/.jwmrc" ]]; then
        echo '<?xml version="1.0"?><JWM><Key mask="4" key="L">exec:xscreensaver-command --lock</Key></JWM>' \
          >$HOME/.jwmrc
        #if ! jwm -p; then
        #  rm $HOME/.jwmrc
        #  echo ".jwmrc is invalid"
        #else
          echo "see http://joewing.net/programs/jwm/config.shtml#keys"
          echo "with Super+L you can lock the screen now"
        #fi
      fi
    
      jwm -display :1&
    fi
    
    kbdSetup="echo \"SKIP: kbd setup\""
    if $useKbd; then
      kbdSetup="setxkbmap -layout us"
    fi
    
    sleep 2
    
    xscreensaver -display :1&
    
    # setxkbmap is good for games that have console access!; bash is to keep console open!
    
    # nothing
    #xterm -display :1&
    
    # dead keys
    #xterm -display :1 -e "setxkbmap -layout us -variant intl; bash"&
    
    # good for games!
    xterm -display :1 -e "$kbdSetup; bash -c \"$runCmd\"; bash"&
    #xterm -display :1 -e "$kbdSetup; bash -c \"$@\"; bash"&
    

    另外,添加以下位置:compiz 配置设置管理器 -> 窗口规则 -> 不可关闭的窗口:

    (class=XTerm) & (title=sudo X :1) & (name=xterm)
    

    这将阻止您关闭该终端(使用 ctrl+c 关闭其他 X 会话以及终端),因为如果您关闭“窗口”,它将冻结您当前的 X 会话!

    它的优点是,您不会遇到 alt+enter 全屏问题,也不会遇到 Alt+TAB 全屏问题;您可以更稳定地运行任何 3D 游戏,从 Urban Terror(Linux 原生)到使用 Wine 运行的游戏!甚至一些运行 3D 游戏的浏览器,如 Firefox 和 Quake!

    注意:您可能需要安装 jwm 包,这不是必需的,但如果您需要在那里进行任何窗口管理,则会有所不同。

    附言:当然可以改进,我的计划是将键盘设置添加到一个选项中,但我做得很慢;),如果有人改进/清理它,请发布以便我可以更新我的脚本:)

    答案4

    使用 Unity 3D 时,您是否启用了许多 3D 效果等?(立方体、桌面动画、菜单效果等)即使在良好的机器上,这些也会降低性能。

    可能需要检查一下您的 nvidia 设置,只需在仪表板中搜索“nvidia”即可找到它。我知道我必须对 nvidia 设置进行大量调整才能避免出现任何延迟。

    检查您的游戏设置,稍微改变它们,看看您的 fps 变化了多少。

    请务必获取 Ubuntu 的最新更新,这有时可以解决问题,但就您而言,我并不认为它会有所帮助。

    相关内容