8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何在 Ubuntu 上的 C# 应用程序中实现应用程序指标?

Jarrod Carlson 2月前

79 0

我想编写一个在 Ubuntu 24.04 上安装 .NET 8.0 的应用程序,它有一个可以隐藏的主窗口,我认为在最上面有一个叫做“应用程序指示器”的东西……

我想编写一个在 Ubuntu 24.04 上运行的应用程序,该应用程序使用 .NET 8.0,并且有一个可以隐藏的主窗口,我认为右上角有一个“应用程序指示器”。我来自 Windows 世界,我正在寻找的东西被称为“系统托盘图标”——我进行了大量搜索,试图弄清楚这是如何做到的,但只找到了对“D-BUS 菜单”的模糊引用,我想这就是我在这里寻找的东西?

有一页提到了一个 libappindicator0.1-cil-dev 用于 Mono 的包,但不清楚这是否是一个可以在 .NET 运行时下运行的可移植库,而且无论如何它似乎不在任何默认的高贵包源中。

我还怀疑应用程序指示器可能独立于窗口工具包,因为它只是跨进程通信菜单的问题,菜单及其图标实际上会显示在哪里?所以,例如,问这是否可以用 Gtk# 完成,我认为可能没什么帮助?

所有这些记录在哪里?:-) 存在样本吗?

帖子版权声明 1、本帖标题:如何在 Ubuntu 上的 C# 应用程序中实现应用程序指标?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Jarrod Carlson在本站《ubuntu》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我认为这取决于操作系统和环境。我可能会尝试 Avalonia 来完成你的任务(

  • 我会看看,谢谢。问题确实明确提到了 Ubuntu 24.04 :-) 我实际上不知道窗口系统的实际名称是什么,我对这个世界还很陌生。

  • 可以确认 Avalonia 是快速简便的通知区域图标路径。我发现文档有点不足,所以我创建了一个 PR 来改进它。再次感谢@Ivan P. :-)

  • 我必须使用 Matlab 来工作(Ubuntu 22.04 上的 Matlab 2019b)。在“首选项”->“键盘”->“快捷方式”下,有一个可通过键盘快捷键访问的命令列表,用户可以自定义...

    我必须使用 Matlab 来工作(Ubuntu 22.04 上的 Matlab 2019b)。在“首选项”->“键盘”->“快捷方式”下,有一个可通过键盘快捷键访问的命令列表,用户可以自定义这些命令。我找不到命令“搜索”(在大多数其他程序和操作系统上,这将是一个简单的Ctrl+f:命令的名称是什么,我该如何更改它?

  • 您所说的“搜索”是什么意思:在编辑器中搜索文本,还是其他什么?在该菜单中,搜索文本称为“查找”,它具有默认快捷方式

  • 我会尝试。但是我在快捷方式列表中找不到“搜索”命令(还有一些其他基本命令,例如“复制”或“粘贴”)@LuisMendo 谢谢你的评论。没错。搜索文本。所以也许我没有写(大写)但

  • 我的场景中有超过 100 个(接近 200 个)敌人游戏对象,每秒生成 5-6 个。我正在使用对象池,对象不会每次都被实例化,而只会在需要时才实例化...

    我的场景中有超过 100 个(接近 200 个)敌人游戏对象,每秒生成 5-6 个。我使用对象池,对象不会每次都实例化,而只在需要时实例化。我试图记录统计数据,以便显示剩余敌人总数和击落敌人总数。对各个游戏对象进行简单的加减数学运算,结果加起来并不等于应有的数。例如:生成的敌人总数为 200(当我没有杀死一个敌人时)我瞬间杀死了很多敌人,但当我杀死所有敌人时,剩余的敌人并不总是为零。

    我尝试在敌人出现时将其逐一杀死,加减运算正确。

    那么,如何在不损失准确性的情况下,对多个游戏对象中的变量进行加减操作呢?

        public void TookDownEnemy(int enemiesTookDown)
        {
            //enemiesAlive -= enemiesTookDown;
            enemiesTakenDown += enemiesTookDown;
    
            Debug.Log("stats, enemies took down: " + enemiesTakenDown);
            UpdateStats();
    
        }
    
        public void SpawnedNewEnemy(int spawned)
        {
            enemiesAlive += spawned;
            UpdateStats();
    
    
        }
    
        public void UpdateStats()
        {
            enemiesTakenDownText.text = ": " + enemiesTakenDown.ToString();
            enemiesAliveText.text = ": " + (enemiesAlive - enemiesTakenDown).ToString();
        }
    

    每当新敌人生成时,我都会从敌人生成的游戏对象中调用 SpawnedNewEnemy,而当新敌人生成时,游戏对象就会调用 TookDownEnemy。

        public void InstantiateNewEnemy()
        {
    
            StatsManager.Instance.SpawnedNewEnemy(1);
    
            Enemy instance = ObjectPooler.DequeueObject<Enemy>("Enemy");
    
            instance.Initialize(10.0f); // get this hp value from the experience manager
    
            instance.SetThisAlive();
    
            instance.gameObject.SetActive(true);
    
            instance.transform.SetParent(enemiesHolder);
    
            int randomIndex = Random.Range(0, enemySpawnPoints.childCount);
    
            instance.transform.position = enemySpawnPoints.GetChild(randomIndex).position;
    
            instance.transform.rotation = Quaternion.identity;
        }
    
    

    类似地,当敌人被杀或死亡时

    if(hp <= 0 && !isDead)
    {
        //Destroy(this.gameObject); // use pooling here
        isDead = true;
    
        StatsManager.Instance.TookDownEnemy(1);
    
        this.GetComponent<Animator>().Play("playDead");
    
        Invoke("EnqueueGameObject", 0.25f);
    
    }
    

    我没有直接对变量进行加减操作,而是创建了三个不同的变量。

    1. 敌人生成
    2. 敵人被擊斃
    3. 剩余敌人

    其中 enemyRemaining = enemySpawned - enemyTookDown

    即使这也有差异。我假设应该有一种方法可以将加法和减法运算排队,而不是仅仅执行它。

    更新:我尝试通过排队加法和减法运算并以定义的时间间隔执行这些运算来完成此操作。

       public void TookDownEnemy(int enemiesTookDown)
       {
           enemiesTookDownQueue.Enqueue(enemiesTookDown);
    
       }
    
       public void SpawnedNewEnemy(int spawned)
       {
           enemiesAliveQueue.Enqueue(spawned);
    
       }
    
    

    现在我还将敌人的生成数量限制为 260(根据时间,我总共生成 260 个敌人)。当使用队列进行加减时,我 加起来 (双关语)总是得到 80 的差值。其中剩余 80 个敌人,而我击落了 180 个。

    这是我每 2 秒将这些数字相加的方法。

       public void UpdateStats()
       {
    
           while(enemiesAliveQueue.Count > 0)
           {
               enemiesAlive += (int)enemiesAliveQueue.Dequeue();
           }
    
           while(enemiesTookDownQueue.Count > 0)
           {
               enemiesTakenDown += (int)enemiesTookDownQueue.Dequeue();
           }
    
    
           enemiesTakenDownText.text = ": " + enemiesTakenDown.ToString();
           coinsCollectedText.text = ": " + coinsCollected.ToString();
           enemiesAliveText.text = ": " + (enemiesAlive - enemiesTakenDown).ToString();
       }
    
  • 首选项 -> 键盘 -> 快捷键 ,搜索文本的命令名称为 查找... ,其默认的键盘快捷键为Ctrl+FCtrl+H,如下图所示(Matlab R2019a,按键名称为西班牙语):

    enter image description here

  • 引用 10

    @shingo 是的,没有池化也会出现问题。只有当我逐个杀死敌人时,它才会按预期工作。

  • @Jay 是的,我正在执行一个函数,将他们设置为未死并更新他们的生命值。请注意,在这个特定的例子中,我有 260 个敌人,敌人根本没有被杀死,所以问题肯定不是来自重新生成它们。

  • 我觉得你在这些函数中传递了被销毁/生成的数字有点奇怪——难道不应该总是这样吗?

  • 所以我确实设法解决了这个问题,但仍然不知道为什么会导致不一致。

    之前,我按照 YouTube 视频 ,视频中创建了一个通用类来创建池,然后可以根据需要进行访问。它按预期工作,但它更像是一个 C# 解决方案,而不是 Unity 对象池解决方案。

    public static void EnqueueObject<T>(T item, string name) where T : Component
    {
        if (!item.gameObject.activeSelf)
        {
            return;
        }
    
        item.transform.position = Vector2.zero;
    
        poolDictionary[name].Enqueue(item);
    
        Debug.Log("item.GetType(): " + item.GetType());
    
        item.gameObject.SetActive(false);
    
    }
    
    public static T DequeueObject<T>(string key) where T : Component
    {
        if (poolDictionary[key].TryDequeue(out var item))
        {
            return (T)item;
        }
    
        return (T)EnqueueNewInstance(poolLookup[key], key);
        //return (T)poolDictionary[key].Dequeue();
    }
    
    public static T EnqueueNewInstance<T>(T item, string key) where T : Component
    {
        T newInstance = Object.Instantiate(item);
        newInstance.gameObject.SetActive(false);
        newInstance.transform.position = Vector2.zero;
        poolDictionary[key].Enqueue(newInstance);
        return newInstance;
    }
    

    事实证明,在 Unity 中池化对象的正确方法是使用 UnityEngine.Pool 。我按照 这个教程 做了同样的事情,但这次我不必担心队列。

    我将这些添加到我的 EnemySpawner.cs 中,

    private void Start()
    {
        _enemyPool = new ObjectPool<Enemy>(() =>
        {
            return Instantiate(enemyPrefab);
        }, enemy =>
        {
            enemy.gameObject.SetActive(true);
        }, enemy =>
        {
            enemy.gameObject.SetActive(false);
        }, enemy =>
        {
            Destroy(enemy.gameObject);
        }, false, 10, 20);
    
    }
    
    public void KillEnemy(Enemy enemy)
    {
        _enemyPool.Release(enemy);
    }
    
    public void InstantiateNewEnemy()
    {
    
        StatsManager.Instance.SpawnedNewEnemy(1);
    
        Enemy instance = _enemyPool.Get();
    
        instance.Initialize(10.0f); // get this hp value from the experience manager
    
        instance.SetThisAlive();
    
        instance.gameObject.SetActive(true);
    
        instance.transform.SetParent(enemiesHolder);
    
        int randomIndex = Random.Range(0, enemySpawnPoints.childCount);
    
        instance.transform.position = enemySpawnPoints.GetChild(randomIndex).position;
    
        instance.transform.rotation = Quaternion.identity;
    }
    

    然后当敌人被杀死时

    public void KillMyself()
    {
        StatsManager.Instance.TookDownEnemy(1);
        EnemySpawner.Instance.KillEnemy(this);
    }
    

    (最初是作为对 OP 问题的编辑发布的,而不是作为答案)

  • 我想使用 DJI 无人机的源进行 AR 图像跟踪。为此,我购买了 Elgato Cam Link4k USB 采集卡。如果我通过 USB 将其连接到无人机,我可以在 Windows 中使用

    我想使用 DJI 无人机的源进行 AR 图像跟踪。为此,我购买了 Elgato Cam Link4k USB 采集卡。如果我通过 USB 将其连接到无人机,我可以在 Windows 中打开它并显示清晰的高分辨率图像。

    现在,我在 Vuforia 中选择了“播放模式类型”>“网络摄像头”和“摄像头设备”>“Cam Link 4k”作为设备,图像分辨率很差。大约为 640x480。真的很糟糕。但是 3D 对象的质量非常好。我猜设置一定出了问题?

    比例为 \'1x\'。选择了 16:9 比例,但我已经尝试过所有选项。甚至创建自己的配置文件。

    我希望有人知道这个问题并能提供帮助。

    我已尝试了几种比例尺。

  • 另请注意,PlayMode 提供了 AR 体验的“预览”,运行实际应用程序后,实际相机分辨率可能会有所不同。

  • 引用 16

    我使用 Ubuntu,我想在我的 vscode 上使用 IBM Plex Mono 字体,我已经安装了 IBMPlexMono 的 .zip 文件,这是我的 vscode 设置: (IBM Plex Mono-Regular,等宽字体),但仍然不行

    我使用 Ubuntu,我想在我的 vscode 上使用 IBM Plex Mono 字体,我已经安装了 IBMPlexMono 的 .zip 文件,这是我的 vscode 设置:(IBM Plex Mono-Regular,等宽字体),但它仍然没有反映在我的 vscode 上:(请帮忙,提前谢谢,祝你有美好的一天:)

    我尝试在 vscode 上应用字体 IBMPlexMono,但它不起作用

  • 是的,我尝试了所有可能的版本:1. IBMPlexMono 2. IBMPlexMono-Regular 3. IBM Plex Mono 4.IBM Plex Mono-Regular 有没有可能的版本?

  • 引用 18

    我管理一台运行 Ubuntu 的服务器,该服务器用作主备份服务器,并配置了 Bacula 来管理各个主机的备份。此外,每次 MySQL 备份后,都会使用 AzCopy 来传输

    我管理一台运行 Ubuntu 的服务器,它充当主备份服务器,并配置了 Bacula 来管理各种主机的备份。此外,每次 MySQL 备份后,都会使用 AzCopy 将 MySQL 转储和 InnoDB 文件传输到 Azure Blob 存储。使用的命令包括对网络带宽的限制(--cap-mbps 500),因为服务器的最大带宽为 1 Gbps(无法更改)。此限制是必要的,因为 AzCopy 操作之前曾使服务器无响应。

    azcopy cp "$INNOBACKUPEX_DIR" "{{ azure_backup_storage_account }}/mysql-main{{ azure_backup_write_sas }}" --recursive=true --cap-mbps 500 --log-level=ERROR
    

    但是,我现在遇到了一个新问题。在单独的主机上运行的 Centreon 会定期检查此备份服务器。当 AzCopy 长时间运行时(由于 MySQL 转储和 InnoDB 文件的大小较大(超过 400 GB),因此有必要这样做)时,Centreon 经常无法收到响应,从而触发警报。AzCopy 完成后,服务器的响应能力就会恢复正常。

    我正在寻找有关优化 AzCopy 性能的建议,以防止它干扰其他进程,包括 Centreon 的监控活动。任何建议都将不胜感激。请注意,我正在运行 azcopy 最新版本 10.24.0。

返回
作者最近主题: