小编Blu*_*kMN的帖子

高精度睡眠或如何产生CPU并保持精确的帧速率

我在2D游戏引擎上工作,该引擎具有一个名为LimitFrameRate的功能,以确保游戏运行速度不快,用户无法玩游戏.在这个游戏引擎中,游戏的速度与帧速率有关.因此通常人们希望将帧速率限制为大约60 fps.这个函数的代码相对简单:计算我们应该在下一帧开始工作之前剩余的时间量,将其转换为毫秒,睡眠该毫秒数(可能是0),重复直到它恰好是正确的时间,然后退出.这是代码:

public virtual void LimitFrameRate(int fps)
{
  long freq;
  long frame;
  freq = System.Diagnostics.Stopwatch.Frequency;
  frame = System.Diagnostics.Stopwatch.GetTimestamp();
  while ((frame - previousFrame) * fps < freq)
  {
     int sleepTime = (int)((previousFrame * fps + freq - frame * fps) * 1000 / (freq * fps));
     System.Threading.Thread.Sleep(sleepTime);
     frame = System.Diagnostics.Stopwatch.GetTimestamp();
  }
  previousFrame = frame;
}
Run Code Online (Sandbox Code Playgroud)

当然,我发现由于某些系统上睡眠功能的不精确性,帧速率与预期完全不同.睡眠功能的精度只有大约15毫秒,所以你不能等待.奇怪的是,有些系统使用此代码可以实现完美的帧速率,并且可以完美地实现一系列帧速率.但其他系统则没有.我可以删除睡眠功能,然后其他系统将实现帧速率,但随后它们占用了CPU.

我读过有关睡眠功能的其他文章:

编码器是做什么的?我不是要求保证帧速率(换句话说,保证睡眠时间),只是一般行为.我希望能够睡眠(例如)7毫秒来为操作系统提供一些CPU,并且通常在7毫秒或更短的时间内返回控制(只要它恢复一些CPU时间),如果需要更有时候,那没关系.所以我的问题如下:

  1. 为什么睡眠在某些Windows环境中完美而精确地工作而不在其他环境中?(有没有办法在所有环境中获得相同的行为?)
  2. 如何在不占用C#代码的CPU的情况下实现通常精确的帧速率?

.net c# sleep

5
推荐指数
2
解决办法
3643
查看次数

HTML5 Canvas在Chrome上速度较慢,但​​在FireFox上速度较快

我正在具有4 GB RAM的双核2.8 GHz Pentium Windows 7系统上测试Chrome 15.0.874.106m(具有大量内存的高度加速的视频卡),并且正在单核上测试FireFox 7.0.1具有2 GB RAM的1.6 GHz Athalon Windows Vista笔记本电脑。但是,FireFox系统的性能要比Chrome系统好大约10倍(根据我的视觉估计,它是FPS的10倍)。

我看到的大多数帖子在FireFox和Chrome上的运行速度都还不错,但是在这里我似乎遇到了严重的逆转。关于什么可能对此负责的任何想法?我正在测试的HTML文件(单个文件,没有依赖项)约为33 MB(压缩后为16 MB),可在此处获得

这是对小文件与大文件的HTML5 canvas性能的跟踪。

我发现chrome:// tracing可以帮助我通过chrome profiler运行问题文件来获取这些配置文件结果:

编辑: 结果已删除,我得到了一些更有趣的新结果,我将在新部分中进行介绍(请参见下文)。 结束编辑

我还发现了--show-fps-counter,它显示了大约3.5 FPS的滚动速度。但是我仍然不清楚问题出在哪里。

我还找到了--use-gl开关,并尝试了台式机,例如egl和osmesa。对于osmesa,性能似乎最好,但几乎没有。我不知道确切多少,因为show-fps-counter开关显然不能与use-gl = osmesa一起使用。在其他系统上,osmesa的性能仍然不如FireFox差。

编辑续:由于事件处理中的偶然事件,我以某种方式进入了一种模式,无需按住鼠标键即可滚动地图。令我震惊和惊讶的是,它的滚动非常平稳!通过进行一些其他编辑(即,删除处理mouseup事件的代码),我切换了代码,因此不再需要按住按钮来滚动。瞧,只要不按住鼠标按钮,我就可以持续非常流畅地滚动。因此,我在使用chrome:// tracing的情况下(没有按住鼠标按钮的情况下)来分析/跟踪了行为。我的结果如下。

无需按住鼠标键即可平滑滚动:

选择摘要:
 RenderWidget :: OnHandleInputEvent:1340.968ms 212次出现
 RenderWidget :: InvalidationCallback:7.867ms 27次出现
 RenderWidget :: OnUpdateRectAck:1.319ms 173次出现
 RenderWidget :: OnSwapBuffersComplete:129.018ms 173次出现
 V8EventListener :: callListenerFunction:1306.923ms 173次出现
 RenderWidget :: DoDeferredUpdate:120.033ms 204次
 EarlyOut_UpdateReplyPending:0.004ms 4次
 EarlyOut_SwapStillPending:0.181ms 165次出现
 CommandBufferHelper :: WaitForToken:8.358ms 3次
 WebViewImpl :: layout:1.24ms 190次
 CCLayerTreeHost …

javascript performance firefox google-chrome html5-canvas

5
推荐指数
1
解决办法
6520
查看次数

由InstallShield 2012构建的升级报告格式错误的安装版本

在使用InstallShield 2012 Spring内置的安装程序进行升级时,我看到以下消息:

  1. InstallShield向导会将<我们的产品>的已安装版本(9.01.005)更新为版本9.2.0.53。
  2. InstallShield向导正在将(<our product>)(9.01.005)更新到版本9.2.0.53。

这些消息基于字符串资源IDS_IFX_SDWELCOMMESSAGE_UPDATE_WELCOMEIDS_IFX_STATUSEX_STATICTEXT_UPDATEUI。我相信未更改的字符串资源将如下所示:

  • InstallShield向导会将已安装的%P版本(%VI)更新为版本%VS。要继续,请单击下一步。
  • InstallShield向导将%P(%VI)更新为版本%VS。

尽管某些资源指示第二个字符串资源是“ InstallShield向导已将%P的%VI更新为版本%VS”。

问题是旧的(已安装的)版本号应该是显示字符串,例如“ 9.1.5.2”,而不是内部版本号的格式化版本,例如“ 9.01.005”。据我了解,它SdSubstituteProductInfo用于在的默认InstallScript代码中IFX_INSTALLED_DISPLAY_VERSION填充%VI替换项OnUpdateUIBefore。以及IFX_INSTALLED_DISPLAY_VERSION来自的默认设置IFX_INSTALLED_VERSION,这说明了为什么首选的显示字符串没有出现在我们希望的位置。而且我假设SdWelcome(或任何对话框或类似引用的代码IFX_INSTALLED_DISPLAY_VERSION)也显示格式错误的版本。

尽管我在网上搜索了有关上述功能,字符串和字符串ID的所有内容,但我还没有找到以正确格式显示正确格式的旧版本号(DisplayVersion)的理想解决方案。一些文章建议对跳过旧版本号的格式字符串进行硬编码,而不要使用包含的字符串资源%VI。其他人建议根据需要手动格式化版本号,然后将结果放入IFX_INSTALLED_DISPLAY_VERSION。我知道有一个更好的答案,我希望下次我或其他任何人寻找它时,可以更轻松地找到它。

formatting installshield upgrade version installscript

5
推荐指数
1
解决办法
1242
查看次数

如何实现ContentProvider为Gmail,Facebook,Evernote等提供图像

我之前的问题(是否可以通过数据网址在Android上共享图像?)与此问题相关.我已经想出如何在没有将文件写入外部存储的许可的情况下将我的应用程序中的图像共享到另一个应用程序.但是,我仍然会遇到许多问题行为:

  1. 当我尝试从手机(Android 2.2.2)共享图像时,接收应用程序中会出现致命错误,并且它们根本没有提供图像.(这可能是我的应用程序中某些操作导致Android 2.2.2不支持的结果吗?或者这会导致我的应用程序而不是目标应用程序出错?)
  2. 当我尝试将图像分享到Evernote时,一切正常,但有时在保存笔记几秒后,我在应用程序屏幕的底部(来自Evernote应用程序)收到一条消息:"java.lang.SecurityException:权限拒绝:打开来自ProcessRecord的提供者com.enigmadream.picturecode.PictureContentProvider {413db6d0 1872:com.evernote/u0a10105}(pid = 1872,uid = 10105),不从uid 10104导出"
  3. 当我尝试将图片分享到Facebook时,图片中有一个矩形,但没有图片.

下面是我的ContentProvider代码.必须有一种更简单和/或更合适的方式来实现基于文件的ContentProvider(尤其是查询功能).我希望很多问题都来自查询实现.有趣的是,这将Gmail时对我的Nexus 7非常漂亮的工作.它也会为附件选择正确的显示名称和大小.

public class PictureContentProvider extends ContentProvider implements AutoAnimate {
    public static final Uri CONTENT_URI = Uri.parse("content://com.enigmadream.picturecode.snapshot/picture.png");
    private static String[] mimeTypes = {"image/png"};
    private Uri generatedUri;

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
       throw new RuntimeException("PictureContentProvider.delete not supported");
    }

    @Override
    public String getType(Uri uri) {
       return "image/png";
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
       throw new …
Run Code Online (Sandbox Code Playgroud)

java android android-intent android-contentprovider

5
推荐指数
1
解决办法
5078
查看次数

VS Code 突出显示与阴沟中另一个 git 分支的差异

我真的很喜欢按 Alt-F5 跳转到我编辑的下一个代码块的功能,但现在我们的源代码控制流程将发生变化,我的更改将更频繁地提交,这意味着编辑器中可见的更改更少,因为我更频繁地做出承诺。有没有办法将另一个分支视为装订线突出显示和“下一个差异”快捷方式的基础?例如,我希望当前分支与 master 或 main 之间的所有差异都显示在装订线中,而不仅仅是未提交的更改,这样每当我拥有该文件时,我就可以快速跳转到当前分支中已更改的代码块在默认编辑器中打开(不必运行 diff)。

visual-studio-code

5
推荐指数
0
解决办法
235
查看次数

当创建它的线程终止时,CLR是否释放了COM对象?

我一直无法弄清楚如何搜索这种怀疑的确认,但我看到证据表明在一个线程上创建的COM对象不再可用于其他线程(已经与其底层RCW分离的COM对象无法使用)一旦代码在创建它的线程上停止执行(并且该线程可能已终止).这是一个非常隐蔽的问题,因为我在System.Runtime.InteropServices.Marshal.ReleaseComObject整个代码中都有调用,但我无法识别是否有任何调用导致此错误.最后我得出结论,当辅助线程停止执行时,COM对象显然被隐式释放.这可能是真的吗?这是记录在案的行为?

.net c# vb.net com com-interop

4
推荐指数
1
解决办法
517
查看次数

查找哪个.NET程序集定义了一个类型

如果我没记错的话,在旧的C++时代MSDN曾经有用,因为它不仅会显示您需要包含的头文件来访问特定的函数,还会显示您需要链接到该功能所在的DLL的DLL.实现.但是现在,虽然MSDN告诉您定义对象的命名空间,但它并没有告诉您需要添加什么引用来获取该对象.是不是或者不应该有一种简单的方法来查找在Web上发布的各种答案中引用的所有.NET对象,主要是在SO上?如何找到包含对象的程序集?(我现在碰巧在寻找System.ComponentModel.ExpandableObjectConverter.)

.net c# msdn

1
推荐指数
1
解决办法
67
查看次数

可以将NPT图像glTexImage2d转换为Pow-2纹理而无需额外分配?

我发现还有相当数量的驱动程序不支持NPOT纹理所以我试图改造我的2D引擎(基于OpenTK,而后者又基于OpenGL),而不是支持Texture2D依赖于GL_ARB_texture_rectangle.作为其中的一部分,我强制所有NPOTS纹理位图分配额外的空间,直到下一个2的幂大小,这样它们就不会在这些驱动程序上造成错误.我的问题是,我是否真的需要调整实际位图和纹理的大小并分配所有额外的内存,或者是否有办法告诉OpenGL我想要2次幂大小的纹理,但我只会使用左上角的一部分?

现在我的电话看起来像这样:

GL.TexImage2D(texTarget, 0, PixelInternalFormat.Rgba8, bmpUse.Width, bmpUse.Height, 0, PixelFormat.Bgra, PixelType.UnsignedByte, bits.Scan0);
Run Code Online (Sandbox Code Playgroud)

这是在我使bmpUse成为我的真实纹理位图的副本后,在右侧和底部有额外的空间.

opengl texture2d

0
推荐指数
1
解决办法
1163
查看次数

PHP中的通配符复制文件

我想在PHP脚本中执行以下bash(shell)命令的等效命令:

cp --parents -t ../../htdocs/host/$2/ *.html *.js *.png *.ogg *.mp3 Sprites/*.js
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用PHP system()命令时,它无法正常工作,大概是因为cp是shell的一部分,而不是一个独立的可执行文件.我不认为PHP copy()函数支持通配符,或者如果它支持通配符,它​​肯定不支持我指定的命令行开关.什么是在PHP中执行此操作的最简单,最好的方法.我可以创建一个shell脚本并在其上调用system(),但这看起来很糟糕.

编辑:评论正确; 我相信我有一个许可问题.为什么我对mkdir("blahblah/htdocs/host/$ REV",775)的调用没有设置所有者和组可写权限?

php linux bash command-line

0
推荐指数
1
解决办法
3240
查看次数

Begin附近的语法无效

CREATE PROCEDURE InsertSummary

    (
    @symbol nvarchar(50),
    @openValue nvarchar(50),
    @closeValue nvarchar(50),
    @highvalue nvarchar(50),
    @lowvalue varchar(50),
    @currentValue nvarchar(50),
    @change nvarchar(50),
    @volume nvarchar(50)
    )

BEGIN

INSERT INTO [MarketSummary]
     (
        [Symbol],
        [Open],
        [Close],
        [High],
        [Low],
        [Current],
        [Change],
        [Volume]
    ) VALUES 
    ( 
        @symbol,
        @openValue,
        @closeValue,
        @highValue,
        @lowValue,
        @currentValue,
        @change,
        @volume
)
;

END
Run Code Online (Sandbox Code Playgroud)

sql syntax

-4
推荐指数
1
解决办法
81
查看次数