小编M K*_*atz的帖子

为什么我的Win32 gdi +游戏在Windows 7上速度异常慢?

[重要的新信息,请参阅下面此条目底部的内容]

我有一个使用GDI +的非常标准的游戏循环。在Vista和XP上,它工作得相当好(复杂游戏约25 fps,简单游戏约40 fps)。当我在Windows 7(具有明显更快的CPU和更多内存)上运行它时,它会减慢游戏无法使用的速度(我得到的范围从0 fps到4 fps)。我将下面的代码视为相关部分。正如我所说,我相信这是使用GDI +的最简单的(基于内存位图的)游戏循环。您可以在下面看到我为加快速度所做的两次尝试。首先,我担心如果InvalidateRect()的调用频率比发送WM_PAINT消息的调用频率高得多,则系统会以此为线索来表明我的程序运行不良/运行缓慢,并且隐瞒了我的时间片。所以我添加了paintIsPending标志以确保我没有 每种涂料会使失效不止一次。这没有改善。其次,我在下面的可选部分中添加了代码,认为如果我自己触发WM_PAINT消息而不是等待发送消息会更好。同样,没有任何改善。

对我来说,像这样的简单GDI +游戏循环会在Windows 7上死掉似乎让我感到疯狂。我知道Windows 7处理2D图形加速的方式有所不同,但是这段代码似乎太基础了,很难相信它不会功能。另外,我知道我可以切换到DirectX,并且可以这样做,但是目前在下面的DrawGameStuff(graphics)调用表示的代码库中投入了大量资金,如果可能,我宁愿不重写它。

谢谢你的帮助。

#define CLIENT_WIDTH 320
#define CLIENT_HEIGHT 480

Graphics *graphics;
HDC memoryDC;
HBITMAP memoryBitmap;
bool paintIsPending = false;

void InitializeEngine( HDC screenDC )
{
    memoryDC = CreateCompatibleDC( screenDC );
    memoryBitmap = CreateCompatibleBitmap( screenDC, CLIENT_WIDTH, CLIENT_HEIGHT );
    SelectObject( memoryDC, memoryBitmap );
    graphics = new Graphics( memoryDC );

    ...
}

BOOL InitInstance( HINSTANCE hInstance, int nCmdShow )
{
    ...
    InitializeEngine( GetWindowDC( hWnd ) );
    ...
    myTimer = SetTimer( hWnd, …
Run Code Online (Sandbox Code Playgroud)

winapi gdi+ game-engine

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

iPhone:如何/是否在新证书中包含我现有的私钥?

精简版:

我是否有必要甚至可能根据我现有的私钥生成新的分发证书,或者对于新应用和应用商店现有应用的更新都没有任何损害,以生成具有新私有的新证书键?

长版:

在我看来,iPhone开发人员计划用户指南中存在关于私钥和分发证书过期的冲突/误导信息.

一方面,它表示你应该保护自己的私钥,并保留一份副本,以便在更换开发者机器时可以在新机器上使用它.我的理解是,你必须抓住你的一个真正的私钥(即你在申请第一个证书时为你的公司生成的第一个私钥),并永久使用它(至少,一旦你部署了一个app,就永远使用它)用它到App Store).

另一方面,它告诉您分发证书在一年后到期,您可以在需要时简单地申请新的分发证书.对我来说有意义的是,如果他们跟着一个开头的段落"因为在请求新证书时使用原始私钥对您来说至关重要,这就是您如何申请从预先创建的证书现有私钥......"但是没有这样的段落,在搜索之后我还没有听说过这样做的方法.

stackoverflow上有这个密切相关的帖子:iPhone分发证书丢失的私钥.什么是解决方案?

该问题的答案似乎表明,当分发证书丢失或过期时,您可以撤消它并创建一个新的分发证书,并且对您当前在应用商店中的应用程序没有任何影响,并且您可以继续发布新的应用程序没有Apple的新证书说"嘿,你和以前不一样."

该帖子未回答的一个关键问题是,是否可以使用与之前发布的应用程序不同的证书/密钥来更新应用程序商店中的现有应用程序.但我在其他地方也听说过这也是可能的.

因此,它可归结为:苹果公司是否误导您的私钥真的是将应用程序标识为来自您公司的东西?它真的只是您的应用程序ID加上您登录开发门户网站的凭据以及识别您的公司和应用程序的itunesconnect吗?

iphone certificate private-key

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

在持久游戏中处理多个iOS Game Center用户

我已阅读http://developer.apple.com/library/ios/#DOCUMENTATION/NetworkingInternet/Conceptual/GameKit_Guide/Achievements/Achievements.html#//apple_ref/doc/uid/TP40008304-CH7-SW13.

我对在单个设备上支持多个游戏中心用户的问题感到困惑.

特别是,我很困惑如何在一个具有整体持久性进展的游戏中做到这一点,比如冒险游戏或填字游戏.

也就是说,我认为有两种游戏.在一个,你开始游戏,直到你死,然后游戏结束.使用Game Center多用户模型,这种游戏似乎很容易处理.当一个新的游戏中心玩家登录时,我可以加载他们的游戏中心统计数据,然后他们可以玩游戏,我会相应地调整他们的成就/分数.唯一的特例是,如果游戏中心玩家A正在玩游戏,游戏进入后台并且游戏中心玩家B登录,然后游戏到达前景会发生什么?在这种情况下,似乎很容易结束正在进行的游戏并说"对不起,你切换了游戏中心的用户.你需要开始一个新的游戏."

但是另一种类型的游戏是持续存在的,通常是自动的游戏.例如,假设我有一个有100个谜题的填字游戏.假设玩家A完成了8个谜题并且正在完成第9个谜题,然后游戏中心玩家改变为玩家B.假设玩家A已经获得了"解决了5个谜题"的成就.现在玩家B已经登录会发生什么?

采用"正确"方式做到这一点(上面似乎是苹果公司文件暗示的那个)是游戏应该为每个游戏中心玩家保持一个完整的保存状态.因此,当玩家B登录时,玩家A的状态应该自动保存到侧面并且谜题应该清除,因此玩家B可以从头开始对其进行操作.即使这样,当玩家A在新设备上安装游戏时仍会出现问题.新安装的游戏将完成零谜题,但玩家A的游戏中心用户已经拥有"解决了5个谜题"的成就.那么我们应该重置玩家A的成就吗?我们是否应该以某种方式自动填充拼图答案,让玩家A的游戏与他的成就保持一致?

在我看来,Game Center模型并没有考虑到这种总体持续进步.(事实上​​,如果游戏有自己的登录系统来管理多个玩家的状态,在我看来,处理多个游戏中心玩家变得更加复杂,因为需要有一种方法来匹配游戏将玩家集中到游戏登录玩家,据我所知,游戏必须提供一些匹配的界面才能使其发挥作用.)

无论如何,这是我对如何处理这个问题的"穷人的版本"的看法; 也就是说,如何使用具有全局持久状态的正常单人游戏(再次,像填字游戏),并使其与游戏中心"足够好"工作:

(1)游戏不会尝试将游戏"同步"到您的游戏中心统计数据.例如,如果您在一台设备上解决了9个谜题,然后在另一台设备上安装游戏并使用相同的游戏中心用户登录,则即使您的游戏中心播放器仍然具有以下功能,新游戏仍将解决零谜题"解决了5个谜题"的成就.

(2)如果你再继续完成5个谜题,没有任何改变,因为你已经获得了这个成就.但是当你完成25个谜题(或者下一个成就等级)时,你将获得新的成就.

(3)假设你(玩家A)已完成9个谜题然后你退出游戏中心而其他人(玩家B)登录同一个设备.在这种情况下,我们将加载玩家B的成就,让我们假设玩家B目前在游戏中没有成就.在富人的版本中,我认为我们应该重置谜题以匹配玩家B的成就.但在穷人的版本中,我们只是立即(并默默地)更新玩家B的成就以匹配游戏状态.所以玩家B会立即获得"解决5个谜题"的成就(即使是"赢得"它的玩家A).

这个穷人版本的底线是:

(a)如果两个或多个玩家在一个设备上登录和退出游戏中心,那么登录玩家当时取得成就的任何人都将获得该成就.如果状态更高,那么在登录时间,玩家的成就将"赶上"游戏的状态.因此,就像所有玩家"共同进步"一样 - 任何一名玩家的任何成就都会被任何其他玩家继承.

(b)如果你在新设备上卸载/重新安装或安装,你就从头开始谜题,但你的成就保持在他们所处的高点,一旦你开始超过这些数字,成就会增加以跟上您.

因此,总而言之,在我看来,任何具有全球持续进步的游戏(冒险游戏,填字游戏)都会面临多个游戏中心玩家的这些问题.在我看来,有两条路可走:正确的方式和穷人的方式.正确的方式似乎很复杂.例如,一个冒险游戏将不得不问用户类似的事情,"我看到你刚刚与一个不同的游戏中心玩家B签约.你想继续游戏并将所有进一步的进展与玩家B联系起来,或者做你想重置游戏,这样玩家B可以从头开始吗?" 然后它必须准备好为任何数量的游戏中心用户保存完整状态(库存,地图等).

这个穷人的解决方案似乎不太理想,但对于现有的游戏来说,只是想在不杀死自己的情况下"坚持"游戏中心的支持,这似乎是一个合理的选择,因为"正常"的用例不是拥有多个游戏中心玩家不断在单个设备上登录和退出.

所以我的问题是:

(a)我对这种情况的分析是否正确?

(b)穷人的解决方案是否已经概述了一个可行的解决方案?它是常用的吗?

multi-user ios game-center

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

将调试应用程序部署到playbook会出现"失败881所需签名丢失(RDK,AUTHOR)"

我正在使用Marmalade构建PlayBook应用程序,但我认为我的问题一般适用于PlayBook应用程序.我已经成功创建了一个debugtoken.bar文件并将其安装在我的设备上.当我尝试在设备上安装内置的application.bar文件时,我得到:

 [execute] "blackberry-deploy.bat -device 192.168.1.114 -password ******* -installApp -package deployments\default\playbook\release\Quote Unquote.bar"
Info: Sending request: Install
Info: Action: Install
Info: File size: 6400334
Info: Installing ...
Info: Processing 6400334 bytes
actual_dname::
actual_id::
actual_version::
result::failure 881 required signatures missing (RDK, AUTHOR)
ERROR: error running blackberry-deploy
***ERROR***
Run Code Online (Sandbox Code Playgroud)

请注意,这是运行标准PlayBook安装程序的Marmalade部署工具.

我不明白的是:我认为使用debugtoken.bar文件的关键是你可以安装未签名的应用程序.事实上,我已经使用Marmalade部署工具成功部署了这些未签名的应用程序.但是我在签署应用程序进行分发时遇到了问题,所以我回过头来从头开始做所有事情,从RIM请求新的代码签名密钥,制作一个新的debugtoken.bar文件并安装它等等.现在我的情况比我以前是因为我现在甚至无法安装到设备上.

再说一遍:我的理解是debugtoken.bar的重点是能够在实际签署application.bar进行分发之前部署到设备.那么这个错误信息甚至意味着什么呢?

install code-signing blackberry-playbook

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

在移动应用程序中结合 html 前端和 python“后端”

我的应用程序有一个基于 html 的前端,并在后端使用 python 逻辑。这个应用程序需要离线运行,没有连接到互联网,所以这里的“后端”不是指远程运行的服务器,而是与浏览器/html 在同一个应用程序中并行运行的 python 逻辑引擎。对于 Windows 或 Mac 桌面应用程序,我构建了一个 Chromium 嵌入式框架应用程序,然后启动一个运行使用 py2exe(或 py2app)构建的 CherryPy python 应用程序的子进程。客户端和服务器然后使用正常的 http 进行通信。

我想在 iOS 和 Android 上实现同样的目标。我研究了几种替代方案,但似乎没有什么能完全满足我的需要。

Kivy 很接近,但据我所知,它不提供浏览器/html 前端,而是在 OpenGL 之上提供自己的布局引擎。它有一个扩展机制,但这似乎更多是关于扩展 python 端,而不是前端端。

另一方面,我可以从PhoneGap 开始,然后添加一个python 库作为扩展(可能使用Kivy 的python 移动库构建)。或者就此而言,我可以编写一个嵌入浏览器并使用 python 库构建的常规 C++ 应用程序。

第三,我尝试过使用各种 python-to-javascript 转换器来将后端逻辑转换为可以直接与 PhoneGap 一起使用的东西,但是考虑到我拥有的所有 python 逻辑,这种方法变得非常困难——其中一些只是不那么容易转换。

你知道在同一个应用程序中显示 html 和运行 python 逻辑的应用程序吗?

python browser mobile android ios

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

numpy数组:快速填充和提取数据

请参阅此问题底部的重要说明.

我正在使用numpy来加速经度/纬度坐标的处理.不幸的是,我的numpy"优化"使我的代码运行速度比没有使用numpy时运行的速度快5倍.

瓶颈似乎是用我的数据填充numpy数组,然后在完成数学转换后提取出数据.为了填充数组,我基本上有一个循环:

point_list = GetMyPoints() # returns a long list of ( lon, lat ) coordinate pairs
n = len( point_list )
point_buffer = numpy.empty( ( n, 2 ), numpy.float32 )

for point_index in xrange( 0, n ):
    point_buffer[ point_index ] = point_list[ point_index ]
Run Code Online (Sandbox Code Playgroud)

那个循环,只是在操作它之前填充numpy数组,非常慢,比整个计算没有numpy慢得多.(也就是说,它不仅仅是python循环本身的缓慢,而且实际上将每个小块数据从python转移到numpy显然是一些巨大的开销.)另一端有类似的缓慢; 在我处理了numpy数组之后,我再次访问循环中的每个修改过的坐标对

some_python_tuple = point_buffer[ index ]
Run Code Online (Sandbox Code Playgroud)

再次将数据拉出的循环比没有numpy的整个原始计算要慢得多.那么,我如何实际填充numpy数组并从numpy数组中提取数据的方式不会破坏首先使用numpy的目的?

我正在使用C库从形状文件中读取数据,该库将数据作为常规python列表提供给我.据我所知,如果图书馆将坐标传递给一个numpy数组,那么就不会"填充"必要的numpy数组.但不幸的是,数据的起点是常规的python列表.更重要的是,一般来说,我想了解如何使用python中的数据快速填充numpy数组.

澄清

上面显示的循环实际上过于简单了.我在这个问题中就是这样写的,因为我想专注于我试图在循环中慢慢填充numpy数组的问题.我现在明白这样做很慢.

在我的实际应用中,我所拥有的是坐标点的形状文件,我有一个API来检索给定对象的点.有200,000个对象.所以我反复调用一个函数GetShapeCoords( i )来获取对象i的坐标.这将返回一个列表列表,其中每个子列表是lon/lat对的列表,并且它是列表列表的原因是某些对象是多部分的(即多边形).然后,在我的原始代码中,当我读入每个对象的点时,我通过调用常规python函数对每个点进行转换,然后使用PIL绘制转换后的点.整个过程花了大约20秒来绘制所有200,000个多边形.并不可怕,但还有很大的提升空间.我注意到这20秒中至少有一半用于转换逻辑,所以我想我会在numpy中做到这一点.我最初的实现只是一次读取一个对象,并继续将子列表中的所有点附加到一个大的numpy数组中,然后我可以在numpy中进行数学运算.

所以,我现在明白,简单地将整个python列表传递给numpy是设置大数组的正确方法.但在我的情况下,我一次只读一个对象.所以我能做的一件事就是在一个列表列表的大蟒蛇列表中继续追加点.然后当我以这种方式编译大量对象的点(比如10000个对象)时,我可以简单地将该怪物列表分配给numpy.

所以现在我的问题是三个部分:

(a)numpy是否可以采用那些大的,形状不规则的列表清单,并且可以快速地将其剔除?

(b)然后我希望能够转换那棵怪物树的叶子中的所有点.例如,"进入每个子列表,然后进入每个子子列表,然后对于在这些子列表中找到的每个坐标对,将第一个(lon坐标)乘以0.5",表达式是什么?我能这样做吗?

(c)最后,我需要将这些变换的坐标取回以绘制它们.

Winston在下面的回答似乎暗示了我如何使用itertools完成所有这些工作.我想要做的就像温斯顿所做的那样,将列表弄平.但我不能完全把它弄平.当我去绘制数据时,我需要能够知道一个多边形停止和下一个多边形何时开始.所以,我认为如果有一种方法可以快速标记每个多边形(即每个子子列表)的末尾,并使用特殊的坐标对(如(-1000,-1000)或类似的东西),我可以使它工作.然后我可以像在温斯顿的回答中那样使用itertools压扁,然后在numpy中进行变换.然后我需要实际使用PIL从点到点绘制,在这里我想我需要将修改后的numpy数组重新分配回python列表,然后在常规python循环中遍历该列表以进行绘制.这似乎是我最好的选择,只是编写一个C模块,只需一步即可处理所有的阅读和绘图?

python arrays performance numpy loading

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

如何让opengl mipmaps更清晰?

我正在重写一个基于opengl的gis/mapping程序.除此之外,该程序还允许您加载航海图的光栅图像,将它们固定为lon/lat坐标,并缩放和平移它们.

该程序的先前版本使用自定义平铺系统,其实质上它以256x256像素平铺的形式手动创建原始图像的mipmap,具有不同的两个功率的缩放级别.使用简单的四点平均算法,从缩放级别n的四个区块构造用于缩放级别n-1的区块.因此,它关闭了opengl mipmapping,相反,当需要在某个缩放级别绘制图表的某些部分时,它会使用最接近匹配缩放级别的切片(即,切片的功率为2倍)级别,但程序允许任意缩放级别),然后缩放切片以匹配实际缩放级别.当然,它必须在各个级别管理所有这些磁贴的缓存.

在我看来,这个平铺系统过于复杂.看起来我应该能够让图形硬件为我完成所有这些mipmapping工作.所以在新程序中,当我在图像中读取时,我将其切割成每个1024x1024像素的纹理.然后我将每个纹理固定到它的lon/lat坐标,然后我让opengl处理其余部分,同时缩放和平移.

它有效,但问题是:我的结果比原始程序有点模糊,这对于这个应用程序很重要,因为你希望能够尽可能早地在图表上阅读文本,缩放.所以它看起来像原始程序使用的简单平均四点算法在清晰度方面比opengl +我的GPU提供更好的结果.

我知道有几个glTexParameter设置来控制mipmaps如何工作的某些方面.我尝试了GL_TEXTURE_MAX_LEVEL(从0到10的任何地方)的各种组合以及GL_TEXTURE_MIN_FILTER的各种设置.当我将GL_TEXTURE_MAX_LEVEL设置为0(没有mipmap)时,我肯定会得到"锐利"的结果,但它们尖锐了,因为像素只是在这里和那里被丢弃,所以这些数字在中间缩放时是不可读的.当我将GL_TEXTURE_MAX_LEVEL设置为更高的值时,当您缩放到远处时(例如,当整个图表适合屏幕时),图像看起来非常好,但是当您放大到中间缩放时,您会注意到模糊,特别是在查看时图表上的文字.(也就是说,如果不是文本你可能会认为"哇,opengl在平滑地缩放我的图像方面做得很好."但是你会想到"为什么这张图表没有焦点?")

我的理解是,基本上你告诉opengl生成mipmap,然后在放大时选择要使用的相应mipmap,并且在两个最接近的mipmap级别之间进行插值有一些有限的选项,并使用最接近的像素或平均附近的像素.但是,正如我所说,这些组合似乎都没有给出相同的结果,在图表上的相同缩放级别(即缩放级别,文本很小但不是微小的,就像相当于"7点"或" 8点"大小",与之前的基于图块的版本一样.

我的结论是opengl创建的mipmaps比以前使用平均四点算法创建的mipmap简单,并且没有选择正确的mipmap或LINEAR vs NEAREST将获得我需要的清晰度.

具体问题:

(1)与原始程序中的平均四点算法相比,opengl实际上制作模糊mipmap似乎是正确的吗?

(2)在使用glTexParameter时,我是否可能忽略了一些东西,使用opengl制作的mipmaps可以提供更清晰的结果?

(3)我是否有办法让opengl首先制作更清晰的mipmap,例如使用"立方"滤镜或以其他方式控制mipmap创建过程?或者就此而言,似乎我可以使用相同的平均四点代码来手动生成mipmap并将它们移交给opengl.但我不知道该怎么做......

opengl gis blurry mipmaps

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

如何使用javascript上传文件?

我想用js创建一个上传器。谁能帮助我如何使用javascript上传文件?

javascript upload file-upload uploader

4
推荐指数
2
解决办法
3万
查看次数

iOS应用内购买:确认不需要使用restoreCompletedTransactions

在iOS上通过应用程序内购买销售非消耗品时,restoreCompletedTransactions提供的方法是您可以检索用户过去所做的所有购买,据我所知,这是为了让用户快速访问恢复购买,例如当他们获得新设备时.

据我所知,如果您要打电话,restoreCompletedTransactions有一个问题是当用户按下按钮时是自动还是手动调用(例如,请参见此处).

我的问题是,是否有必要打电话restoreCompletedTransactions.如果我的应用程序只有一两件要销售/解锁的东西,那么让用户通过标准购买用户界面似乎是可以接受的,只要有一条说明解释说如果购买他们的东西将不会再次向用户收费已经购买.所以,假设用户在新设备上安装我的游戏.在他们的旧设备上,他们已经购买/解锁了X级.当他们到达新设备上的Level X时,它会询问他们是否想要购买它(如果他们以前购买它们将被解释他们不会被收取两次费用),并且他们说是,他们现在在他们的新设备上有X级,他们只收取一次费用(当他们在旧设备上购买时).

就苹果的批准而言,这是一种处理它的犹太方式吗?我可以看到,如果他们已经购买了100件单独的物品,那么给他们一次恢复所有物品会很好.但是,如果整个应用程序只有一两个解锁,那么我的无法restoreCompletedTransactions接受吗?

in-app-purchase ios

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

Winforms,通过表单名称获取表单实例

我需要一个方法,通过表单的名称返回一个新的表单实例.这是我到目前为止:

    public Form GetFormByName(string frmname)
    {
        return Assembly.GetExecutingAssembly().GetTypes().Where(a => a.BaseType == typeof(Form) && 
            a.Name == frmname).Cast<Form>().FirstOrDefault();
    }
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试执行此代码时,我收到以下错误:

无法将类型为"System.RuntimeType"的对象强制转换为"System.Windows.Forms.Form".

这个错误是什么意思?

c# winforms

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

Node 生成的子进程何时真正启动?

Node 的 Child Process spawn()function的文档以及我在其他地方看到的示例中,模式是调用该spawn()函数,然后返回的对象上设置一堆处理程序ChildProcess。例如,这是spawn()该文档页面上给出的第一个示例:

const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/usr']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

ls.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});
Run Code Online (Sandbox Code Playgroud)

spawn()函数本身在第二行调用。我的理解是spawn()异步启动子进程。从文档中:

child_process.spawn() 方法使用给定命令生成一个新进程,并在 args 中使用命令行参数。

然而,上面脚本的以下几行继续为该进程设置各种处理程序,因此假设在spawn()第 2 行调用时间和其他事情发生之间该进程尚未实际启动(并且可能完成)随后的几行。我知道 JavaScript/Node 是单线程的。然而,操作系统不是单线程的,天真地人们会认为该spawn()调用是告诉操作系统立即生成进程(此时,不幸的是,操作系统可能会挂起父 Node 进程并运行/完成执行下一行 Node 代码之前的子进程)。

但一定是在当前 JavaScript 函数完成(或者更一般地说,调用当前函数的当前 JavaScript 事件处理程序完成)之前,该进程实际上不会生成,对吧? …

asynchronous spawn node.js

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