UE4中的DynamicTexture数据更新

本文介绍了在UE4中优化大量顶点动画的方法,通过使用Dynamic Texture和Vertex Texture来减轻CPU压力。原先的Dynamic Vertex Buffer更新效率低下,改为更新Texture后,将顶点坐标计算转移到GPU端。尽管数据量不变,但GameThread仍有较高消耗,进一步优化是将操作放入后台线程。文中提到FTwitchLiveStreaming::UpdateWebCamTexture()的实现,提供了直接在RenderThread更新D3D Texture的思路,利用RHIUpdateTexture2D进行高效更新。
摘要由CSDN通过智能技术生成

最近在UE4中实现了程序实时生成的Mesh顶点动画, 使用的顶点数目很多(几十万量级)

一开始是创建Dynamic Vertex Buffer, 然后每帧去更新顶点数据,发现效率比较低

效率的瓶颈在顶点坐标的计算上, 毕竟数量有点多

于是改成了基于Vertex Texture(Material中的World Position Offset)的实现,那VB就不用更新了, 只需要每帧更新Texture

这么做虽然传输的数据量是一致的, 但是可以把顶点坐标的一部分计算转入GPU端, 大大减轻了CPU压力

实际测下来发现GameThread的时间消耗仍然很高, 那进一步的优化就是把这部分操作扔进后台线程

void ADynamicTextureTestCharacter::UpdateInGameThread()
{
	FTexture2DMipMap& Mip = DynamicTexture->PlatformData->Mips[0];
	FVector4* Dest = (FVector4*)Mip.BulkData.Lock(LOCK_READ_WRITE);
	WriteTextureData(Dest);
	Mip.BulkData.Unlock();
	DynamicTexture->UpdateResource();
}

改完一测, Crash了, 仔细一看, 原来是FTexture2D::UpdateResource()中会重新创建D3D Texture对象,相关函数必须是GameThread中调用才可以

本身这种数据更新的方式就有问题, 能不能直接更新到对应的D3D Texture中呢?搜索UE4的代码, 发现FTwitchLiveSt

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值