倉庫: https://gitee.com/mrxiao_com/2d_game_2
回顧
繼續之前的工作。
昨天已經讓地形系統基本運行起來,但目前仍然需要進一步完善,使其能夠生成更多的地塊。目前的情況是,僅僅有一個地塊位于中心區域,而真正需要的是讓地塊覆蓋整個區域。
因此,首先要實現一個系統,使其能夠遍歷整個需要渲染的范圍,并請求相應的地塊,從而保證不會只有單個地塊存在,而是讓所有需要的地塊都能正確生成。
接下來的工作就是從這個目標開始,逐步完善整個系統。
提案:首先生成覆蓋區域的地磚……但它們不會是無縫的
首先,需要采取逐步推進的方式來完善地形系統。
第一步,先生成能夠覆蓋整個區域的地塊,并確保在移動時,地塊能夠根據需求進行調整,使其始終出現在需要的位置。但這一階段的地塊不會是無縫銜接的,因此視覺上可能會出現明顯的拼接痕跡,就像傳統的瓦片地圖游戲那樣,每個地塊之間存在可見的邊界。
一旦這一部分工作完成并且能夠正確運行,接下來需要進入下一個階段,即確保地塊之間能夠無縫銜接。這兩個部分是相互獨立的任務——前者的重點在于如何正確填充地塊,使整個區域被適當地覆蓋,而后者則關注于如何調整地塊內容,使其能夠自然地銜接,消除明顯的拼接痕跡。
處理如何指定所需的 ground_buffer
當前需要解決的問題是如何管理地面緩沖區的使用。現有的地面緩沖區是一個大數組,可以填充數據,但關鍵在于確定需要填充的世界位置。
首先,需要一種方式來標識哪些地面緩沖區是必要的,并確保這些緩沖區與世界坐標對齊。換句話說,需要一種方法來確定哪些世界位置應該填充到緩沖區中,并且確保填充時的世界單位能夠與像素精確匹配,使得地面緩沖區的尺寸與世界坐標系統保持一致。
此外,時間因素也是需要考慮的部分,必須確保地面緩沖區在正確的時間點被放置到合適的位置。同時,緩沖區的大小需要與世界坐標系統保持對齊,確保每個像素與世界單位之間的映射關系是正確的,否則可能會導致數據錯誤或渲染不匹配。
當前的實現方式可能存在一定程度的誤用,需要仔細思考如何優化分配和對齊策略,以確保整個地面緩沖系統能夠高效運作。
停止對 GroundBuffer
進行測試填充
在當前的地面緩沖區(GroundBuffer)處理中,最初的實現包含一個測試填充(FillGroundChunk)步驟,該步驟用于填充第一個緩沖區。然而,該測試填充已經不再需要,因此需要將其完全移除。
為了替代這一過程,計劃創建一個新的函數,用于執行所需的填充操作,并提供一個合適的工作位置。目前尚未確定該函數的調用位置或調用方式,但明確了它需要執行的操作。該函數將被添加到適當的部分,后續再根據需求調整具體的調用方式。
遍歷攝像機可見的所有區域并請求 GroundBuffer
需要處理的任務是,為了確保相機能看到的每個區域都有相應的地面塊(GroundChunk),必須創建一個方法來生成這些地面塊。這將產生一個地面塊的列表,用于填充所需的區域。
然而,地面塊的存儲方式使得檢查是否存在某些地面塊變得困難,因此需要想辦法解決這一問題。為此,參考了模擬區域(SimRegion)的概念,其中有一個類似的區域計算方法。在該方法中,模擬區域的周圍有一個“圍裙”(apron),類似的策略可以應用于地面塊的生成。
接下來,考慮到每個相機視野范圍內的區域大小,計算出每個區域所需的地面塊數。例如,如果視野是一個3x3的網格,那么就需要81個地面塊。這一方法可以擴展到更大或更小的區域,具體取決于視野的大小。
實際操作時,需要用一個函數來請求生成地面緩沖區(GroundBuffer)。這個函數會接受區域的邊界(Bounds)和世界坐標位置作為參數,世界坐標位置可以是區域的中心。通過計算,從中心位置開始,逐步填充該區域所需的地面塊。
為了實現這一過程,中心坐標(CenterP)將被對齊到最接近的地面塊位置。為了簡化這一過程,可以忽略偏移量(Offset),直接使用已有的地塊坐標數據來計算。通過這種方式,可以精確地將所需的地面塊對齊到世界坐標系統中的正確位置。
還需要實現一個偏移操作,用來調整邊界的位置,確保其與中心坐標對齊。這一操作非常簡單,只需在原始邊界的基礎上進行偏移,類似于增加半徑的操作。這個方法能夠確保地面塊的生成位置準確無誤,滿足相機視野的要求。
黑板:偏移量的考慮
當前處理的任務是基于一個矩形的中心位置(Center)和邊界(Bounds)來調整矩形的位置。矩形的位置當前基于一個統一的坐標系統,并且有一個偏移量。需要的操作是,將矩形的中心從當前的位置調整為新的位置,從而使得新的矩形圍繞目標點而不是原來的位置。
具體來說,原來矩形的最小點(Min)和最大點(Max)分別位于原位置,通過將矩形的偏移量加到這兩個點來計算矩形的實際位置。現在,目標是將該矩形調整為圍繞新目標位置,并且計算新的最小點和最大點。
為了實現這一點,關鍵是將偏移量包含在計算最大值(Max)時,確保新的矩形的邊界位置是基于新中心點的。原本計算最大值時,會將偏移量與最大點相加,現在需要將偏移量間接地應用到最大點和最小點的計算中,從而調整矩形的定位。
這個過程的目標是使矩形的邊界與新的中心點對齊。
減去偏移量
現在需要做的工作是通過計算矩形的偏移量,調整其邊界位置。首先,通過將偏移量加到原始邊界上,然后再從新的邊界中減去這個偏移量,這樣就可以得到一個沒有偏移的矩形。通過這種方式,中心位置 CenterP
將不再有偏移量,而是對齊到一個新的標準位置。
接下來,處理過程將專注于 x
和 y
軸的坐標調整,而 z
軸暫時不涉及。具體而言,將會處理類似之前提到的坐標(例如 AbsTilex
),并考慮如何在空間中定位這些網格塊。
目前還需要處理的是分塊(chunks)在三個維度上的調整,包括 x
、y
和 z
,確保每個維度的塊都可以根據新的坐標進行適當的調整。
考慮 Chunk
的大小
討論的核心問題是每個地塊(Chunk)的大小對整個地面緩沖區(GroundBuffer)管理的影響。當前地塊的大小為16x16個瓦片,這可能過大,尤其是在處理精細的地面細節時,可能導致過大的地塊不適合當前的地面緩沖區粒度。雖然這些瓦片在過去用于某些旋轉操作,但現在它們已經不再是主要的工作單位,更多的是為地塊的管理提供結構。
若地塊與地面緩沖區能夠對齊,那么地面緩沖區就可以直接與世界的布局同步,避免復雜的轉換,甚至可以直接存儲相關數據。這樣做雖然有可能導致資源浪費,但理論上可以簡化管理,使地面緩沖區的組織更加直接。
然而,將地面緩沖區存儲在當前的結構中可能會顯得過于冗余和不必要,增加了不必要的復雜性。盡管如此,這個方法仍然是一個有吸引力的選擇,可能會嘗試這一方案并觀察其效果,以確定它是否能帶來更簡單的管理方式,盡管有些擔心其可能帶來的資源浪費問題。
簡短插曲:查看 Chunk
的實際大小
討論的核心是通過繪制實際地塊(tile chunks)來了解這些地塊的大小,并將其可視化,以便于評估它們在地面緩沖區管理中的適用性。首先,需要確定每個地塊在屏幕上的實際顯示大小,可以通過像素到米的轉換來實現。通過計算攝像頭區域的大小,將屏幕上的區域映射到世界坐標系中,從而繪制出對應的地塊。
具體實現中,首先通過屏幕寬度和高度來計算它們對應的米值,然后使用這些值確定一個矩形區域,這個區域代表攝像頭當前能看到的部分。接下來,使用這些信息來繪制包含地塊的矩形,地塊的大小可以通過已知的地塊尺寸來計算。通過得到每個地塊的位置與攝像頭中心的差值,可以精確地在屏幕上繪制出這些地塊。
其中,還涉及到地塊中心位置的計算和繪制的轉換,確保在正確的坐標上顯示每個地塊。遇到的問題是,繪制之前需要確保清除屏幕,避免覆蓋之前繪制的內容。最終的目標是通過這種可視化方式驗證地塊尺寸是否合適,并評估其對地面緩沖區的影響。
在游戲中查看結果,并逐步調試代碼
在這個過程中,首先屏幕被清除,接著獲取了屏幕中心的坐標。隨后,計算了屏幕的寬度和高度,并且轉換為米作為單位,這些數值分別為22米和12米,這是第一次知道游戲場地的實際大小。
接下來,創建了相機視野的矩形(CameraBounds),并且將其轉換為塊空間。這個矩形的范圍從負的20到12,顯然這個設置是錯誤的。問題出在計算矩形時使用了“半維度”(half dim),但實際上應該使用“中心維度”(center dim),因為這里表示的是整個矩形的大小,而不是其一半。
在調整這個錯誤之后,繼續將矩形映射到塊空間,并檢查了在塊空間內最小和最大塊的位置。結果顯示,范圍正確地從零到一,似乎是合理的。
接下來,檢查了塊中心位置的返回值,得到的結果與預期一致。然后,還查看了相對位置的返回值,確認它是符合實際情況的,也就是相機位置周圍的正確坐標。
總的來說,問題的根本原因在于創建矩形時使用了錯誤的維度方式,這個錯誤已經被糾正,之后的計算和顯示結果是合理的。
將 ChunkDimInMeters
乘以 MetersToPixels
在這個過程中,遇到了一些問題,主要是關于矩形的繪制和單位轉換。首先,注意到目前所有的操作都使用的是米作為單位,但實際上應該轉換成像素單位,這樣才能正確顯示在屏幕上。為此,需要在渲染時進行適當的單位轉換,以確保可以正確地呈現矩形。
接下來,發現有兩個問題。第一個是矩形的邊框沒有正確繪制,應該明確調用函數來繪制矩形的邊框。第二個問題是矩形似乎總是與相機位置對齊,導致它出現了一些不期望的行為。這可能是由于相對位置計算時存在錯誤,需要進一步檢查。
矩形的繪制和相對位置計算中,涉及到屏幕中心和矩形的相對位置的加和,初步看起來是合理的。但在實際渲染時,似乎出現了一些不明原因的偏差。為了更好地控制矩形的顯示,計劃使用一個邊框繪制方法來明確繪制矩形的輪廓。最終目標是確保矩形正確顯示并對齊。
總之,目前的問題集中在矩形的繪制和單位轉換上,未來需要進一步調整這些設置,以確保渲染正確無誤。
創建 DrawRectangleOutline
在這段調試過程中,首先提出了一個問題,即如何繪制一個矩形的邊框。目標是通過新的繪制函數來實現矩形輪廓的渲染。計劃中,新的函數應當采用與現有的繪制矩形函數相同的參數,并且轉換為像素單位,而不是米單位。這是因為在顯示時,需要在屏幕上準確地呈現矩形。
接下來,針對矩形的厚度進行了設置,選擇了2像素的厚度,并嘗試繪制矩形邊框。為了簡化繪制邏輯,矩形的最小和最大坐標被直接提取,并根據這些坐標生成矩形的外框線。
在實現時,采取了計算矩形邊緣的方法。例如,在頂部和底部的繪制中,首先減去一個偏移量,然后再進行寬度的繪制;在左右邊緣的繪制中,也按照類似的思路進行。通過這種方法,確保了矩形的每一條邊都能夠繪制出合適的線條。
此外,在調試過程中也進行了調整,尤其是在繪制過程中,設置了顏色和其他參數,以確保矩形的顯示效果符合預期。最終,新的繪制函數被成功實現并測試,確保了矩形的邊框能夠正確渲染。
整體而言,這段調試流程展示了如何通過細化繪制矩形邊框的邏輯,解決顯示問題,并通過調整參數和簡化代碼來完成這一目標。
查看結果并分析 Chunk
位置信息的問題
遇到了繪制矩形時的一些問題,盡管計算結果接近正確,但仍然存在一些錯誤。首先,矩形的繪制功能與填充矩形的功能類似,但似乎沒有達到預期效果。為了找出問題所在,首先回顧了矩形的繪制過程,特別是與視圖和屏幕坐標的關系。
在調試過程中,檢查了如何將每個區域的中心映射到相對屏幕中心的坐標。根據當前的計算,距離應該是正確的,但是實際繪制結果仍然不準確。還考慮了視口坐標與物理單位(米)之間的轉換是否正確,特別是在從米轉換到像素的過程中,發現了一些疑慮。
雖然覺得在當前情況下沒有明顯的錯誤,但仍然在疑惑是否有其他問題尚未發現。總的來說,懷疑可能是某些細節處理不當,導致了繪制的偏差,但還未找到具體的原因。
DrawRectangle
不接受寬度和高度參數
發現了一個錯誤,原本在繪制矩形時,誤以為矩形的寬度和高度是直接傳入的,但實際上沒有正確處理這些值。問題出在調用繪制函數時,誤將零作為參數處理,導致了不正確的結果。發現這個問題后,意識到需要重新計算屏幕的寬度和高度,確保在繪制時能正確地使用屏幕的尺寸。
最終,問題是由于沒有正確處理屏幕尺寸和坐標轉換所導致的。通過修正這些細節,矩形的繪制應該能夠正常工作。
并且 Y 軸需要翻轉
關于在處理渲染問題時遇到的一些困擾。具體來說,有提到在進行渲染時,遇到了常見的y軸翻轉問題,雖然這個問題并不嚴重,但始終存在。盡管反復提到這個問題,仍然沒有找到最優的解決方案,特別是在一開始是否應該引入渲染相關的內容上。對于何時應該做某些事情以及這些操作是節省時間還是浪費時間,感到不確定。有時答案很清晰,但有時卻并不明確,尤其是在決定是否應該從一開始就處理某些問題時,顯得特別困難。
進展順利,但 Chunk
被繪制得太小
在渲染時,區塊顯示得太小。顯然,區塊的實際大小不應如此,因為如果按照這個大小,區塊將無法覆蓋所有內容。問題的原因是因為在計算時,誤差導致大小偏小,實際上已經在處理時做了半個尺寸的調整,這就是導致問題的根源。
嘗試將 Chunk
設為原來的四分之一大小
這段內容討論了當前區塊的大小問題,發現它們過大,不適合用于存儲地面緩沖區點。于是考慮將區塊大小縮小,嘗試使用更小的塊作為瓦片大小,以實現統一的尺寸。嘗試將區塊尺寸縮小至原來的四分之一后,發現這是一個更為可管理的大小,雖然可能稍微大了一點,但仍然可以接受,甚至可以嘗試進一步縮小。考慮到使用這種尺寸的成本,決定嘗試這種新的分辨率,并觀察效果。
基于 256*256
塊的大小來設置 Chunk
大小
現在可以根據需要設置區塊大小,而不再考慮每個區塊的瓦片數量。以前區塊的大小是通過瓦片數量來決定的,但現在這個概念不再適用。可以反向計算所需的物理活動區域的大小,并將其作為區塊的大小,以確保區塊的尺寸與活動區域一致,從而使整個系統能夠更好地協調工作。
讓 MetersToPixels
成為整數
為了更好地協調渲染與世界的關系,可以考慮將米到像素的比例設置為整數,而不是目前使用的較為復雜的數值。這可以通過調整比例,使其成為類似于二的冪(例如32或64)這樣的更友好的數值。通過這樣做,世界的縮放會有所變化,但這種調整是為了確保渲染和世界尺寸之間的匹配更加合理。在這種情況下,可以靈活地調整瓦片尺寸,使其與新的比例相適應,從而獲得更合適的大小。
評估 TileSideInMeters
是在哪里設置的,并考慮去掉它
在處理世界初始化時,TileSideInMeters
只是一個合成概念,主要用于世界創建和計算區塊位置的轉換。它的作用并不顯著,因為只在創建過程中使用一次。考慮到這一點,可能不需要繼續保留這個參數,去掉它可能會帶來一些優化或簡化。在這種情況下,去除它不會影響整體功能,反而可能在實現上提供一些好處。
在 InitializeWorld
中去掉 TileSideInMeters
和 TileDepthInMeters
在初始化世界時,可以考慮不使用 TileSideInMeters
,而是將其從代碼中移除,看看會發生什么。對于需要使用這些值的地方,基本上只是為了世界構建或者碰撞檢測而設定的尺寸,這些值都是任意的,可以根據需求調整。例如,碰撞檢測的值是為了讓物體的碰撞更符合預期,而這些參數本質上是根據實際需求設置的。除此之外,攝像機設置的參數也可以從屏幕尺寸推導出來,這樣會更加靈活和精準。因此,移除 TileSideInMeters
可能并不會影響整體功能,并且能夠簡化實現過程。
直接傳入 ChunkDimInMeters
在進行初始化時,需要直接傳遞 ChunkDimInMeters
的值,并且將其賦值給對應的變量。此時,TileSideInMeters
只是一個暫時使用的值,主要用于世界構建,因此可以暫時保留舊的值,并將其應用于當前的初始化過程。隨著世界構建的進展,可能會移除這些值,并切換到更自由的構建方式。
此時,TileSideInMeters
并不是特別重要,可以暫時保留,直到有更合適的實現。對于計算其他值的地方,可能會進行一些清理工作,因為這些參數更多是游戲規格的一部分,可以根據需要調整。
通過這個清理過程,雖然原本計劃是處理地面相關的內容,但也可以順便進行一些整理工作,將項目朝著更合理的狀態推進。最終,可能需要將這些參數設置成與游戲狀態相關的值,以便更靈活地控制和調整。
引入 TypicalFloorHeight
在此過程中,TileDepthInMeters
將設置為典型的地板高度,這意味著會使用一個常見的值來表示地板的深度。通過這種方式,其他部分的代碼可以使用此值進行初始化。在初始化世界時,將使用這個值來設置 chunk size
,并確保它與世界的實際需求相匹配。
最終,TileDepthInMeters
被設置為一個合適的標準值,這樣可以保證其他功能和計算能夠順利進行。
基于 MetersToPixels
設置 ChunkDimInMeters
為了確保 MetersToPixels
設置為 64 時,chunk size
和地面緩沖區高度能夠協調工作,可以基于這一比例進行調整。通過將 chunk size
設置為與地面緩沖區高度一致,可以避免在像素計算過程中出現過多的分數值問題。具體來說,首先確定每個像素與米之間的比例,并確保 chunk size
和地面緩沖區的比例能夠精確匹配,避免產生不必要的計算復雜性。
這種方式旨在使得像素和米之間的換算更加直接和簡潔,避免了在處理這些值時需要進行復雜的浮動計算,從而提升了代碼的穩定性和易維護性。
通過 GroundBuffer{Width,Height}
和 TypicalFloorHeight
計算 WorldChunkDimInMeters
為了確定 WorldChunkDimInMeters
的大小,可以通過使用 MetersToPixels
的比例值和地面緩沖區寬度來進行計算。具體做法是,將 GroundBufferWidth
和 PixelsToMeters
值相結合,得到適當的 chunk size
。同樣的方式也適用于地面緩沖區的高度,通過這種方式可以精確地確定物理預期。
對于地面高度,可以使用典型的樓層高度來設定,雖然這個高度最終如何處理可能還需要進一步調整,但在初步設計中,這樣的處理方式是合理的。
設置 Tile{Side,Depth}InMeters
在當前的設計中,TileSideInMeters
主要用于確定樓梯的大小,盡管“tile”不再存在,依然可以保持該值不變,特別是在與世界構建相關的部分。TileDepthInMeters
被用作典型樓層高度的參考,而這些值主要用于世界構建中,因此應將其保留并避免在其他部分重復使用。其他不涉及的部分可以去除這些與樓層和瓦片相關的值,因為它們不再對其他內容產生影響。
以不同的方式計算 CameraBounds
在當前設計中,攝像機的邊界應該以不同的方式處理,因為現在已經生成了正確的攝像機邊界。攝像機的邊界是基于屏幕高度和視圖的實際大小(以米為單位)進行計算的,因此應確保攝像機邊界與實際的米制視圖保持一致。
根據 CameraBounds
引入 SimBounds
為了簡化設計,計劃將模擬區域(SimBounds)與攝像機邊界(CameraBounds)一致,并在此基礎上添加一定的擴展區域。這樣,模擬區域的大小將與攝像機邊界相同,只是多加了一個“圍裙”區域(apron)。這個擴展區域的大小可以是固定的,比如每個方向上增加15米,具體的擴展量可以根據需要進行調整。
在游戲中查看結果
當前的設計仍然與之前相似,模擬區域的邊界設置保持不變。唯一需要調整的是縮放級別,這樣攝像機的像素與米的比例可能需要稍微調整,使其更接近以前的值。一個合適的選擇是使用48作為每米的像素數,這更接近原置,或者試試42.238的比例,看是否更合適。盡管它不是2的冪次方,但考慮到渲染會進行縮放,使用這個比例應該沒有問題。由于時間有限來的設,盡管在其他方面可能可以改進,但目前的調整已經接近完成。
這個我改MetersToPixels的值會段錯誤不知道為什么
請求繪制特定的 world_chunk
在處理矩形輪廓時,可以請求特定區域的地面數據。首先,檢查地面緩沖區是否已存在所需的地面數據。如果已存在對應的緩沖區,則不需要額外處理;如果沒有,則需要創建并填充新的地面緩沖區。通過比較當前位置與目標位置,確認是否已經獲取到所需的地面緩沖區。如果未找到有效的緩沖區,則可以使用空緩沖區并填充數據。
此過程涉及查找和驗證地面緩沖區,確保所需的地面數據正確加載。如果沒有找到適用的緩沖區,則會通過創建一個新的緩沖區并填充數據來處理。最終,這將確保所有所需的地面數據得到有效管理,保證游戲世界的各個部分能夠正確加載和顯示。
代碼運行出現斷言錯誤
- 看看什么原因導致的段錯誤
- GroundBuffer->P = NullPosition(); 函數NullPosition 的局部變量沒初始化返回垃圾數據
-
修改的代碼
-
運行結果
在游戲中查看結果
系統在遍歷所有的塊時,幾乎已經正確實現了,問題在于未能遍歷到所有的塊。具體來說,當直接訪問某個塊時,能夠正確處理,但如果通過迭代,似乎有一個塊遺漏了。這個問題比較難理解,屬于一種不常見的 bug。雖然系統最終應該會用完所有塊,但問題在于沒有觸發塊的驅逐機制,因此即使塊數量很大,程序依然沒有達到預期的結尾。
雖然系統當前還沒有觸發驅逐,開發者對這個 bug 并不十分擔心,預計可以推遲到明天來修復。問題本身表現得有些奇怪,尤其是在塊的數量非常多的情況下,可能會影響程序的正常運行。然而,整體來看,緩存工作進行得還算順利,只是遺漏的塊讓調試顯得更為復雜。最終目標是實現一個有效的驅逐機制,并且大致能看到系統的正常工作流程。
找出 Chunk
為什么只有在角色踩上去時才會生成
系統遇到了一個問題,即無法生成預期中的某些塊。雖然在循環中正確處理了從主塊到最大塊的范圍,包括了最大塊,并且這種處理方式在 x 和 y 軸上都沒有問題,但仍然未能按預期填充所有塊。這個問題表現得有點奇怪,難以理解為什么某些塊沒有被正確填充。可能是渲染方面出了問題,但這種可能性較小。
問題可能出在填充塊的邏輯上,當前的處理方式可能并沒有按預期正確填充塊。系統的當前實現可能存在低效之處,導致無法及時發現錯誤。由于沒有驅逐機制,系統需要更長的時間來完成這些操作,這也可能是導致問題的原因之一。雖然系統目前已經處理了一些塊,但仍有遺漏,調試過程需要仔細檢查每一步。
系統已經采用了相機邊界和屏幕寬度的計算方式來映射塊空間,獲取最小和最大邊界,這種方法看起來是合理的,但目前仍然沒有完全解決問題,需要進一步調試并修復錯誤。
之前一切運行得都很完美
問題最終找到了根本原因:之前的繪制循環只會在塊中存在數據時才進行繪制。也就是說,如果某個塊中沒有實體,就不會進行繪制,導致這些塊在初始時并沒有被渲染出來。然而,當玩家或敵人進入這些塊時,實體被加載進來,塊也變得活躍,從而觸發了塊的渲染。
這其實是一個相當簡單的問題,只是沒有意識到缺少數據時塊不會被繪制出來。這個問題解決后,系統可以正常工作,塊會在需要時激活和渲染。問題的本質是由于塊中沒有實體,因此這些塊被跳過了,直到有實體進入后才會被渲染和處理。
問題解決
雖然系統已經正常運行,但仍有一些問題需要處理,比如塊的對齊、是否正確加載以及如何在不同的縮放級別下正常工作,這些細節還需要進一步改進。目前的實現還沒有達到完美,但這些問題并不復雜,明天可以輕松解決。
接下來需要做的主要是無縫地生成塊,這項工作其實并不困難。最終目標是將這部分操作放在單獨的線程中,使其更加高效,從而避免現在出現的卡頓現象。總體來說,這種方案已經在初步實現上運行得相當順利,而且沒有涉及太復雜的操作,整體表現不錯,令人滿意。
問題:Muratori 語法是什么?
目前遇到的一個問題是圖形中的一些透明區域沒有完全填充,導致顯示時仍然能夠看到一些未完全渲染的部分。這可能是因為塊的邊界問題,也可能是由于某些渲染過程中的異常情況。這個問題看起來是由于塊的邊界處理引起的,可能涉及到特定的渲染或合成方式,具體原因還不太明確。
另外,還提到了一些過時的語法問題,特別是涉及到早期編譯器的行為。在舊版本的編譯器中,為了確保作用域正確,有時需要使用額外的括號來手動指定作用域范圍。這是因為不同的編譯器(如 MSVC 和 GCC)會以不同的方式處理作用域。在過去,為了讓不同的編譯器行為一致,必須使用這種額外的括號語法來避免作用域沖突。然而,隨著編譯器的改進,這種語法已經不再必要,但它在過去是確保代碼正確性的唯一方法。
問題:隨機地面斑塊是否會基于某個種子,以便在 ground_buffer
被清除后可以按原樣重新生成?
地面緩沖區是基于一些種子值生成隨機的,這樣即使在緩沖區被驅逐后,它也可以根據相同的種子重新生成,從而保持一致性。這個設計非常有用,因為它允許緩沖區根據其來源的塊重新生成,確保了其可以無縫地恢復狀態。
這種機制將會在明天進一步優化,以實現更加平滑的過程。這種基于種子值的生成方式不僅能夠保證每次生成的內容一致,還能在需要時重新填充地面緩沖區,確保游戲世界的連貫性和流暢度。
問題:這個問題可能被問過很多次了,但有什么建議可以推薦學習哪種編程語言以及如何入門?
對于初學者來說,選擇編程語言時最重要的是找到一個能夠激發興趣的語言,而不是直接選擇像 C 或 C++ 這樣的高級語言,因為這些語言對于完全沒有編程經驗的人來說可能太復雜。C 和 C++ 更適合在掌握了基礎后,用于更精細的控制和高效代碼編寫。
對于初學者,建議選擇一門簡單、寬容且有良好標準庫的語言,避免過早涉及復雜的編程技巧。像 Python 或者 JavaScript 這樣的語言非常適合入門,它們允許用戶輕松上手并快速看到成果,不需要過多關注底層細節。隨著經驗的積累,當掌握了編程的基礎并準備好進一步提升時,再轉向 C 語言等更具挑戰性的語言,進一步掌握編程的高級概念和技術。
有人發現了一個 Muratori 風格的 for
語句
在調試過程中,發現了一段使用了 Muratori for 語法的代碼,并且令人驚訝的是,它竟然在實際代碼中出現了。之前并沒有意識到還有人會使用這種語法。仔細查看后發現,這段代碼只出現在某個特定的例程中,其他地方并沒有類似的寫法。雖然這段代碼的風格與自己的代碼有所不同,但確實在那個函數中出現了。這讓人感到非常好奇,想知道是誰寫了這段代碼,或者這是否是對某個參考的引用。
問題:為什么在調用函數時不以地址的形式傳遞 World
?
在討論中,提到為什么在調用函數時沒有將 world
作為地址傳遞。對此,回答者表示他們確信已經在傳遞 world
的指針,并指出幾乎每次調用時都會傳遞指針。并詢問提問者在哪里看到了沒有傳遞指針的情況。
問題:是否會實現 Z-buffer 和紋理縮放?
是否會使用混合 Z-buffer 緩沖區和紋理縮放。回答者表示不會使用 Z-buffer 緩沖區,因為它們不需要,并且使用它們會導致效率低下和質量下降。因此,將只進行排序操作,這樣可以正確地進行 alpha 合成,而不需要使用簡單的緩沖區。雖然有考慮過使用類似早期退出的方式來避免處理某些屏幕區域,但最終決定不使用。紋理縮放和旋轉將會繼續進行,但沒有進一步的計劃。
問題:是否有其他可能的 Z-buffer 方案?
在討論 Z-buffer緩沖區的使用可能性時,提到如果進行非常昂貴的著色器計算,可能會嘗試使用 Z 緩沖區來提前剔除不必要的計算,尤其是采用從前到后的繪制方式,以減少著色器計算量。然而,實際上即使是在這種情況下,也并不需要 Z 緩沖區,只需要一個二進制緩沖區,表示是否應該繪制。雖然有考慮過通過目標 alpha 來提前剔除,但最終認為即使如此,也不需要 Z 緩沖區,因為只要使用 alpha 就足以決定是否需要繼續計算。
總體來看,這種做法不太符合需求,認為如果能通過目標 alpha 來決定是否剔除,完全不需要浪費帶寬和計算去使用 Z 緩沖區。
是否可以通過屏幕尺寸或 CameraBoundsInMeters
來設置 SimBounds
的擴展?希望理解正確
如何設置SimBounds擴展的問題。SimBounds的目的是定義哪些內容需要高精度模擬,通常是屏幕上的物體以及周圍一定距離內的內容,例如可能會發出聲音或進入屏幕的角色,或者剛剛離開屏幕又可能返回的角色。目的是避免這些角色進入慢速更新循環,以確保它們能及時響應,保持與游戲玩法的緊密聯系。
然而,對于SimBounds應設置為多少距離,仍然不確定。雖然可以根據屏幕尺寸或相機邊界來設定,但具體的值還不清楚,可能需要更多的設計思路才能決定該設置什么。
問題:是否會實現動態光照或延遲渲染,以支持大量真實光源等?
討論了動態光照和延遲渲染的問題。延遲渲染的一個問題是透明度處理效果不理想,需要額外的復雜操作才能使透明度正常工作。此外,對于一個2D游戲來說,現代GPU的計算能力非常強大,采用延遲渲染可能并不劃算,因為它會犧牲透明度等其他功能,且只是在深度復雜度的管理上有所幫助。
延遲渲染的核心優勢在于它可以減少計算量,尤其是在屏幕部分區域存在大量過度繪制時。它的作用是優化計算,避免對那些堆疊在一起的物體進行冗余計算。然而,在具體應用中,需要評估是否真的存在大量的堆疊問題,如果并沒有,延遲渲染可能就不值得使用,反而會浪費時間且帶來透明度等功能的限制。
問題:有沒有可以推薦的硬核渲染工程師?
尋找硬核渲染專家的問題。提到如今這類專家不多,但可以考慮聯系一些在顯卡公司(如NVIDIA)或游戲引擎團隊(例如Frostbite或Unreal引擎)的渲染人員。這樣的專家可能會給出有關2D游戲是否使用深度緩沖的建議。