- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我有一个应用程序(一个游戏),可以在网格中绘制许多分层的 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/
我可以使用两种方法添加一个 child ,一种是 Canvas.AddVisualChild(Visual); Canvas.AddLogicalChild(Visual); 我在视觉对象的 Draw
在过去的几周里,我一直在尝试各种方法,试图找到将 BDD 用于依赖于 HTML5 Canvas 元素以及用户与之交互的 Web 应用程序的最佳方法。 我一直在使用 Jasmine 和 Cucumber
我正在尝试完成撤消/重做。我正在使用loadFromJSON(...)从我存储在数组中的 Canvas 状态重新构建 Canvas 。基本上,我的想法是破坏现有的 Canvas 并重新构建 Canva
我正在尝试在 Canvas 上设置简单的放大/缩小功能。我正在使用 KineticJS 处理触摸事件并在 Canvas 中绘图,但无法实现缩放。 KinteicJS 有一个类似的例子,但它们总是在中心
我正在使用 processing.js 在 javascript 中开发一个画笔应用程序 它正在使用 Canvas 对象。我想在 Canvas 的背景中保留一个图像。在前景中画一些东西。在保存时,我只
您好,我想为 discord.js Bot 安装 Canvas 。 当我尝试使用以下命令安装 Canvas 时npm install canvas我收到以下错误: pi@server:~/Bots/D
我正在尝试使用 Canvas 和动力学的组合来构建填充图案,但在尝试获得连续线时遇到了问题。 此 jsfiddle显示了到目前为止我所拥有的,但是因为我的重复模式是正方形,角会影响线条,我尝试使用 l
我正在开发一个 webassembly 程序。 我可以使用 emscripten_set_canvas_size 设置 Canvas 大小(我一直读到我需要切换到新的 API,因为这个 API 会贬值
您好,我已经为第一个 Canvas 中的第一个图像创建了一个圆形表单,但我没有成功使用第一个 Canvas 的 dataURL 并将其添加到第二个 Canvas 中。 这是我的 fiddle :htt
问题在于不同浏览器之间的不一致。 使用Dart Chrome,JS Chrome,JS Opera运行 双击可以进入和退出全屏 m_oCanvas.width =(window.screen.widt
我正在使用Flutter框架和Dart开发图像编辑器,因此无法将矩阵滤镜应用于 Canvas 。 我正在尝试使用“Paint”类和“canvas.drawPaint(paint)”函数将矩阵过滤器应用
如果在已经具有非整数比例因子的 Canvas 上绘制图像,我会遇到 Canvas 上下文drawImage()方法的问题。似乎这样的图像以一种奇怪的方式被剪切(有时图像的最右边的部分被剪切,有时是最底
Canvas 的“宽度”属性值有限制吗? 在下面的示例中,我在 ScrolledWindow 中创建一个 Canvas。 # Packages package require BWidget # Ma
我正在尝试制作类似于 this article 底部的效果的文本效果 我建议的方法是: 制作两个 Canvas ,一个是可见的,另一个是不可见的我用它作为缓冲区。 在缓冲区 Canvas 上绘制一些文
例如var new = canvas.toDataURL("image/png"); 我希望这个新变量中存在的 base64 显示到存在的第二个 Canvas 元素中。但是它不使用 drawimage
有人有使用这两个 Node.js 库中的一个或两个的经验吗?很想知道每个人的成功或困难。 最佳答案 LearnBoost是社区中最多产的 Node 模块开发人员之一,因此我选择使用 node-canv
如何知道 Canvas 运行的是“WebGL”还是普通 Canvas ? 通过检查源代码,我发现这两种情况都是 Canvas 。 最佳答案 这真的取决于你想如何去发现。 例如你可以这样调用 `getC
在 Canvas 上绘图非常好。甚至橡皮擦也能正常工作。问题是,当 Canvas 保存为图像时,它绘制的是黑线而不是橡皮擦。 为了更好地理解,我添加了屏幕截图和代码。 1。在删除绘图时 - 一个。源代
我正在尝试为 Canvas 附加鼠标悬停和鼠标移出事件: 默认 Canvas 是函数drawcircle的 Canvas 。 如果用户越过 Canvas ,应将其更改为drawEllipse的 Can
我正在使用 Three.js 构建一个简单的 2D 游戏。我只使用世界的 X 和 Y 位置来移动对象,将它们的 z 位置保留为零。我使用禁用旋转的 TrackballControls,以允许使用右键单
我是一名优秀的程序员,十分优秀!