问题标签 [tearing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1372 浏览

linux - 避免linux + QT中的屏幕撕裂

据我了解,X11 不支持双/三缓冲机制以避免屏幕撕裂。所以我尝试使用openGL小部件,然后我明白没有支持openGL + raspberry pi + qt4。

我所要求的只是一个非常基本的事情,从摄像机捕捉帧,处理它们,并在屏幕上显示,我变得非常!坏的屏幕撕裂。

我知道 QT5+WAYLAND+PI 确实有某种(?)对 openGL 的支持,这会帮助我解决这个问题吗?(相当容易,我的意思是我的应用程序没有大的变化!!)还有什么我可以做的吗?做?(除了更改 X11 的源代码...) :)

0 投票
2 回答
497 浏览

processing - 简单处理动画中的撕裂和抖动

我是处理新手。我用弹跳球编写了以下代码,但动画并不流畅。我已经在多台计算机上运行了该应用程序,我偶尔会看到一些球出现抖动或撕裂。我不认为它与计算时间有关,因为每帧涉及的计算并不多。此外,我已经阅读了处理已经是双缓冲的。

以下是相关代码:

我怎样才能摆脱抖动和撕裂?如何确保以最佳方式使用显卡驱动程序。请注意,我使用带有 MATE 桌面管理器的 Linux Mint 17.3。所有经过测试的 PC 上的操作系统相同且行为相同。

[编辑 05/01/2016] 在屏幕外生成圆圈甚至使用屏幕大小的离线图像后,我仍然有些撕裂。这是更新的代码:

0 投票
1 回答
416 浏览

c - 如何在不引入锁定的情况下制作同时读取和修改明确定义的数组的代码?

我正在编写一个程序来计算国际象棋变体的残局表库。填充表库的算法是这样工作的:

  1. 从一个巨大的数组开始unsigned char,每个成员代表一个位置(我们总是假设轮到白方)。一个数组成员即使位置输了,如果它赢了,它是奇数,如果它是0xff无效的,0xfe如果它是平局。
  2. 遍历数组,用 标记每个非法位置,与0xff白色配对的每个位置以及用 标记0x00所有其他位置0x0fe
  3. 遍历数组,只考虑标记的位置0xfe。检查是否有移动导致数组成员为偶数的位置,如果有,则将1加上该位置的编号写入当前位置对应的成员中。如果所有动作都指向奇数表示的位置(即这是一个失败的位置),则将该位置标记为这些数字中的最高值的一加,以表明最强的防守需要多长时间。
  4. 重复第三步,直到数组不再改变。

为了速度,我想并行化第三步。仔细阅读会发现,在每次迭代中,我们只会将一个值(迭代次数)写入数组。以下策略获得:

  • 将数组拆分为n 个部分,让一个线程处理每个部分。让当前迭代为i
  • 如果一个线程必须从数组中读取一个成员并且它等于i,则将其视为设置为,0xfe因为这意味着该成员只是由另一个线程同时写入。

现在显然这个程序中有一个竞争条件,但这没关系,因为如果没有任何粉红色的大象char(如果 a以原子方式编写,则不存在),我们总是能得到正确的结果。但是,由于理论上存在竞争条件,C 编译器可能会声明我的程序未定义并格式化我的硬盘。

在不违反 C 内存模型的任何约束并且不会导致严重减速(例如通过添加锁)的情况下,我可以做些什么来并行化该算法?

简化的问题描述

这是一个简化的算法,它演示了相同的概念,但去掉了所有不重要的东西:

  1. 从数组开始unsigned char a[n]。每个数组成员为 0 或 1。
  2. 对于设置为 0 的每个数组成员:如果其​​他一些数组成员等于 0 或 2,则将此数组成员设置为 2。检查的数组成员取决于我们要更新的数组成员的索引。索引和我们需要检查的数组成员之间没有简单的关系,它本质上是随机的。

由于我们只将 0 更改为 2,因此我们处理数组条目的顺序无关紧要,即使在技术上并行执行时存在竞争条件(因为我们同时读取/写入同一个对象) . 我如何告诉编译器它不应该在不牺牲性能的情况下关心竞态条件?

0 投票
3 回答
3131 浏览

c# - DateTime 可以在 64 位环境中撕裂吗?

在 C# 中,只要变量的大小最多native int(即 32 位运行时环境中的 4 个字节和 64 位运行时环境中的 8 个字节),为变量设置值是原子的。在包含所有引用类型和大多数内置值类型(byteshortintlong等)的 64 位环境中。

设置更大的值不是原子的,并且可能导致仅更新部分内存的撕裂。

DateTime是一个结构,它仅包含一个ulong包含其所有数据(TicksDateTimeKind)的字段,并且ulong在 64 位环境中其本身是原子的。

这是否意味着它DateTime也是原子的?或者下面的代码会在某些时候导致撕裂吗?

0 投票
1 回答
182 浏览

qt - 极端缩放时巨大的图像撕裂/消失

我有一个 7589x5537 的大图像,我将它作为QPixmapGraphicsItem.

如果我将其缩放QGraphicsView到 14.2318 并将其旋转 -35 度,则像素图的渲染开始表现得很奇怪;撕裂或完全消失。

这也发生在其他旋转和比例上,但前提是它们的比例大于 14。

我已经阅读了有关 X11 限制的信息,但我使用的是 Windows。

我在 Qt 5.5

我已经测试了将图像的内容更改为树模式的桶填充,完全相同的行为。图像已编入索引,但使用 RGB 我有同样的问题。

任何人都知道为什么会发生这种情况以及如何解决它?问题可以重现吗?

这个问题似乎与 unsigned int 的最大值有关,如果不旋转,则与维度无关。创建一个 100 万 x 200 像素的无底图像,可以放大到 4384 倍。在我的计算机中,unsigned int 的大小为 4 个字节,它可以处理大约高达 40 亿的值。

我认为 Qt 在缩放之前不会将放大的图像裁剪到视图中,或者类似的东西。奇怪的是,它会撕裂它而不是崩溃耗尽资源,未能分配连续的内存或其他东西。

这些都是怀疑,因为目前我不知道 QGraphicsView 如何实现缩放。

0 投票
1 回答
1537 浏览

c# - C# 值类型赋值是原子的吗?

值类型的分配是否在.Net 中被认为是原子的?

例如,考虑以下程序:

像这样的程序会遭受高级数据竞赛的困扰吗?甚至是数据竞赛

我想在这里知道的是:是否有任何可能性 v 将包含:

  • 由于可能的数据竞争导致的垃圾值
  • 指代分配前的位置和分配后的位置的混合组件 X、Y 或 Z。例如,如果 pos = (1,1,1) 然后为 pos 分配新值 (2,2,2) 可以 v = (1,2,2) 吗?
0 投票
1 回答
274 浏览

c# - 结构是否会导致内存问题?

第一件事:

  • 我知道什么Span<T>Memory<T>是什么

  • 我知道为什么Span<T>必须只驻留在堆栈上

  • 我(概念上)知道什么是结构撕裂

我还不清楚的是:结构撕裂不是问题Memory<T>吗?据我了解,基本上所有大于 WORD 大小的类型都可以/将受此影响。更进一步,当这种类型可以在多线程读写器场景中使用时,它可能会导致竞争条件,如下面的链接所述。

直截了当地说:这个例子Memory<T>使用而不是Span<T>

根据CoreFX 的实现, Memory<T>还依次布置了一个(托管对象)引用、它的长度和一个索引。Span<T>我失踪的区别在哪里,Memory<T>适合那些场景?

0 投票
0 回答
109 浏览

nvidia - Kubundu 20.04 在 Intel 和 Nvidia GPU 之间切换

我刚刚在我的“PC Specialist Defiance 2”笔记本电脑上全新安装了 Kubuntu 20.04(之前运行的是 Kubuntu 19.10),这是一个更名的 Clevo:

不幸的是,我无法在使用 Intel GPU 和 Nvidia GPU 之间干净利落地切换。在 19.10,我曾经能够简单地:

然后重新启动。虽然这在 Kubuntu 20.04 中仍然有效,但切换到 Nvidia GPU 会导致撕裂。为了摆脱撕裂,我创建/etc/modprobe.d/nvidia-tearing.conf了:

然后我运行sudo update-initramfs -u并重新启动,这解决了使用 Nvidia GPU 时的撕裂问题。但是,当我切换回 Intel GPU 时,我的笔记本电脑在启动过程中会死机。为了解决这个问题,我将上面的行注释掉,/etc/modprobe.d/nvidia-tearing.conf然后执行一次sudo update-initramfs -u(然后再次重新启动)。

有没有办法只nvidia-drm modeset=1在 Nvidia GPU 模式下运行该选项?