gpt4 book ai didi

JavaFX GrowableDataBuffer、Canvas 性能问题

转载 作者:行者123 更新时间:2023-12-02 10:57:46 24 4
gpt4 key购买 nike

所以我有一个应用程序(一个游戏),可以在网格中绘制许多分层的 PNG 屏幕。

    for (Image anImage : image) {
if ((x + offset + width) >= 0 && x + offset <= canvasWidth) {
gc.drawImage(anImage, x + offset, y, width, height);
drawn++;
} else {
segmentsSkipped++;
}
offset += width;
}
// if (drawn == 1) gc.drawImage(image[0], x + offset, y, width, height);

这是一个快速且简单的循环。我在运行

-Djavafx.animation.fullspeed=true

我无法提供 SSCE,因为正确的示例需要滚动等和 Sprite 才能正确再现。正如您在代码中看到的,为了减少绘制操作,我正在测试每个网格段是否在 Canvas 区域内,而不是在 Canvas 区域外绘制它们。这给我带来了大约 30FPS 的使用改进,但引起了一个奇怪的问题:通常在循环的每个周期,在 4K 显示器上,渲染器“跳过”5 部分网格的 3 部分 -(如预期)。即渲染器正在将两个图像绘制到屏幕上。据我在实践中可以隔离的情况来看,当跳过 4 个部分(即绘制填满整个屏幕的单个图像)时,就会出现问题。滚动过程中出现明显的停顿。有时这很重要,并且总是引人注目的。在更高的分辨率(超过 4k)上,当 2 移动到 3 个跳过的部分时,小跳跃很明显。

图像尺寸为 2800 英寸。太大,无法在非 DX12 卡上一次调用进行渲染。我的体温。解决方案是强制进行另一次绘制调用,正如您在注释代码部分中看到的那样。这有助于解决问题。我的怀疑(这是一个完整的猜测)是,随着图形所需区域的大小加倍,GrowableDataBuffer 正在快速变化。我在 GraphicsContext 中进行了研究,这“可能”似乎是问题的候选者,因为它似乎以 n^2 增长。

我的体温。解决方案可能是可行的,因为即使在不同的分辨率下,绘制的网格数量也不同,总是需要至少 2 个此尺寸的网格,这将允许大的 n^2 纹理的范围。但我更喜欢一个较少被黑客攻击的解决方案。我确实尝试访问缓冲区,但它是受包保护的。

我想知道 - 如果这是问题 - 是否有办法建议 GrowableDataBuffer 不要缩小并保持其较大的大小?或者也许有人知道造成这种情况的原因。

最佳答案

“黑客”的另一个(但更合乎逻辑的)实现是绘制那些稍微偏离屏幕的背景图 block ,并且可以在接下来的几帧中显示在屏幕上:

for (Image anImage : image) {
if ((x + offset + width) >= -RENDER_MARGIN && x + offset <= (canvasWidth + RENDER_MARGIN)) {
gc.drawImage(anImage, x + offset, y, width, height);
drawn++;
} else {
segmentsSkipped++;
}
offset += width;
}

常量RENDER_MARGIN从而定义了一个图 block 可以在屏幕外但仍然可以绘制的像素数量。实际值取决于您的滚动速度。

但是,我建议改进渲染逻辑,通过使用方法 GraphicsContext.drawImage(Image img, double sx, double sy, double sw, double sh, double dx, double dy, double dw, double dh)GrowableDataBuffer 保持在恒定大小。它允许您定义源区域和目标区域,即仅绘制当前帧屏幕上图像的确切区域。

题外话:我建议将背景图像分成更小的 block ,以减少内存使用量,并可能提高整体渲染性能。

关于JavaFX GrowableDataBuffer、Canvas 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51590793/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com