簡體   English   中英

有沒有辦法畫出更少的內存昂貴的線索?

[英]Is there a way to draw less memory expensive trails?

我到目前為止在運氣還不錯的情況下在Unity Answers上發布了這個問題,所以我想我也可以在這里嘗試一下。

我正在從事一個涉及AI代理的項目,該項目要經過培訓才能在環境中導航,並且我想可視化隨着培訓的進行而變化的運動方式。 我首先使用內置組件TrailRenderer,但從當前培訓課程的結束到開始位置的跳轉都使我煩惱,因此我編寫了自己的自定義實現。

我希望自己的實現具有三種能力: 可以限制可見的痕跡的數量,並根據它們的相關性更改繪制的痕跡的alpha值,並且不包括跳轉(例如使用TrailRenderer組件時)。

下面顯示並詳細說明了實現,但是我認為在深入探討實現之前概述最大的麻煩是有意義的。

如我所見,目前我自己實施過程中最大的麻煩是,如果環境充滿挑戰,那么某些線索最終可能包含大量分數(迄今為止見證的最大分數為30000+)。足夠,這極大地減慢了培訓速度。 除了增加時間延遲,使新點僅每0.5秒增加一次,我不知道該如何改善。 但是,較大的時間延遲會導致可視化路徑中的誤差較大,因此會限制路徑提供的值。

在我的機器上進行培訓(500000步),無需進行跟蹤繪制,大約需要45分鍾。 通過實施繪制軌跡和0.5秒的延遲,220000個訓練步驟大約需要1.5個小時,之后我決定停止訓練。

我的實現包括兩個部分: 附加到代理的腳本,該腳本繪制當前路徑,並可能增加時間延遲。 第二部分不是腳本本身,而是AgentReset()方法的一部分,它有兩個作用; 在運行時添加/刪除路徑,並根據其相關性更改路徑的alpha,即最新路徑的alpha最高。

以下是附加到代理的腳本,

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;

 public class drawDynamicTrail : MonoBehaviour
 {
     private GameObject[] trails;
     private int traceStep = 0;
     private int traceNumber = 0;
     private int currentTrace;
     private LineRenderer lr;
     private float timeToDraw = 0;
     public bool drawTrails = false;

     void Update()
     {
       if (drawTrails){
         if (Time.time > timeToDraw)
         {
           trails = GameObject.FindGameObjectsWithTag("Trail");

           if (trails.Length != traceNumber)
           {
             traceNumber = trails.Length;
             traceStep = 0;
           } else
           {
             currentTrace = traceNumber - 1;
             lr = trails[currentTrace].GetComponent<LineRenderer>();

             if (traceStep >= lr.positionCount)
             {
               lr.positionCount = traceStep + 1;
             }
             lr.SetPosition(traceStep,transform.position);
             traceStep += 1;
           }
           timeToDraw = Time.time + 0.5f;
         }
       }
     }
 }

我很樂意在需要時提供整個AgentReset()方法,但是暫時將其遺漏了,因為我認為這並不是挑戰的源頭。

所有建議都受到高度贊賞。

常規性能提示:盡可能避免在“更新”中使用“ FindGameobject ...”。 在您的情況下,我認為線索列表正在增長,因此您需要對其進行更新,對嗎?

思路:

  • 公開公開trails或定義addTrail方法-每當創建新的,帶有“ Trail”標簽的對象時都添加線索。 這應該更快,因為“ FindGameobject ...”將花費越來越長的時間,您在場景中擁有的對象越多。

  • 您實際上對所有路徑感興趣嗎? 還是最新的就足夠了? 如果只想繪制最新的軌跡,請考慮新的Ringbuffer模式

  • 舊路不會改變,對不對? 相機會移動嗎? 如果不是,則可以在紋理中繪制這些路徑,因此您只需在舊路徑上方繪制新路徑,而無需重新繪制舊路徑。 除了重新繪制紋理。 但這是恆定的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM