为了通过Java了解同步,我只是搞乱一些简单的事情,比如创建线程之间共享的计数器.
我遇到的问题是我无法弄清楚如何在100%的时间内依次打印计数器.
int counterValue = this.counter.incrementAndGet();
System.out.println(this.threadName + ": " + counterValue);
Run Code Online (Sandbox Code Playgroud)
上面增加AtomicInteger counter,获取新值,并将其打印到由负责该更新的线程名称标识的控制台.当incrementAndGet()打印当前线程的更新值之前,该方法似乎导致JVM上下文切换到另一个线程以进行更新时,会出现问题.这意味着在线程返回执行状态之前,该值会增加但不会打印.在查看此示例输出时,这很明显:
Thread 3: 4034
Thread 3: 4035
Thread 3: 4036
Thread 1: 3944
Thread 1: 4037
Thread 1: 4039
Thread 1: 4040
Thread 2: 3863
Thread 1: 4041
Thread 1: 4043
Run Code Online (Sandbox Code Playgroud)
您可以看到,当执行返回到线程1时,它会打印其值并继续更新.线程2也是如此.
我有一种感觉,我错过了一些非常明显的东西.
我有一个实现ICollidable接口的实体列表.此接口用于解决实体之间的冲突.因此我的实体是:
在每次游戏更新(大约60 t/s)时,我正在清除列表并根据游戏状态添加当前实体.我通过以下方式完成此任务:
collidableEntities.Clear();
collidableEntities.AddRange(players);
collidableEntities.AddRange(enemies);
collidableEntities.AddRange(projectiles);
collidableEntities.AddRange(items);
collidableEntities.AddRange(camera.VisibleTiles);
Run Code Online (Sandbox Code Playgroud)
一切正常,直到我将可见的瓷砖添加到列表中.运行游戏循环的前1-2秒会导致可见的打嗝延迟绘制(因此我可以看到渲染中的抖动).我可以逐字地删除/添加添加切片的行,看看是否发生抖动,所以我将其缩小到该行.
我的问题是,为什么?VisibleTiles列表大约有450-500个磁贴,因此实际上并没有那么多数据.每个图块包含Texture2D(图像)和Vector2(位置),以确定渲染的内容和位置.我要继续寻找,但是从我的头顶,我无法理解为什么只有前1-2秒打嗝然后从那里开始顺利.
任何建议表示赞赏.
更新
我已经尝试将初始容量增加到大约元素量,但没有观察到差异.
更新
根据要求,这是camera.VisibleTiles的代码
public List<Tile>
{
get { return this.visibleTiles; }
}
Run Code Online (Sandbox Code Playgroud) 我正在应用EntranceThemeTransition动画TextBlock.该TextBlock具有的风格PageHeaderTextStyle具有RenderTransform它.我遇到的问题是,在动画完成播放之前,RenderTransform应用的Translation效果实际上不会呈现.因此,它看起来很奇怪,因为动画会滚动控件,然后突然翻译将文本捕捉到位.有谁知道为什么会这样?
有没有办法在考虑翻译的情况下播放动画?
转变:
<Setter Property="RenderTransform">
<Setter.Value>
<TranslateTransform X="-2" Y="8"/>
</Setter.Value>
</Setter>
Run Code Online (Sandbox Code Playgroud)
TextBlock的:
<TextBlock x:Name="pageTitle" Grid.Column="1" Text="{Binding Title}" Style="{StaticResource PageHeaderTextStyle}">
<TextBlock.Transitions>
<TransitionCollection>
<EntranceThemeTransition/>
</TransitionCollection>
</TextBlock.Transitions>
</TextBlock>
Run Code Online (Sandbox Code Playgroud) xaml microsoft-metro windows-8 windows-runtime windows-store-apps
我有子弹:
public LaserBullets : Projectile
Run Code Online (Sandbox Code Playgroud)
我有一把枪,它继承了一种基本武器,子弹类型与衍生枪一起:
public LaserWeapon : Weapon<LaserBullets>
Run Code Online (Sandbox Code Playgroud)
我有一个属性来建立一个玩家的当前武器:
public Weapon<Projectile> CurrentWeapon
{
set { currentWeapon = value; }
}
Run Code Online (Sandbox Code Playgroud)
这失败了(不能隐式地转换LaserWeapon为Weapon<Projectile>)
player.CurrentWeapon = new LaserWeapon();
Run Code Online (Sandbox Code Playgroud)
我已经读到C#中没有对某些协方差的支持,但我不想认为我被困在这里.有没有办法让我的情况有效?我正在尝试在玩家类中维护一个基础武器,但在另一个类中使用更具体的武器.
我尝试为LaserWeapon创建自己的强制转换操作符,但是我收到了一个关于无法强制转换为基类的错误.
我已经阅读了Shawn Harvgreave关于自动序列化的博客文章和关于内容管道概述的MSDN文章,但我找不到支持的类型列表.
引用MSDN:
从XNA Game Studio 3.1开始,对于没有现有内容类型编写器的简单类型,自动完成自定义数据到.XNB格式的序列化.
直到我试图用我还没有这个问题,Queue从System.Collections.Generic我猜是不是由自动序列化的支持.
那么,是否有一个支持的类型列表?而如果不支持的话,会我需要写我自己的ContentTypeWriter和ContentTypeReader?
我正在玩Azure Worker Roles.调用异步WinRT方法并使用await关键字时,服务执行结束.我猜这是因为await返回控制权给调用者,这是服务内部的链接.也许调用者在Run()完成执行并假定服务已完成或出现故障之前不期望返回控制权?
我不确定,是否有人知道是否async打算与Azure Worker Roles一起使用?
我正在使用:
这是我的Web应用程序项目中的context.xml和web.xml结构:
当我为我的应用程序生成WAR文件时,context.xml将按预期打包。当我将WAR文件复制到Tomcat webapps文件夹并启动Tomcat时,将提取WAR文件并将context.xml复制到\conf\Catalina\localhost\<webappname>.xml预期的位置。但是,这仅在<webappname>.xml尚不存在时才起作用。因此,如果不先删除现有,就无法更新context.xml,打包WAR和重新部署<webappname>.xml。我知道这是基于阅读文档所预期的功能。
我的问题是,我该怎么办?如何更新context.xml并自动复制这些更新,就像它们是全新的一样?我不想<webappname>.xml在每次发布之前都删除它。
也许我会以错误的方式进行操作?