- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试访问像素数据并将图像从游戏中的相机保存到磁盘。最初,简单的方法是使用渲染目标,然后使用RenderTarget-> ReadPixels(),但是由于ReadPixels()的 native 实现包含对FlushRenderingCommands()的调用,因此它将阻塞游戏线程,直到图像被保存为止。作为计算密集型操作,这使我的FPS降低了太多。
为了解决此问题,我尝试创建一个专用线程,该线程可以作为CaptureComponent访问摄像机,然后采用类似的方法。但是由于只能从游戏线程中调用FlushRenderingCommands()块,因此我不得不在没有该调用的情况下重写ReadPixels()(以一种非阻塞的方式,受https://wiki.unrealengine.com/Render_Target_Lookup教程的启发):但是即使那样我每当保存图像时,我的游戏内FPS都会出现问题(我确认这不是因为实际保存到磁盘操作,而是因为像素数据访问)。我重写的ReadPixels()函数如下所示,我希望就这里可能出现的问题获得一些建议。我不确定是否可以从非游戏线程中调用ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER,这是否是我的问题的一部分。
APIPCamera* cam = GameThread->CameraDirector->getCamera(0);
USceneCaptureComponent2D* capture = cam->getCaptureComponent(EPIPCameraType::PIP_CAMERA_TYPE_SCENE, true);
if (capture != nullptr) {
if (capture->TextureTarget != nullptr) {
FTextureRenderTargetResource* RenderResource = capture->TextureTarget->GetRenderTargetResource();
if (RenderResource != nullptr) {
width = capture->TextureTarget->GetSurfaceWidth();
height = capture->TextureTarget->GetSurfaceHeight();
// Read the render target surface data back.
struct FReadSurfaceContext
{
FRenderTarget* SrcRenderTarget;
TArray<FColor>* OutData;
FIntRect Rect;
FReadSurfaceDataFlags Flags;
};
bmp.Reset();
FReadSurfaceContext ReadSurfaceContext =
{
RenderResource,
&bmp,
FIntRect(0, 0, RenderResource->GetSizeXY().X, RenderResource->GetSizeXY().Y),
FReadSurfaceDataFlags(RCM_UNorm, CubeFace_MAX)
};
ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER(
ReadSurfaceCommand,
FReadSurfaceContext, Context, ReadSurfaceContext,
{
RHICmdList.ReadSurfaceData(
Context.SrcRenderTarget->GetRenderTargetTexture(),
Context.Rect,
*Context.OutData,
Context.Flags
);
});
}
}
}
最佳答案
因为有任务图的底层调用,所以应该可以从任何线程调用ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER
。当您分析该宏生成的代码时,您可以看到它:
if(ShouldExecuteOnRenderThread())
{
CheckNotBlockedOnRenderThread();
TGraphTask<EURCMacro_##TypeName>::CreateTask().ConstructAndDispatchWhenReady(ParamValue1);
}
USceneCaptureComponent2D
),因为这些对象由Garbage Collector管理,并由游戏线程拥有。
(...) but even then I am facing a problem with my in-game FPS being jerky whenever an image is saved
stat unit
或
stat unitgraph
命令检查了导致FPS下降的线程?您还可以使用
profiling tools进行更详细的了解,并确保没有其他导致延迟的原因。
for
循环中复制数据,然后检查FPS是否有任何改进。这可能会更快一点,因为它们之间没有像素操纵/转换。
关于multithreading - 虚幻引擎4 : Adapting ReadPixels() to a multithreaded framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43359588/
我正在尝试使用 unity 创建一个小的测试应用程序。我正在构建应用程序的一个实例并将其设置为充当主机,然后在统一编辑器中作为客户端运行另一个实例。在当前的迭代中,我有一个按钮,按下时应该截取屏幕截图
我正在尝试将图像(作为纹理)绘制到帧缓冲区,应用锐度过滤器(通过拖动 UI 上的 slider ),然后从帧缓冲区读取结果,并通过调用将数据复制到简单的 2d Canvas (不是 webgl) re
为什么我从WebGLRenderingContext.readPixels()获得的imageData颠倒了? 我尝试做以下事情: var gl = renderer.domElement.getCo
我不明白为什么我在 requestanimationframe 循环内丢失了 readpixel 值? var pixels = new Uint8Array(12*12*4); gl.clearCo
我使用 webgl_draw_buffers 扩展创建了一个帧缓冲区对象,以提供三个颜色缓冲区: colorBuffer0 = gl.createRenderbuffer(); gl.bind
当尝试使用大量数据(但屏幕上几乎没有数据)进行 HitTest 时,即使帧时间远低于 16.7 毫秒(总共 10 毫秒),读取像素也非常慢 我正在开发一个在 webgl 中运行的 datavis 平台
谁能告诉我如何在 JOGL 中从缓冲区中读取像素。请用代码说明。 最佳答案 渲染完成后,调用这个方法: public BufferedImage toImage(GL gl, int w, int h
我一直在尝试使用 WebGL 来实现裁剪和封顶。为此,我必须使用模板缓冲区来限制剪切平面的绘制,以便仅绘制对象内部的部分。 首先,我一直在尝试使用模板缓冲区。我的目标是检查 gl.clearStenc
我正在尝试使用 WebGL 来加速小型量子电路模拟中的计算,就像 Quantum Computing Playground does 那样。 。我遇到的问题是 readPixels 需要大约 10ms
我想从我的相机 View 中检索深度缓冲区以用于 3D 过滤应用程序。目前,我正在使用 glReadPixels 来获取深度组件。而不是 [0,1] 值,我需要深度缓冲区的真实值,或者在世界坐标中到相
基本上我有 200 X 200 像素的 Canvas ,一个 20 X 20 X 20 像素的体素。所以我有 100 个体素。当我在 Canvas 上绘图时,我想查看绘制了哪个像素,如果该像素位于其中
我将 id(这是一个包含在 24 位范围内的值)存储到 Float32Array(3) 中,以便稍后在 WebGL 中检索: var r = 0, g = 0, b = id; if
我正在尝试访问像素数据并将图像从游戏中的相机保存到磁盘。最初,简单的方法是使用渲染目标,然后使用RenderTarget-> ReadPixels(),但是由于ReadPixels()的 native
我已更新到 FireFox35,但以下代码不再起作用: var ctx = renderer2.getContext("experimental-webgl",{preserveDrawing
我正在使用headless-gl与 Node 一起在服务器端渲染生成的高分辨率 WebGL 图像。根据所选的分辨率,这可以正常工作。 'use strict'; const Gl = require(
我正在使用 headless-gl 在 Node.js 上运行 webGL,在服务器上动态创建图像。创建后,图像将存储在数据库 (MongoDB) 中,然后用户可以通过 API 再次访问图像。 下面是
图像采用 Base64 格式,我想比较像素关系。 在了解 GPU 的工作原理后,我认为这种类型的分析在 Canvas webgl 上下文中表现最佳,而不是像我之前使用的 2d 。我以前没有使用过 We
我试图将 RenderTexture 绘制到 Texture2D 中,目的是将其保存到磁盘。这种方法在 OSX 编辑器和 Android 上一直有效。 我在 XCode 控制台中没有看到任何错误,当我
我创建了两个 html 客户端,它们使用 websocket 服务器相互通信。一个客户端使用 Three.js 在其 Canvas 上绘制 3D 模型,并将 Canvas 上下文(即 webGl)作为
是否可以在具有多个附件的帧缓冲区上以浮点形式检索像素值? (WebGL 2) 我试过这个: var framebuffer = _gl.createFramebuffer(); _gl.bindFra
我是一名优秀的程序员,十分优秀!