- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个全屏 Canvas ,上面绘制了 3 个图像。当我调整窗口大小时,这些图像会改变位置;然而,它似乎非常有问题,在 Firefox 中更是如此。
我一直在读双缓冲应该可以解决这个问题,但我想知道当下一个位置未知时如何双缓冲。也就是说,我无法确定将来应该缓冲什么,那怎么可能呢?
这是一个似乎可行的来源,但我不完全理解 Fedor 试图解释的概念。
Does HTML5/Canvas Support Double Buffering?
到目前为止我已经,
$canvas = $('#myclouds')[0];
$canvas_buffer = $('canvas')[0].insertAfter($canvas).css('visibility', 'hidden');
context = $canvas.getContext('2d');
context_buffer = $canvas_buffer.getContext('2d');
clouds_arr = [$canvas, $canvas_buffer];
$(window).resize(function () {
drawCanvas();
};
function initCanvas() {
// Sources for cloud images
var cloud1 = '/js/application/home/images/cloud1.png',
cloud2 = '/js/application/home/images/cloud2.png',
cloud3 = '/js/application/home/images/cloud3.png';
// add clouds to be drawn
// parameters are as follows:
// image source, x, y, ratio, adjustment)
addCloud(cloud1, null, 125, .03);
addCloud(cloud2, null, 75, .15);
addCloud(cloud3, null, 50, .55);
addCloud(cloud1, null, 125, .97, 300);
addCloud(cloud2, null, 70, .85, 300);
addCloud(cloud3, null, 45, .5, 300);
// Draw the canvas
drawCanvas();
}
function drawCanvas() {
// Reset
$canvas.attr('height', $window.height()).attr('width', $window.width());
// draw the clouds
var l = clouds.length;
for (var i = 0; i < l; i++) {
clouds[i].x = ($window.width() * clouds[i].ratio) - clouds[i].offset;
drawimage(context, clouds[i]);
}
}
function Cloud() {
this.x = 0;
this.y = 0;
}
function addCloud(path, x, y, ratio, offset) {
var c = new Cloud;
c.x = x;
c.y = y;
c.path = path;
c.ratio = ratio || 0;
c.offset = offset || 0;
clouds.push(c);
}
function drawimage(ctx, image) {
var clouds_obj = new Image();
clouds_obj.src = image.path;
clouds_obj.onload = function() {
ctx.drawImage(clouds_obj, image.x, image.y);
};
}
最佳答案
我想您可能误解了什么是双缓冲。它是一种在显示器上平滑实时渲染图形的技术。
这个概念是你有两个缓冲区。任何时候只有一个可见。当您绘制构成框架的元素时,您将它们绘制到不可见的缓冲区中。在你的情况下是云。然后翻转缓冲区,使隐藏的缓冲区可见,可见的缓冲区隐藏。然后在下一帧上绘制到现在新隐藏的缓冲区。然后在绘画结束时你翻转回来。
它的作用是阻止用户在帧完成之前看到元素的部分渲染。在游戏系统上,这也将与显示器的垂直刷新同步,以真正平滑并阻止诸如撕裂之类的伪影发生。
看看上面的代码,您似乎已经创建了两个 Canvas 元素,但您只使用了第一个 Context 对象。我认为这是不完整的,因为没有发生翻转。
还值得注意的是,拖动时窗口调整大小事件可能会连续触发,这可能会导致疯狂的渲染。我通常在调整大小事件上创建一个计时器来实际重新渲染。这样,只有当用户停止调整大小几毫秒后,才会重新渲染。
此外,您的绘制例程每次都会创建新的 Image 对象,但您不需要这样做。您可以使用一个图像对象并多次渲染到 Canvas 。这将大大加快渲染速度。
希望这有帮助。
关于javascript - HTML Canvas 双缓冲帧速率问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4539535/
我需要一次发送至少 200 条消息。程序启动后,给15或17发邮件成功,然后报错: 消息错误: com.sun.mail.smtp.SMTPSendFailedException: 421 4.4.2
我目前正在开发一个使用 AVSynthesizer 将文本转换为语音的 iOS 应用程序。 我想要做的是,当合成器在说话时,可以通过 slider 改变发声率,并且说话的速度会发生变化。 我在 sli
假设我们有以下场景: 包含 10,000 条消息的服务总线队列 Azure Functions(使用计划),其中函数设置为 SB 队列的触发器 外部(不受我们控制)系统无法超过特定请求率 如果我尽快对
TextToSpeech有设置语速的方法:setSpeechRate() .但它没有查询当前速度的相反方法。 有没有办法向系统查询该值? 最佳答案 您可能会得到默认的 TTS 语速 Settings.
我有一个关于 NGINX 速率限制的问题。 是否可以根据 JWT token 的解码值进行速率限制?我在文档中找不到任何这样的信息。 或者即使有一种通过创建纯自定义变量(使用 LuaJIT)来进行速率
我有一个带有方向键和 2 个按钮的游戏 handle 。所有这些都是数字的(不是模拟的)。 我有一个处理他们的事件的程序: -(void)gamepadTick:(float)delta {
所以我需要在 OpenCV 中获取网络摄像头的 fps 速率。哪个功能可以做这样的事情? 最佳答案 int cvGetCaptureProperty( CvCapture* capture, int
我四处寻找 CURL 设置文件,但没有在/etc/中找到它,也没有在 curl 站点 ether 上找到太多... 所以基本上我想做的是设置 curl 可以上传的最大速度限制(无论它正在运行多少个实例
我有一个在 Atom 上运行的嵌入式 Linux 系统,这是一个足够新的 CPU,可以有一个不变的 TSC(时间戳计数器),内核在启动时测量其频率。我在自己的代码中使用 TSC 来保持时间(避免内核调
我正在寻找一种以高粒度单独限制 RPC 速率的方法,令我沮丧的是,针对此问题可用的选项并不多。我正在尝试用 gRPC 替换 REST API,对我来说最重要的功能之一是能够为每个路由添加中间件。不幸的
我正在使用 PHP、MySQL 和 Redis 开发 API,并希望对特定调用进行速率限制。 API 位于 CloudFlare 后面。为实现这一点,我将增加每个 IP 地址每小时在 Redis 中进
我正在寻找一种以编程方式(无论是调用库还是独立程序)监视 linux 中实时 ip 流量的方法。我不想要总数,我想要当前正在使用的带宽。我正在寻找与 OS X 的 istat 菜单的网络流量监视器类似
所以我注意到 Apple 更改了 SKStoreProductViewController,禁用了“写评论”按钮。此问题是否有任何解决方法或修复方法? 最佳答案 SKStoreProductViewC
我今天浏览了 Amazon RDS 定价网站,现在确实想知道他们实际上如何计算 I/O 速率? “每 100 万个请求 0.10 美元”到底是什么意思? 谁能举出一些简单的例子,从 EC2 到 RDS
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 5 年前。 Improve
在旧的 API 中,剩余的允许容量显然作为 X-Ratelimit-Remaining 返回HTTP header 。 然而,current version's documentation对此一无所获
在我的 Android 应用程序中,我观察到前置摄像头录制的视频以 7-10 fps 的速度录制,而后置摄像头的工作正常, native 摄像头应用程序确实以 29fps 的速度录制前置摄像头的视频。
我正在编码一个里面有 dvb_teletext 的视频。打开输出流 #1:2 的编码器时出现错误提示。我使用以下命令对我的视频进行编码。 ffmpeg -threads 8 -i input.ts -
我正在使用以下命令为我的视频添加淡入淡出效果 {"-y", "-ss", "" + startMs / 1000, "-t", "" + (endMs - startMs) / 1000, "-i",
我正在尝试使用以下命令通过 FFMPEG 将 avi 视频文件转换为 flv 格式: -i C:\files\input\test.avi -y -ab 448k -ar 48000 -vcodec
我是一名优秀的程序员,十分优秀!