关于 Puerts 的性能问题
Puerts 在 UE 开发中提供了一定的便利性,可以用代码的方式写蓝图,但是官方是不推荐这么做的
原话如下
那么这个性能问题究竟有多大呢
这里先用 C++ 写一个测试代码
#include "TestWidget.h" #include "Blueprint/WidgetBlueprintLibrary.h" #include "Blueprint/WidgetLayoutLibrary.h" int32 UTestWidget::NativePaint(const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyCullingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled) const { FPaintContext Context(AllottedGeometry, MyCullingRect, OutDrawElements, LayerId, InWidgetStyle, bParentEnabled); FVector2D ViewportSize = UWidgetLayoutLibrary::GetViewportSize(const_cast<UTestWidget*>(this)); FVector2D LeftTopPoint = FVector2D(ViewportSize.X * 0.2, ViewportSize.Y * 0.2); FVector2D RightTopPoint = FVector2D(ViewportSize.X * 0.8, ViewportSize.Y * 0.2); FVector2D LeftBottomPoint = FVector2D(ViewportSize.X * 0.2, ViewportSize.Y * 0.8); FVector2D RightBottomPoint = FVector2D(ViewportSize.X * 0.8, ViewportSize.Y * 0.8); UWidgetBlueprintLibrary::DrawLine(Context, LeftTopPoint, RightTopPoint); UWidgetBlueprintLibrary::DrawLine(Context, RightTopPoint, RightBottomPoint); UWidgetBlueprintLibrary::DrawLine(Context, RightBottomPoint, LeftBottomPoint); UWidgetBlueprintLibrary::DrawLine(Context, LeftBottomPoint, LeftTopPoint); return Super::NativePaint(Args, AllottedGeometry, MyCullingRect, OutDrawElements, LayerId, InWidgetStyle, bParentEnabled); }
然后用 Unreal Insight 看一下性能数据
只看 Paint 的数据,作为对照组
然后在 TypeScript 实现一样的代码
import { $Ref } from "puerts" import * as UE from "ue" class TS_TestWidget extends UE.PuertsWidget { OnPaint(Context: $Ref<UE.PaintContext>): void { let ViewportSize = UE.WidgetLayoutLibrary.GetViewportSize(this); let LeftTopPoint = new UE.Vector2D(ViewportSize.X * 0.2, ViewportSize.Y * 0.2); let RightTopPoint = new UE.Vector2D(ViewportSize.X * 0.8, ViewportSize.Y * 0.2); let LeftBottomPoint = new UE.Vector2D(ViewportSize.X * 0.2, ViewportSize.Y * 0.8); let RightBottomPoint = new UE.Vector2D(ViewportSize.X * 0.8, ViewportSize.Y * 0.8); UE.WidgetBlueprintLibrary.DrawLine(Context, LeftTopPoint, RightTopPoint); UE.WidgetBlueprintLibrary.DrawLine(Context, RightTopPoint, RightBottomPoint); UE.WidgetBlueprintLibrary.DrawLine(Context, RightBottomPoint, LeftBottomPoint); UE.WidgetBlueprintLibrary.DrawLine(Context, LeftBottomPoint, LeftTopPoint); } } export default TS_TestWidget
跟 C++ 对比,在最慢的时候可以可以达到几十倍的差距,假如有几十个这样的 Widget 同时运行(例如血条),那么肯定是会出现游戏顿卡或者游戏帧数低的情况
所以在 Puerts 中尽量不写每帧都会运行的逻辑,避免因为跨语言调用而造成的性能问题
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业